ebb-ai

io.github.Vitalini由 GitHub 帳號 Vitalini 發布v0.17.0更新於 Nov 6, 2026

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

概覽

AI 產生的概覽

把非緊急的 LLM 任務排到截止時間前電網碳排最低的時段執行,時間允許時走供應商 Batch API。

可以做什麼
  • 規劃與排隊:在截止時間內推薦最乾淨的時間窗,建立一次性或週期性任務,設定碳預算或最早開始時間。
  • 查看與管理佇列:查詢佇列或單一任務狀態及碳排回執,取消單一任務、整個重複系列或全部待執行任務。
  • 調整時間:依預設或延遲順延、更新截止時間、立即提前執行、重試失敗任務。
  • 讀取電網資料:取得某地區逐小時的碳排強度預測。
  • 續接與用量:對已完成任務追加回覆,讀取本機訂閱額度及可選的費用估算。
適用情境
適合使用者說「今晚做」或「明天之前完成」而任務並不緊急的情境,可順延到更乾淨的時段執行。也適合時間有彈性、又在意碳排的週期性背景任務。
執行需求
以 stdio 方式在本機執行,通常透過 npx 啟動,需要 Node.js。預設地區為 GB,其他區域需免費金鑰或帳號:EIA、ENTSO-E、WattTime 使用者名稱與密碼,或 Electricity Maps。透過 Anthropic 或 OpenAI 執行任務需對應 API 金鑰;未設定電網金鑰時使用模擬資料。需安裝 tick 常駐程式,排隊任務才會真正執行。
安裝前請注意
需要多組密鑰:ANTHROPIC_API_KEY、OPENAI_API_KEY、EBB_EIA_API_KEY、EBB_ENTSOE_SECURITY_TOKEN、EBB_ELECTRICITY_MAPS_API_KEY 和 WATTTIME_PASSWORD,以及 WattTime 使用者名稱。排程任務會產生供應商 API 費用,用量工具可估算依標價計算的成本。任務會把結果寫入檔案並存入本機 SQLite 佇列,還能喚醒閒置的 Claude Code 工作階段。README 記載了套件名稱與變數前綴的改名,與清單所列名稱不一致,安裝前請確認所用版本讀取的名稱。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 ebb-ai,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[Tidegap]

@tidegap/mcp

Renamed from @ebb-ai/mcp in 0.18.0. Use the host config key tidegap and npx -y @tidegap/mcp; the ebb-mcp bin and the EBB_* variables were removed in 0.19. See Renamed from Ebb AI.

MCP server that lets your agent run non-urgent LLM tasks at the cleanest grid hour before a deadline.

Add it to any MCP host. When a user says "do this tonight" or "by tomorrow", the agent calls schedule_task. Tidegap then runs the task at the lowest-carbon grid hour before the deadline, and through the provider Batch API when the deadline allows.

  • 12 MCP tools (measured), among them recommend_window, schedule_task, check_queue_status, get_grid_forecast, cancel_task, postpone_task, update_deadline.
  • Live 72-hour forecast. GB needs no key; other regions use free keys (EIA, ENTSO-E, WattTime, Electricity Maps).
  • One signed carbon receipt per task, stored in ~/.tidegap/queue.db.
bash
npx -y @tidegap/mcp
json
{ "mcpServers": {    "tidegap": { "command": "npx", "args": ["-y", "@tidegap/mcp"] }} }

Proof: one real GB run, 2026-09-30. Forecast peak 183 gCO2/kWh vs recommended window 88 gCO2/kWh, about 52 % lower for this run only (forecast, projected). Receipt at dispatch: 158 gCO2/kWh (measured). Host-specific configs: https://www.tidegap.com/docs#install

Run

bash
npx -y @tidegap/mcp

The server speaks MCP over stdio. To wire it into an agent client:

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS (Linux/Windows have similar paths):

json
{  "mcpServers": {    "tidegap": {      "command": "npx",      "args": ["-y", "@tidegap/mcp"],      "env": {        "TIDEGAP_ELECTRICITY_MAPS_API_KEY": "optional - mock data without it",        "TIDEGAP_DEFAULT_REGION": "US-CAL-CISO"      }    }  }}

Restart Claude Desktop after editing.

Claude Code

Add tidegap to your ~/.claude/mcp.json (or workspace .claude/mcp.json):

json
{  "mcpServers": {    "tidegap": {      "command": "npx",      "args": ["-y", "@tidegap/mcp"]    }  }}

OpenClaw

Add to ~/.openclaw/mcp.json:

json
{  "mcpServers": {    "tidegap": {      "command": "npx",      "args": ["-y", "@tidegap/mcp"]    }  }}

Tools exposed (12, measured)

