# ebb-ai (npm · @ebb-ai/mcp)

Runs non-urgent LLM tasks at the cleanest grid hour before a deadline, via Batch APIs when allowed.

- Trust score: 63/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-17

## Components

- npm · `@ebb-ai/mcp`: 63/100 (this document), [markdown](https://verifymcp.io/servers/vitalini-ebb-ai/ebb-ai-mcp.md), [page](https://verifymcp.io/servers/vitalini-ebb-ai/ebb-ai-mcp)

## Channel facts

- Registry: `npm`
- Package: `@ebb-ai/mcp`
- Version: `0.17.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-17.

- **Supply Chain Security**: 97/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 53 of 129 dependencies flagged as unhealthy (2 deprecated).
- **Provenance & Transparency**: 16/100
  - Repository check failed: the declared repository URL redirects; it must resolve directly.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Maintenance check failed: the publisher has marked this version as deprecated on the registry, telling users to stop installing it.
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 67/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2732 tokens (~273/item across 10 items; 10 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 10 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the ebb-ai MCP server?

ebb-ai runs locally as an npm package, launched with npx -y @ebb-ai/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add vitalini-ebb-ai -- npx -y @ebb-ai/mcp
```

### Cursor

```json
{
  "mcpServers": {
    "vitalini-ebb-ai": {
      "command": "npx",
      "args": [
        "-y",
        "@ebb-ai/mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "vitalini-ebb-ai": {
      "command": "npx",
      "args": [
        "-y",
        "@ebb-ai/mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add vitalini-ebb-ai -- npx -y @ebb-ai/mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vitalini-ebb-ai": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@ebb-ai/mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add vitalini-ebb-ai --command npx --arg -y --arg @ebb-ai/mcp
```

### Hermes

```yaml
mcp_servers:
  vitalini-ebb-ai:
    command: "npx"
    args: ["-y", "@ebb-ai/mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "vitalini-ebb-ai": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@ebb-ai/mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add vitalini-ebb-ai -t stdio -c npx -a -y @ebb-ai/mcp
```

### Other

```json
{
  "mcpServers": {
    "vitalini-ebb-ai": {
      "command": "npx",
      "args": [
        "-y",
        "@ebb-ai/mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-17 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 0 to 3. That category is still filling its 30-day observation window: 0 days of observed history at the previous scan, 1 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-16 (score 62)

First indexed and scored.

## MCP tools (10)

### `get_grid_forecast` (~163 tokens)

Return the projected electricity-grid carbon intensity for a region, hour by hour. Use this when deciding whether to run an expensive AI task now or defer it — intensity is reported in grams CO2-equivalent per kWh with a categorical band (very_clean / clean / average / dirty / very_dirty). Read-only; does not touch the task queue.

Input parameters:

- `hours` (integer): Forecast horizon in hours (1-72). Defaults to 24.
- `region` (string, required): Electricity Maps grid zone code (e.g. 'US-CAL-CISO', 'US-TEX-ERCO', 'GB', 'FR', 'DE'). On hosts that allow omitting it, defaults to the configured region, else a host-timezone guess, else GB.

### `recommend_window` (~498 tokens)

Return the optimal carbon-aware execution window for a task WITHOUT scheduling it. Use this for non-committal planning — to see when the cleanest grid moment falls inside the deadline (and the savings vs running now) before deciding whether to commit via schedule_task. Returns the chosen window, top alternatives, a batch_eligible flag, the grid_source (which feed produced the forecast — 'mock' means synthetic data), and a one-line reasoning string. Read-only; does not touch the task queue.

Input parameters:

- `candidates` (array): Optional cross-provider routing candidates: 'provider:model' strings (e.g. ['anthropic:claude-haiku-4-5','openai:gpt-6-luna','ollama:llama-3-1-8b']) the caller EXPLICITLY allows. With >= 2 entries th…
- `carbon_budget_g` (number): Optional hard cap on estimated grams CO2-equivalent for this task. Windows above the cap are dropped before the cleanest is chosen; if none inside the deadline meets the cap the task fails rather tha…
- `deadline` (string, required): ISO-8601 timestamp (e.g. '2026-05-13T08:00:00-04:00') by which the task must have completed. Must be in the future. Required.
- `model` (string): Optional vendor model name (e.g. 'claude-sonnet-5'). Affects the reasoning string only.
- `region` (string, required): Electricity Maps grid zone code (e.g. 'US-CAL-CISO', 'FR') the recommendation reasons over. On hosts that allow omitting it, defaults to the configured region, else a host-timezone guess, else GB.
- `route_weights` (object): Optional routing weights {carbon, cost, latency}, non-negative and normalized internally. Default {carbon:0.6, cost:0.3, latency:0.1}. Only used when 'candidates' has >= 2 entries.

### `schedule_task` (~1354 tokens)

Queue an AI task to run during off-peak hours inside the given deadline. Three parallel wins: (1) lighter on the electricity grid — deferring non-urgent tasks smooths projected AI compute demand; (2) 50% of sync list price (projected) — auto-routes through Anthropic/OpenAI Batch APIs when the deadline allows; (3) lower carbon — dispatch at the cleanest electricity-grid hour. Invoke this tool whenever the user phrases a request with deferral language: "do this later", "by tomorrow", "tonight", "overnight", "by EOD", "sometime this week", "when you have a moment", "remind me to", "queue this up", "schedule this", "no rush", "not urgent". Convert the user's wording to an ISO-8601 deadline and pass the task as the prompt. Returns a task_id you can later check with check_queue_status. Good fits: nightly digests, batch summaries, research sweeps, evaluator runs, multi-step report generation — anything the user is fine waiting on. Do NOT use for live chat, interactive code edits, or any task the user is actively waiting to see complete.

Input parameters:

- `candidates` (array): Optional cross-provider routing candidates: 'provider:model' strings (e.g. ['anthropic:claude-haiku-4-5','openai:gpt-6-luna','ollama:llama-3-1-8b']) the caller EXPLICITLY allows. With >= 2 entries th…
- `carbon_budget_g` (number): Optional hard cap on estimated grams CO2-equivalent for this task. Windows above the cap are dropped before the cleanest is chosen; if none inside the deadline meets the cap the task fails rather tha…
- `deadline` (string): ISO-8601 timestamp (e.g. '2026-05-13T08:00:00-04:00') by which the task must have completed. Must be in the future. Required unless deadline_kind is 'quota_reset', in which case it is ignored.
- `deadline_kind` (string): How the deadline is chosen. 'absolute' (default): use 'deadline'. 'quota_reset': run before the next weekly subscription-quota reset, minus a safety margin, as configured in ~/.ebb-ai/config (EBB_QUO…
- `dispatch` (boolean): If true (default), persist a provider_call task body that `ebb tick` (CLI) or scheduler.tick (library) can dispatch. Set to false only to enqueue a placeholder prompt without a dispatchable body (leg…
- `dry_run` (boolean): If true, return the planned dispatch (recommended window + carbon estimate) WITHOUT persisting anything. Useful for confirmation flows.
- `model` (string): Model to dispatch with (e.g. 'claude-sonnet-5' for Anthropic, 'gpt-6-sol' for OpenAI). Defaults per provider: anthropic 'claude-sonnet-5' (EBB_DEFAULT_MODEL overrides it), openai 'gpt-6-sol', gemini…
- `origin_session_id` (string): Claude Code session id of the conversation that queued the task, so the task detail can show `claude --resume <id>`. Pass it only when the host substitutes it (e.g. ${CLAUDE_SESSION_ID} in a slash co…
- `output_path` (string): Optional absolute file path. When the task completes, ebb-ai writes { taskId, result, receipt } as JSON to this path.
- `prompt` (string, required): The prompt or task description to dispatch when the chosen window arrives.
- `provider` (string): Which provider to dispatch this task through: 'anthropic', 'openai', 'gemini', or 'ollama' (local). Defaults to 'anthropic'. 'anthropic' and 'openai' can auto-route through a 50%-cheaper Batch API wh…
- `quota_provider` (string): Quota label for deadline_kind 'quota_reset' (e.g. 'claude', 'codex'). Optional when exactly one label is configured.
- `redact_in_receipt` (array): Optional regex patterns to strip from the prompt before storing it on the receipt. Omit to use the default redaction of API-key-looking strings.
- `region` (string): Grid-region override (Electricity Maps zone code such as 'US-CAL-CISO'). Defaults to the host's configured region, else a host-timezone guess, else GB.
- `repeat` (string): Repeat rule. Defaults to 'none' (a one-off), also for deadline_kind 'quota_reset'; pass 'weekly' (or 'daily') to repeat. 'quota_reset' follows the weekly quota reset and needs deadline_kind 'quota_re…
- `route_weights` (object): Optional routing weights {carbon, cost, latency}, non-negative and normalized internally. Default {carbon:0.6, cost:0.3, latency:0.1}. Only used when 'candidates' has >= 2 entries.
- `title` (string): Optional short title for the task (shown in queue lists). Defaults to the first line of the prompt, cut to 80 characters. API-key-looking strings are redacted.

### `check_queue_status` (~117 tokens)

Report on the ebb-ai task queue. With no arguments, returns a summary of all known tasks (including tasks persisted by previous sessions — the queue survives host restarts). With task_id, returns full detail for one task, including its title, prompt, result and any carbon receipt (estimated vs actual grams, grid_source, energy_source); viewing a completed or failed task marks it read. Never changes a task's status.

Input parameters:

- `task_id` (string): If present, return only this task. If omitted, return a queue summary.

### `cancel_task` (~117 tokens)

Cancel a queued or scheduled task. Idempotent — if the task is already completed/failed/cancelled this returns the existing status without error. Throws only if task_id is unknown. Cancelling one occurrence of a repeating task skips it and queues the next one; pass series=true to end the series.

Input parameters:

- `series` (boolean): If true and the task repeats, also end its series: no further occurrence is queued. Default false (skip only this occurrence).
- `task_id` (string, required): The id of the task to cancel.

### `expedite_task` (~93 tokens)

Dispatch a queued or scheduled provider-call task immediately, bypassing the scheduler's chosen carbon window. The resulting receipt records intensitySource='expedited'. Only provider-call tasks still queued/scheduled can be expedited; running, submitted (awaiting Batch API results), or terminal (completed/failed/cancelled) tasks are rejected with an explanatory error.

Input parameters:

- `task_id` (string, required): The id of the task to dispatch now.

### `update_deadline` (~93 tokens)

Re-score and reschedule a queued or scheduled task against a new deadline; the scheduler re-picks the cleanest window inside it. Throws if the task is already running or terminal, or if the new deadline is invalid or in the past.

Input parameters:

- `deadline` (string, required): New ISO-8601 deadline. Must be in the future.
- `task_id` (string, required): The id of the task to reschedule.

### `reply_task` (~141 tokens)

Continue a completed task's conversation: creates a NEW task that sends the earlier prompt, the model's reply and this text to the same provider and model, and runs at the next clean window before its deadline (default one hour). Costs one provider call. Only completed tasks accept a reply; failed or cancelled tasks are rejected. Returns the new task id and its scheduled time.

Input parameters:

- `deadline` (string): Optional ISO-8601 deadline for the reply. Defaults to one hour from now.
- `task_id` (string, required): The id of the completed task to reply to.
- `text` (string, required): The follow-up message (1 to 32000 characters).

### `retry_task` (~73 tokens)

Re-dispatch a failed provider-call task. Only valid when the task's current status is 'failed' — queued/scheduled/running/submitted/completed tasks are rejected with an explanatory error. The new run's receipt overwrites the old.

Input parameters:

- `task_id` (string, required): The id of the failed task to retry.

### `cancel_all` (~83 tokens)

Bulk-cancel every task in the queue that is still cancellable (status queued or scheduled). Running/completed/failed/cancelled tasks are left untouched. Optionally filter by status. Returns the number of tasks cancelled.

Input parameters:

- `status` (string): Optional. If set, cancel only tasks in this status. Valid: 'queued', 'scheduled'. Defaults to both.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/vitalini-ebb-ai/ebb-ai-mcp#diagnostics

## Score history

- 2026-10-17: 63
- 2026-10-16: 62

## Common questions

### What is the ebb-ai MCP server?

ebb-ai is an MCP server listed in the public MCP registry as io.github.Vitalini/ebb-ai. Runs non-urgent LLM tasks at the cleanest grid hour before a deadline, via Batch APIs when allowed. This page covers its npm package (@ebb-ai/mcp).

### Is the ebb-ai MCP server safe to use?

ebb-ai scores 63 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 17 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the ebb-ai MCP server expose?

ebb-ai exposes 10 tools: get_grid_forecast, recommend_window, schedule_task, check_queue_status, cancel_task, and 5 more. Their descriptions and schemas cost roughly 2,732 tokens of context every time the server is loaded.

### Is the ebb-ai MCP server still maintained?

ebb-ai is still listed as active in the MCP registry. We last reached this channel on 17 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the ebb-ai MCP server under?

ebb-ai declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/@ebb-ai/mcp
- Socket report: https://socket.dev/npm/package/@ebb-ai/mcp
- Website: https://www.ebb-ai.com/
- Changelog RSS feed: https://verifymcp.io/servers/vitalini-ebb-ai/ebb-ai-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/vitalini-ebb-ai/ebb-ai-mcp.json
- HTML version of this page: https://verifymcp.io/servers/vitalini-ebb-ai/ebb-ai-mcp
