ebb-ai
This MCP server lets agents plan, schedule, and manage carbon-aware deferred LLM tasks across grid regions while exposing read-only forecasts and queue controls.
Get hour-by-hour projected grid carbon intensity for a region (1–72h horizon) via
get_grid_forecast.Plan the optimal low-carbon execution window for a task deadline without committing, including savings, alternatives, batch eligibility, and grid source via
recommend_window.Queue an AI task to run off-peak inside a deadline (
schedule_task), optionally dry-run, choose provider/model, set carbon budget, redact receipt, write JSON output, and route across allowed provider:model candidates with carbon/cost/latency weights.Inspect queue status: summary of all tasks or full detail/receipt for one task (
check_queue_status).Cancel a specific task (
cancel_task) or bulk-cancel queued/scheduled tasks (cancel_all).Expedite a queued/scheduled provider-call task immediately (
expedite_task).Reschedule a task by updating its deadline and re-scoring the cleanest window (
update_deadline).Retry a failed provider-call task, overwriting its old receipt (
retry_task).
Integrates with the UK National Grid ESO Carbon Intensity API to provide real-time and forecast carbon intensity data for grid regions.
Allows deferring LLM tasks to OpenAI's Batch API for cost and carbon savings, with auditable receipts.
ebb-ai
Workload scheduling for the agentic-AI economy.
Defer non-urgent LLM tasks to cheap, low-load grid windows. ~50%
cheaper inference via Batch APIs (projected, provider list price),
smoother data-center load curves, auditable carbon receipts.
MCP-native, ships as an npm package and a one-command Claude Code
plugin.
Why defer non-urgent AI work?
US data centers are projected to consume 6.7–12% of national electricity
grid load by 2028 (DOE 2024), driven primarily by AI compute.
Most agent workload that lands on that load is deferrable (overnight
summaries, batch analyses, scheduled compliance scans, multi-step
report generation) — agent code just dispatches it synchronously by
default. ebb-ai makes the choice automatic. Four parallel wins:
Lighter on the grid. Spreads load away from peak hours, which is what ISOs and grid operators want from large compute users.
50% cheaper (projected, Batch API list price). Auto-routes through Anthropic and OpenAI Batch APIs (24-hour SLA) when the deadline allows. Same prompt, half the bill.
Faster at off-peak. Anthropic explicitly expanded off-peak capacity in 2026 (rate-limit policy) — doubled usage limits outside peak hours, citing smoothed demand. Sync calls observe shorter queues.
Lower carbon. Dispatch lands in the cleanest grid hour inside the deadline; the saving depends on region and day (see docs/claims.md). Per-task carbon receipts against the actual grid intensity used at dispatch, persisted to a local SQLite ledger. Auditable, region-aware, reproducible. v0.10+ uses per-model Wh/token coefficients (Patterson 2021, Luccioni 2024, Hugging Face AI Energy Score) so receipts reflect what the agent actually ran — not a flat placeholder. v0.11+ signs every receipt with Ed25519 so consumers can verify them offline via
ebb verify(B2B ESG export path).
ebb-ai is the same code that would have fired a sync LLM call —
now deferred to the cleanest, cheapest, fastest hour inside the
deadline. Apache-2.0.
A real run, excerpted (GB, 2026-09-30T21:03:30Z, live National Grid ESO
feed, local Ollama llama3.2:1b; raw output and reproducer in
docs/examples/2026-09-30-GB-tick/):
$ bash docs/examples/2026-09-30-GB-tick/command.sh
forecast source: ukCarbonIntensity (forecast)
forecast now: 2026-09-30T21:00:00.000Z 158 gCO2/kWh
forecast peak: 2026-10-01T17:00:00.000Z 183 gCO2/kWh
recommendWindow({ region: "GB", model: "llama3.2:1b", ... }):
"scheduledFor": "2026-10-02T09:00:00.000Z",
"intensityGCo2PerKwh": 88,
"band": "very_clean",
$ ebb tick --db <temp> --region GB
tick: 1 inspected, 1 dispatched, 0 failed
$ ebb verify t-ef2354ee-eff0-431c-b11e-6edfcb8299b0 --db <temp>
✓ VALID
intensity_g_kwh 158
grid_source ukCarbonIntensity
signer_public_key tTpsWuAS52easY0sgqz5E42aen7tdE5otdfLN6F+kxg=UTC hour | Carbon intensity | |
Forecast peak | 2026-10-01T17:00 | 183 gCO2/kWh |
Recommended window (72h deadline) | 2026-10-02T09:00 | 88 gCO2/kWh |
(forecast (projected), one GB run, 2026-09-30 — 88 vs 183 gCO2/kWh is ~52% lower for this run only; not a general or typical figure. The 158 gCO2/kWh the receipt records at dispatch is the measured value. See docs/claims.md.)
Price: not available for this run. ebb has no electricity-price feed, and its sync vs Batch list-price comparison needs at least two candidate models; this run used one unpriced local Ollama model.
recommendWindow() surfaces as an MCP tool to any compatible agent host
(Claude Desktop, Claude Code, Cursor, Cline, Continue, Zed,
Windsurf, OpenClaw, OpenAI Codex CLI, Pi). The agent asks
recommend_window, sees the plan, then commits via schedule_task
— or doesn't.
Status: v0.16.0 (this release) · 2026-10-01 · published on npm and PyPI ·
@ebb-ai/{core,mcp,cli}on npm under the@ebb-aiorg;ebb-aion PyPI;@vitalini/ebbOpenClaw plugin on ClawHub (openclaw plugins install clawhub:@vitalini/ebb), not npm, and shares the queue. One-command Claude Code plugin via/plugin marketplace add Vitalini/ebb-ai && /plugin install ebb-ai. Five real-data grid feeds across 31 regions (NA/EU/APAC) — measured against the code, see docs/claims.md: UK National Grid ESO Carbon Intensity API (GB, free no key), US EIA Open Data (CAISO / ERCOT / ISO-NE / PJM, free with key), ENTSO-E Transparency Platform (FR / DE / ES / IT / NL / …, free with token), WattTime v3 marginal-emissions forecasts (US ISOs, free with account — takes precedence over EIA where covered), and Electricity Maps as universal fallback. v0.10: per-model Wh/token coefficients across 59 LLMs (measured, count grows with each catalogue refresh; Patterson 2021, Luccioni 2024, HF AI Energy Score) replace the v0.1–v0.9 flat placeholder. v0.11: Ed25519-signed carbon receipts (offline verifiable viaebb verify) plus WAL multi-writer SQLite soebb tickand the MCP server can share~/.ebb-ai/queue.db. v0.12 ("trust repairs"): Batch API routing is real — deferrable tasks (deadline > 24h) are submitted to the provider's Batch API and polled to completion (submittedstatus), instead of the previous dead-code gate; receipts record grid-data provenance (intensity, feed source — synthetic mock is disclosed, not silently signed) and the energy-coefficient confidence tier; Python- and TS-signed receipts verify in either language (one canonical signing form, JCS numbers); daemons installed byebb installactually dispatch (real node/script paths,~/.config/ebb/envsecrets); hardened ledger (0600, redactedbody_json); honest feed labeling (forecast vs persistence). Anthropic + OpenAI Batch adapters, Python port at parity, live dashboard,recommend_windowplanning endpoint, always-onebb tickCLI with macOS launchd + Linux systemd + pmset/rtcwake wake events, full control surface (cancel_task/expedite_task/update_deadline/retry_task/cancel_all), receipt redaction, file output, retry-with-backoff. 1,115 tests passing (650 TS + 465 Python, measured on this branch 2026-09-30) across 5 packages and 2 languages. See QUICKSTART.md.
Live demo
Or visit the maintainer-hosted dashboard at ebb-ai.com to see live grid-load and carbon-intensity forecasts across 31 grid regions (NA / EU / APAC — CAISO, ERCOT, ISO-NE, PJM, Great Britain, France, Germany, and more) and to try the best-window planner without installing anything. Great Britain is powered by the free National Grid ESO Carbon Intensity API (real data, no key required); US ISOs use WattTime v3 marginal-emissions forecasts when a WattTime account is configured (falling through to the EIA open-data feed otherwise), EU zones ENTSO-E, with Electricity Maps as the universal fallback and a clearly-labelled deterministic mock when no key is configured.
Related MCP server: LLM Usage & Cost Tracker
Why
AI inference is becoming a major load on US grid infrastructure. Data-center electricity demand has doubled since 2020 and is projected to keep rising as agentic workloads scale. But the same agent code that triggers this load dispatches it synchronously by default — even when the task is "summarize my inbox overnight" or "rewrite these 5,000 product descriptions by Friday." Three things follow:
Cost. Anthropic and OpenAI both offer Batch APIs at a flat 50% discount (projected, provider list price) for tasks that can wait up to 24 hours. Almost no agent code uses them, because the choice has to be made at the call site.
ebb-aimakes the choice automatic — and routes deadline-tolerant work through the cheaper path.Grid load. Data-center AI compute is concentrated in a few US regions (PJM Mid-Atlantic / Virginia, ERCOT Texas, CAISO California). Peak-hour AI workloads compete with hospitals, industrial users, and residential customers for capacity that is already constrained — Virginia regulators have flagged data-center load growth as a top-tier reliability concern. Time-shifting deferrable workloads to off-peak windows reduces the peak the grid has to plan for.
Carbon, as a measurable side effect. Grid carbon intensity swings substantially over a single day as generation mix shifts. The same dispatch decision that saves cost and smooths load also emits less CO₂.
ebb-aiwrites an auditable receipt for every dispatch — useful for ESG reporting, cost-accounting, and upcoming compute-disclosure regulations.
ebb-ai automates the choice for any task that is not "answer me
right now."
Components
Package | Purpose |
| TypeScript core library. |
| Model Context Protocol server. Drop-in for Claude Desktop, Claude Code, OpenClaw, Cursor. |
| Python 3.11+ port. |
| Next.js 15 website at https://www.ebb-ai.com — install picker (13 hosts), live carbon-intensity map, best-window planner, docs. |
| Claude Code plugin tree (8 |
| OpenClaw plugin ( |
| Upstream MCP spec proposal for |
Architecture

The MCP server is a thin stdio process the agent host (Claude Code,
Claude Desktop, Cursor, Cline, Zed, OpenClaw) spawns. It enqueues
work to a SQLite-backed queue at ~/.ebb-ai/queue.db; an off-process
ebb tick daemon (launchd / systemd / cron) reads scheduled rows
and dispatches them to the LLM provider at the chosen window. The
grid feed is a side-channel — the router picks per-zone between four
real-data sources before falling back to mock.

Quick start
See QUICKSTART.md — four steps, five minutes.
As a Claude Code plugin (one-command install)
claude plugin marketplace add Vitalini/ebb-ai
claude plugin install ebb-aiThat ships three slash commands (/ebb-ai:defer, /ebb-ai:check,
/ebb-ai:grid), a carbon-aware-coding skill, and auto-wires the
@ebb-ai/mcp MCP server. Full plugin reference: PLUGIN.md.
> /ebb-ai:defer "Summarize today's GitHub notifications" --by 4h
Deferred ✓ scheduled for 22:15 UTC (cleanest window inside the deadline)
> /ebb-ai:check
2 tasks queued · oldest in 1h · cleanest at 03:00 UTCFull command surface: /ebb-ai:{defer, plan, check, cancel, expedite, reschedule, retry, grid}. Tasks persist to ~/.ebb-ai/queue.db and
survive Claude Code restarts.
As an MCP server (Claude Desktop / Cursor / Cline / Zed)
npm install -g @ebb-ai/mcp # or run via npx -y @ebb-ai/mcpThen add to Claude Desktop's MCP config
(~/Library/Application Support/Claude/claude_desktop_config.json on
macOS):
{
"mcpServers": {
"ebb-ai": {
"command": "npx",
"args": ["-y", "@ebb-ai/mcp"],
"env": {
"EBB_ELECTRICITY_MAPS_API_KEY": "optional; falls back to mock data without it. GB is always live via the free UK Carbon Intensity API.",
"EBB_EIA_API_KEY": "optional; US ISO fuel-mix (average) intensity.",
"EBB_ENTSOE_SECURITY_TOKEN": "optional; EU zone intensity.",
"WATTTIME_USERNAME": "optional; with WATTTIME_PASSWORD, enables WattTime v3 marginal-emissions forecasts for US ISOs (takes precedence over EIA where covered).",
"WATTTIME_PASSWORD": "optional; pairs with WATTTIME_USERNAME."
}
}
}
}The MCP server exposes three tools to the agent:
get_grid_forecast(region, hours?)— returns the next N hours of carbon intensity for a grid region (e.g.US-CAL-CISO).schedule_task(prompt, deadline, model?, carbon_budget_g?)— queues a task for execution at the cleanest window inside the deadline.check_queue_status(task_id?)— lists pending tasks and any completed receipts.
As a library
import { defer } from "@ebb-ai/core";
const result = await defer(
() => anthropic.messages.create({ /* … */ }),
{
deadline: "2026-05-13T08:00:00-04:00",
carbonBudgetG: 5,
region: "US-CAL-CISO",
},
);With a provider adapter and the Batch API (v0.2)
import { Scheduler, AnthropicAdapter } from "@ebb-ai/core";
const scheduler = new Scheduler({ dbPath: "/var/lib/ebb/queue.sqlite" });
const adapter = new AnthropicAdapter();
await scheduler.defer(
() => adapter.dispatch("claude-sonnet-5", "Summarize today's git commits."),
{ deadline: "2026-05-13T08:00:00-04:00", region: "US-CAL-CISO" },
);
// or — submit 100 prompts via Anthropic Message Batches for a 50% discount:
const handle = await adapter.dispatchBatch("claude-sonnet-5", prompts);
console.log(handle.batchId);The SQLite-backed queue is opt-in via dbPath; without it the
scheduler runs in-memory as in v0.1. The Anthropic and OpenAI SDKs are
peer dependencies — install them only if you use the corresponding
adapter.
Python
pip install -e "packages/core-py[anthropic,openai]"import asyncio
from ebb_ai import defer
asyncio.run(defer(
lambda: do_work(),
deadline="2026-05-13T08:00:00-04:00",
carbon_budget_g=5,
region="US-CAL-CISO",
))Dashboard
pnpm --filter @ebb-ai/web dev
# → http://localhost:3000Pages: live carbon-intensity map (31 regions, NA/EU/APAC — measured, see docs/claims.md), 72-hour forecast charts, best-window planner, queue viewer.
Grid data sources (per zone, falls back to mock on failure):
Where do the keys go? The environment variables in the
Authcolumn configure the hosts — theebbCLI, the@ebb-ai/mcpserver, and this dashboard. Each host reads them at its own entry point and injects them into@ebb-ai/core, which is environment-pure and reads nothing ambient. The@vitalini/ebbOpenClaw plugin reads no environment variables at all: configure it underplugins.entries.ebb.configin your gateway config, usingeiaApiKey,entsoeSecurityToken,electricityMapsApiKey,wattTimeUsername/wattTimePassword(plusanthropicApiKey,openaiApiKey,geminiApiKey/googleApiKey,ollamaHost,ollamaModels,carbonBudgetG,carbonBudgetWindow,defaultRegion,dbPath). OpenClaw resolves the"${ENV_VAR}"shorthand in the credential fields, so you can keep exporting the same variables and let the gateway read them on the plugin's behalf.
Zone | Source | Auth (CLI / MCP / dashboard) | Notes |
| None | Real 48h forecast, always on | |
| WattTime v3 marginal (co2_moer) | Free account ( | Marginal-emissions FORECAST (lbs/MWh → gCO2/kWh). Takes precedence over EIA where covered; falls through to EIA on any error. Signal disclosed as |
| Free API key ( | Hourly fuel-mix → carbon intensity via IPCC AR5 factors (average signal; used when WattTime is unconfigured) | |
| Free token ( | Realised generation by type → carbon intensity | |
any zone (universal fallback) | Electricity Maps free-tier |
| Used when zone-specific source missing |
anything else | Deterministic mock curve | None | Used when no key set or upstream fails |
WattTime v3 uses granular sub-BA region codes; only US-CAL-CISO → CAISO_NORTH is verified against WattTime's live public docs — the other
US mappings are best-effort and marked unverified in
packages/core-ts/src/grid.ts, degrading safely to EIA if a code is
rejected. Want to add another free public source? Each adapter is a single
function in packages/core-ts/src/grid.ts — open a PR.
Install (development)
# from the repo root
pnpm install # installs all workspace packages
pnpm build # builds @ebb-ai/core and @ebb-ai/mcp
pnpm test # runs vitest across packagesRequirements: Node 20+, pnpm 9+. Python 3.11+ if working on the Python package.
Documentation
ROADMAP.md— 24-week execution plan, architecture, roadmap, success metrics.docs/— design docs, MCP spec proposals (forthcoming).examples/— OpenClaw demo skill, Claude Code config.
License
Apache License 2.0 — patent grant included.
Contributing
This project is in active early development. Issues and PRs welcome;
see the ROADMAP.md roadmap for current scope. Major new features should
be discussed in an issue first to avoid duplicate effort.
Built by Vitalii Borovyk.
Available Tools
9 toolscancel_allA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Optional. If set, cancel only tasks in this status. Valid: 'queued', 'scheduled'. Defaults to both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses exactly which tasks are mutated (queued/scheduled), which are left untouched (running/completed/failed/cancelled), and the return shape (count cancelled). It omits auth requirements and whether cancellation is reversible, which are meaningful gaps for a destructive bulk operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the destructive scope, followed by exclusions and return value. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return value (number cancelled) and fully characterizes the effect and boundaries of the operation for a single-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum already documents the valid status values, so the description's 'Optionally filter by status' adds no syntax or behavior beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (bulk-cancel), an explicit resource (every task in the queue), and a precise scope (only still-cancellable statuses). This clearly separates it from the single-task sibling cancel_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'Bulk' plus 'every task in the queue' makes the bulk-vs-single context clear relative to cancel_task, and the eligible/untouched status lists frame when it applies. It stops short of explicitly naming an alternative or stating when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_taskA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The id of the task to cancel. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses idempotency, the no-error behavior for completed/failed/cancelled tasks, and the sole failure mode (unknown task_id). It omits permission/auth requirements and whether cancellation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and its scope, followed by the exact error semantics. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no annotations or output schema, the description covers the key agent concerns: eligible task states, idempotent return behavior, and the lone exception case. What it lacks is auth/permission context and any note on cancelling in-flight tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented in the schema. The description adds no meaning about task_id format or source beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (cancel a task) and narrows the eligible state to 'queued or scheduled'. It implies a single-task scope that separates it from cancel_all, but never names the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The error/idempotency conditions give usable context, but there is no explicit when-to-use versus siblings like cancel_all, retry_task, or expedite_task. The single-task scope is only inferred from the wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_queue_statusA
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 any carbon receipt (estimated vs actual grams, grid_source, energy_source). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | No | If present, return only this task. If omitted, return a queue summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so partly: it declares the operation read-only, discloses that the queue persists across host restarts, and describes what a detail response contains (carbon receipt with estimated vs. actual grams, grid_source, energy_source). It does not discuss permissions, rate limits, or output volume, but covers the important traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler; the no-argument case is stated first, then the task_id case, then the safety tag. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema or annotation block, so the description must explain returns, and it does reasonably well by naming the summary scope and the carbon-receipt fields. It is close to complete for a one-parameter read tool, lacking only auth/permission context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the task_id property already documents the summary-vs-detail switch, so the baseline is 3. The description enriches this slightly by naming the extra fields returned for a single task, but adds no syntax, format, or constraint information beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report on the ebb-ai task queue') and clearly separates the two modes of operation (summary vs. single-task detail). No sibling tool reports on queue state, so it is easily distinguished from get_grid_forecast, schedule_task, or cancel_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains both call shapes but frames them as parameter behavior rather than as a decision rule. It never states when an agent should check queue status versus using siblings like retry_task or cancel_task, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expedite_taskA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The id of the task to dispatch now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and does well: it discloses the side effect on the resulting receipt (intensitySource='expedited'), the fact that a scheduled carbon optimization is overridden, and the precise rejection conditions. It does not cover auth requirements, idempotency of repeat calls, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, front-loaded with the action and its key consequence (carbon-window bypass) before the eligibility rules. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain outcomes; it names the receipt field and the error behavior, which covers most of what an agent needs. Minor gaps remain around reversibility and permissions for an operation that intentionally overrides a carbon-optimized schedule.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning by constraining which task_id values are legal (only queued/scheduled provider-call tasks), which the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (dispatch/expedite), resource (queued or scheduled provider-call task), and the distinguishing behavior (bypassing the scheduler's carbon window). An agent can separate this from schedule_task, cancel_task, and retry_task purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates the eligible states (queued/scheduled provider-call tasks) and the rejected states (running, submitted awaiting Batch results, terminal completed/failed/cancelled), with the consequence of misuse (explanatory error). It does not route the agent to a sibling alternative, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_grid_forecastA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Forecast horizon in hours (1-72). Defaults to 24. | |
| region | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and does well: it declares 'Read-only; does not touch the task queue', which tells the agent this has no side effects on scheduled work. It also discloses the return semantics (g CO2e/kWh plus categorical bands), which is behavioral context beyond a typical read. It omits any note on forecast accuracy degradation or rate limits, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what the tool returns before the usage guidance and the safety note. Every clause earns its place; nothing is redundant with the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description usefully explains return values (units and the five-band categorical scale) and the read-only guarantee. Coverage of the parameters is delegated to a complete schema, which is appropriate. Minor gaps (no note on pagination/horizon defaults beyond the schema, no failure modes for unknown region codes) keep it just below 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (region codes, hours 1-72 with default 24) are already fully documented in the schema. The description reinforces intent with 'for a region' and 'hour by hour' but adds no syntax, format, or edge-case detail beyond what the schema supplies, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the projected electricity-grid carbon intensity') plus the granularity ('hour by hour') and scoping unit ('for a region'). An agent can distinguish this from siblings like recommend_window or check_queue_status without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the decision context: 'Use this when deciding whether to run an expensive AI task now or defer it.' That is a clear when-to-use signal. It stops short of naming the sibling alternative (recommend_window) or stating when-not to use it, so it is clear context without full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_windowA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Optional vendor model name (e.g. 'claude-sonnet-5'). Affects the reasoning string only. | |
| region | Yes | 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. | |
| deadline | Yes | 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. | |
| candidates | No | 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 the scheduler scores them at the chosen dispatch window on a weighted blend of carbon, cost and latency and dispatches the winner (recording the full scored list on the signed receipt). No silent model swaps — routing only ever picks from this list. Absent or a single entry leaves the provider/model behavior unchanged. Every candidate model must exist in the price table or the task is rejected loudly. | |
| route_weights | No | 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. | |
| carbon_budget_g | No | 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 than dispatching to a dirty window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does well: it declares "Read-only; does not touch the task queue," enumerates the returned fields (window, alternatives, batch_eligible, grid_source, reasoning), and warns that grid_source='mock' means synthetic data. It stops short of other operational context such as rate limits, auth requirements, or failure modes outside the carbon cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then usage, then returns, then safety posture in a tight sequence. Every clause carries distinct information (differentiation, return shape, mock-data caveat, read-only guarantee) with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with nested objects and no output schema, the description compensates by enumerating the return payload. It does not fully cover the routing/candidate behavior, but that is documented in the schema, so the description is adequate though not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters in detail, including the routing semantics and defaults. The description adds no additional parameter-level meaning (e.g. syntax or edge cases for candidates/route_weights) beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Return the optimal carbon-aware execution window for a task") and immediately delimits scope with "WITHOUT scheduling it." This directly contrasts with the sibling schedule_task, so an agent can distinguish commit-vs-preview without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case ("non-committal planning") and the decision it feeds ("before deciding whether to commit via schedule_task"), routing the agent to the correct sibling. The when-to-use condition is stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_taskA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The id of the failed task to retry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it does well: it discloses the validity gate, the rejection error for wrong states, and the mutation side effect ('the new run's receipt overwrites the old'). It omits permission/auth requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the action first, then the validity gate, then the side effect. Every clause earns its place, and the most important constraint is front-loaded after the verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with no annotations and no output schema, the description covers validity, error behavior, and the overwrite side effect. Return values need not be explained since no output schema exists; only auth/permission context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter, so the schema already fully documents task_id. The description's reference to the failed task adds consistency but no meaning beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Re-dispatch') and resource ('a failed provider-call task'), scoping it to provider-call tasks so an agent can distinguish it from siblings like schedule_task or expedite_task. Purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the precondition (status must be 'failed') and enumerates the rejected statuses (queued/scheduled/running/submitted/completed) with the resulting error. It stops short of naming an alternative tool for non-failed tasks, so it is strong guidance without full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_taskA
Queue an AI task to run during off-peak hours inside the given deadline. Four parallel wins: (1) lighter on the electricity grid — deferring non-urgent tasks smooths projected AI compute demand; (2) up to 50% cheaper — auto-routes through Anthropic/OpenAI Batch APIs when the deadline allows; (3) faster sync calls — off-peak queues are shorter; (4) 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.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | 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 'gemini-3.8-flash', ollama 'llama3.1'. When >= 2 'candidates' are supplied, routing may overwrite this with the winning candidate. | |
| prompt | Yes | The prompt or task description to dispatch when the chosen window arrives. | |
| region | No | 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. | |
| dry_run | No | If true, return the planned dispatch (recommended window + carbon estimate) WITHOUT persisting anything. Useful for confirmation flows. | |
| deadline | Yes | 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. | |
| dispatch | No | 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 (legacy in-memory mode). | |
| provider | No | 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 when the deadline allows; 'gemini' and 'ollama' always dispatch synchronously. | |
| candidates | No | 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 the scheduler scores them at the chosen dispatch window on a weighted blend of carbon, cost and latency and dispatches the winner (recording the full scored list on the signed receipt). No silent model swaps — routing only ever picks from this list. Absent or a single entry leaves the provider/model behavior unchanged. Every candidate model must exist in the price table or the task is rejected loudly. | |
| output_path | No | Optional absolute file path. When the task completes, ebb-ai writes { taskId, result, receipt } as JSON to this path. | |
| route_weights | No | 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. | |
| carbon_budget_g | No | 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 than dispatching to a dirty window. | |
| redact_in_receipt | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly does: it discloses off-peak dispatch, Batch API auto-routing with up to 50% cost reduction, grid-region/carbon-aware window selection, deadline conversion, and that a task_id is returned for later status checks. It stops short of stating failure semantics (e.g. what happens when no window meets a carbon cap or the deadline passes) and leans on promotional framing for what are really behavioral claims.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in sentence one and the routing/return facts follow in a logical order. The four-item 'parallel wins' block is longer than necessary and partly promotional, but the trigger-phrase enumeration and exclusions carry real selection value, so the length is mostly earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, deeply nested tool with no annotations and no output schema, the description supplies everything an agent needs to decide to call it and how to shape the core call: purpose, triggers, exclusions, deadline/prompt mapping, provider/batch behavior, and the downstream status-check path. Remaining specifics (weights, output_path, redaction) are thoroughly covered by the 100%-covered schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine mapping guidance beyond the schema: convert the user's deferral wording into an ISO-8601 deadline and pass the underlying request as the prompt. It does not, however, explain the relationship between candidate routing, weights, or the carbon budget beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource with scope: 'Queue an AI task to run during off-peak hours inside the given deadline.' It also names the follow-up sibling (check_queue_status) and scopes itself apart from live/interactive work, so an agent can distinguish it from recommend_window or get_grid_forecast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit invocation triggers ('do this later', 'by tomorrow', 'overnight', 'no rush', etc.), concrete good-fit workloads (nightly digests, batch summaries, research sweeps), and explicit exclusions (live chat, interactive code edits, tasks the user is actively waiting on). This is about as complete a when/when-not statement as a description can carry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_deadlineA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The id of the task to reschedule. | |
| deadline | Yes | New ISO-8601 deadline. Must be in the future. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the scheduling side effect (window re-pick), the re-score behavior, and three failure modes (running/terminal state, invalid deadline, past deadline). It omits permissions/auth and idempotency, but the mutation and error profile is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effectively one sentence front-loading the action and effect, with the error conditions tagged on efficiently. No filler and nothing that restates the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must convey behavior; it covers the mutation, the rescheduling semantics, and failure cases adequately. The one real gap is what the tool returns (new window, new score, or a status) for a caller needing to confirm the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented by the schema, which is the baseline 3. The description reinforces that the deadline must be future-dated, consistent with the schema's note, but adds no format or syntax detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific compound verb (re-score and reschedule) plus the resource (queued or scheduled task) and the mechanism (scheduler re-picks the cleanest window inside the new deadline). It is clearly distinguishable from siblings like schedule_task or retry_task, though it never names an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Applicability is defined by state: only queued or scheduled tasks qualify, and running/terminal tasks are excluded via the throw condition. The 'when not to use' is implied through those error cases rather than stated as an explicit routing rule to a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.16.0- First observed
cancel_all - First observed
cancel_task - First observed
check_queue_status - First observed
expedite_task - First observed
get_grid_forecast - First observed
recommend_window - First observed
retry_task - First observed
schedule_task - First observed
update_deadline
TDQS
Scored across 9 tools
Each tool targets a distinct action in the carbon-aware scheduling lifecycle: forecast, non-committal recommendation, scheduling, status check, single/bulk cancellation, expedite, deadline update, and retry. Overlaps are minimal, and descriptions clearly distinguish read-only planning tools from committing actions.
All tools use snake_case with verb-first naming (get_, recommend_, schedule_, check_, cancel_, expedite_, update_, retry_), making the pattern predictable and readable. cancel_all is a minor deviation but still follows the verb-first convention.
9 tools is well within the ideal 3-15 range for this domain, and each tool corresponds to a meaningful operation in the scheduling workflow without redundancy.
The surface covers the full lifecycle from forecasting and recommending through scheduling, status, cancellation, rescheduling, expediting, and retrying. A minor gap is the lack of an explicit tool to retrieve a completed task's output/result, though check_queue_status may provide some detail.
Maintenance
Related MCP Connectors
Protocol-native energy infrastructure orchestration for AI data centers. Provides 46 MCP tools across 8 grid protocols (IEC-61850, DNP3, Modbus, OCPP, OpenADR, IEEE 2030.5, IEC 60870-5-104, ICCP) with 5 core API primitives: connect, dispatch, settle, comply, and intel. Enables AI agents to programmatically interact with substations, grid interfaces, and energy assets for real-time workload-grid coordination.
PJM/MISO energy arbitrage. Intel TDX attested, on-chain every 60 min. MCP tools for AI agents.
Agent Cost Allocator MCP — multi-tenant LLM cost attribution for chargeback billing. Companion to
One MCP endpoint for Claude, GPT & Gemini: 100+ tools + no-code connectors + agent workers.
Related MCP Servers
- AlicenseAqualityAmaintenanceCode-mode MCP server (docs_search + execute_code two-tool surface) backed by a unified capability manifest across three sandbox kernels (in-process node:vm, WASM via QuickJS / Pyodide / Wasmtime, and remote microVM via E2B / Cloudflare Sandbox). At N=30 tools the bootstrap-context cost drops to 13.6% of direct tool-use. Apache-2.0.26Apache 2.0
- AlicenseAqualityAmaintenanceA local-first, multi-provider cost meter for LLM usage, exposed as MCP tools. Captures every call into a local SQLite ledger and lets any coding agent query spend, compare providers, and get recommendations — no cloud, no account. First-class support for Chinese providers (Qwen, DeepSeek) alongside Anthropic and OpenAI.740 PyPI5MIT
- AlicenseBqualityAmaintenanceLLM-native code tools: 44 MCP tools for AI agents to read, understand and modify code. Rust tree-sitter parse daemon (crash-isolated), SQLite symbol index (repo map 98ms), transactional journal-backed writes, deterministic quality gates (zero LLM calls). 512MB cgroup: 128 concurrent, zero OOM. MIT.441MIT
- AlicenseAqualityAmaintenanceEnables AI agents to choose the lowest-carbon cloud region for a workload, with tools for ranking regions by carbon intensity and latency, and for finding optimal start times to reduce emissions.347 npm1MIT