ToolPurpose
schedule_task(... repeat?, every_hours?, days?, window?, time_zone?) with repeat daily, weekdays, weekly or every_n_hoursCreate a recurring job: each run is a new task at the cleanest hour of its period. End it with cancel_task(series: true).
get_grid_forecast(region, hours?)Hour-by-hour carbon intensity for a region; useful before deciding whether to defer.
recommend_window(deadline, region?, ...)Plan the cleanest window inside the deadline without queueing anything.
schedule_task(prompt, deadline, model?, region?, carbon_budget_g?, repeat?, origin_session_id?, not_before?)Queue a task to run in the cleanest window inside the deadline. Returns a task_id and one line that says whether it will run: Runs at <time> local., or the readiness sentence with its fix, for example Tasks will not run: no tick daemon. Run `tidegap install`.. not_before sets the earliest start. repeat defaults to none, also for deadline_kind: "quota_reset".
schedule_task(... runner?, cwd?, permission_profile?, result_path?, wake_session?)Hand off the work shape: runner is another name for provider; cwd is the folder a claude-code run works in (another folder than the session's runs fresh there); permission_profile is read, web or none (read with a cwd); result_path is a new file Tidegap writes the result text to, inside cwd, the session's project folder or the temp folder. wake_session: true wakes the idle Claude Code session that queued the task when it finishes (within 12 hours after its last turn; refused outside a session). runner or provider command is refused with the tidegap queue add --runner command line. output_path follows the same folder rules.
check_queue_status(task_id?)Inspect the queue or one specific task; includes a carbon receipt once the task has completed.
cancel_task(task_id, series?)Cancel a queued or scheduled task; on a repeating task, skip it, or end the series with series: true.
reply_task(task_id, text, deadline?)Continue a completed task: a new task with the conversation plus this text, same provider and model.
expedite_task(task_id)Dispatch a queued or scheduled task now, outside its carbon window.
postpone_task(task_id, preset? | until? | delay_minutes?, reset_at?)"Later": move a pending task later, never earlier. Presets 1h, tonight (22:00 to 06:00), tomorrow_morning (09:00 to 12:00), after_limit_reset (5 minutes after the Claude limit reset: reset_at, else this machine's limit reading, else a reset time given before).
update_deadline(task_id, deadline)Reschedule a task against a new deadline.
retry_task(task_id)Re-dispatch a failed task.
cancel_all(status?)Cancel every task that is still queued or scheduled.
tidegap_usage(include_spend?)Read-only: the Claude Code subscription limits of this machine and when they reset, and the Codex limits from its local logs. include_spend adds the current 5-hour window's tokens and an API list-price cost estimate.

Environment variables

These variables configure this MCP server (and the tidegap CLI, which reads the same set). They are read at the server's own entry point and injected into @tidegap/core, which is environment-pure and reads nothing ambient itself.

OpenClaw plugin users: the @vitalini/tidegap OpenClaw plugin reads no environment variables. Configure it through plugin config instead, under plugins.entries.tidegap.config in your gateway config — the "Plugin config" column below names the field that replaces each variable. OpenClaw resolves the "${ENV_VAR}" shorthand in those fields, so you can keep exporting the same variables and let the gateway read them on the plugin's behalf.

VarPlugin configPurpose
TIDEGAP_ELECTRICITY_MAPS_API_KEYelectricityMapsApiKeyAPI key from electricitymaps.com. Universal fallback. If unset (and no zone-specific feed is configured), the server falls back to deterministic mock data so you can still run the whole stack locally.
TIDEGAP_EIA_API_KEYeiaApiKeyFree US EIA key. Enables average-emissions intensity for the US ISO zones (CAISO / ERCOT / ISO-NE / NYISO / PJM / MISO).
TIDEGAP_ENTSOE_SECURITY_TOKENentsoeSecurityTokenFree ENTSO-E token. Enables EU zone intensity (FR / DE / ES / IT / NL).
WATTTIME_USERNAME + WATTTIME_PASSWORDwattTimeUsername + wattTimePasswordFree WattTime v3 account. Enables marginal-emissions (co2_moer) forecasts for the US ISO zones — takes precedence over EIA where covered, falls through to EIA on any error. The marginal signal is disclosed as signalType: "marginal" on forecasts and receipts.
TIDEGAP_DEFAULT_REGIONdefaultRegionRegion when a tool call names none. Beats the stored region setting; see Grid region.
ANTHROPIC_API_KEYanthropicApiKeyEnables the anthropic provider (batch-capable).
OPENAI_API_KEYopenaiApiKeyEnables the openai provider (batch-capable).
GEMINI_API_KEY / GOOGLE_API_KEYgeminiApiKey / googleApiKeyEnables the gemini provider (Generative Language API, sync-only). GEMINI_API_KEY is preferred; GOOGLE_API_KEY is the fallback.
OLLAMA_HOSTollamaHostEnables the local ollama provider (sync-only). Default http://localhost:11434; keyless — set this var to opt the provider in.

Grid region

The server resolves the region of each tool call in this order:

  1. the tool call's region argument,
  2. TIDEGAP_DEFAULT_REGION in the server's environment (the agent host's MCP config),
  3. the region setting stored on this machine: tidegap region set <zone>, or Settings → Grid region in tidegap ui and the Mac app (key TIDEGAP_DEFAULT_REGION in ~/.tidegap/config),
  4. a guess from the machine's time zone,
  5. GB.

The server reads the setting again when the file changes, so a new setting applies on the next tool call with no restart. A stored value that is not a supported zone is ignored, with one stderr warning per change. schedule_task replies carry region_source: flag | env | setting | timezone | fallback.

A region argument must be one of the 31 supported zones (any case). Another value is rejected with the closest zones and a link to request a region, for example Unknown zone UA. Closest: PL. Request a region: <link>. With TIDEGAP_ELECTRICITY_MAPS_API_KEY set, any zone passes, because Electricity Maps serves zones beyond the list; with TIDEGAP_ENTSOE_SECURITY_TOKEN set, IT passes too.

Develop

From the root of a clone of https://github.com/tidegap/tidegap:

bash
pnpm installpnpm --filter @tidegap/mcp buildnode packages/mcp-server/dist/server.js

來源:packages/mcp-server/README.md,提交 11e1df5

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.17.0最新Oct 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分