AgentLedger

io.github.entradox由 GitHub 帳號 entradox 發布v0.4.7更新於 Oct 24, 2026

Meter, cap, and block AI agent spend before the provider is charged.

已驗證Streamable HTTP可網頁執行金融安全與監控AI 與機器學習

概覽

AI 產生的概覽

AgentLedger 是託管的 MCP 伺服器,可跨支付管道計量、限制並攔截 AI 代理支出,並提供預算、告警與報表。

可以做什麼
記錄代理的支出項目,並在花錢前估算呼叫價格,附帶 token 轉成本估算與回傳允許或拒絕及原因碼的支出前預算檢查。設定美元與 token 預算上限,申請一次性支出例外,並以工作區擁有者身分核准或拒絕待處理許可。讀取支出報表、預算狀態、異常與告警歷史,並長輪詢事件流取得告警。將供應商流量接上代理,讓上限在供應商被計費前生效。輪替或撤銷代理密鑰,建立免費工作區,並讀取內建 API 文件、程式範例與技能檔案。
適用情境
當你執行按呼叫付費的 AI 代理,希望有統一的支出帳本、強制預算上限、異常告警與稽核紀錄時使用,特別適合跨多個支付管道或供應商的情境。也適合需要在代理超限前加入簽核流程的團隊。
執行需求
遠端 streamable-HTTP 端點,連線時不需認證握手。寫入需要 workspace_key,可透過免費的啟動呼叫取得,或經由 x402 錢包付款取得;每個被認領的代理會取得自己的 agent_secret,用於後續寫入與讀取。代理強制模式需要把供應商的基礎位址指向該服務並轉送供應商密鑰。
安裝前請注意
此服務涉及憑證:workspace_key 與 agent_secret 會在回應中回傳,必須妥善保存,輪替或撤銷密鑰會立即使舊密鑰失效。付費層級以 USDC 錢包付款購買,會花費真實資金,價格公布在 well-known 的 x402 端點。支出項目、預算與簽核會把資料寫入第三方託管服務,代理模式還會讓供應商流量與密鑰經過該服務。

安裝

在 SourceWeft 中

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

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.entradox%2Fagent-ledger/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "agentledger": {
      "type": "http",
      "url": "https://aiagentscity.com/mcp/"
    }
  }
}

README

AgentLedger — Per-Agent Spend Management

Track AI agent spend across x402/MPP/API-key rails, set budget caps, catch spending anomalies, keep audit trails. The "Datadog for agent spending" — the #1 verified community ask from agent builders.

[Live API] [Landing] [MCP Registry] [Version]

🎯 Free tier: 3 agents per workspace, no card, no login. POST /start mints the workspace and shows the key once.

Connect AgentLedger

Connecting takes no auth handshake. Before your first write you need a workspace_key, which you get one of two ways:

  • Autonomous agent with a wallet: POST /v1/billing/x402 with an X-PAYMENT header. The paying wallet becomes the workspace identity — no email, no login, no human in the loop.
  • Human: open /start — no signup, no login, no card. The workspace_key is shown once, right there, and the page carries the upgrade link for that workspace.

The key claims new agent_ids. Each claim mints that agent's own agent_secret, which is what authenticates every later write — the workspace_key is never needed again for that agent.

Claude Code:

bash
claude mcp add --transport http agent-ledger https://aiagentscity.com/mcp/

Codex:

bash
codex mcp add agent-ledger --url https://aiagentscity.com/mcp/

Cursor — merge into mcp.json:

json
{  "mcpServers": {    "agent-ledger": {      "url": "https://aiagentscity.com/mcp/"    }  }}

Any other MCP client: point it at the streamable-http remote https://aiagentscity.com/mcp/ — no headers, no auth handshake required to connect.

Try these prompts once connected:

  • "Track my Claude Code spend"
  • "Alert when any agent exceeds $50/day"
  • "Weekly P&L report"

Try it — get a key, then track

bash
# Track a spend — the FIRST call for a new agent_id CLAIMS it, so it needs# your workspace_key, and it returns that agent's agent_secret.# Save the secret: every later write (track/budget) to this agent_id uses it# instead, and needs no workspace_key.curl -X POST https://aiagentscity.com/v1/track \  -H "Content-Type: application/json" \  -H "AL-API-Version: 2026-09-01" \  -d '{"agent_id":"YOUR_AGENT_ID","rail":"x402","amount_cents":100,"service":"search_query","workspace_key":"YOUR_WORKSPACE_KEY"}'
# Set a monthly budget cap — pass the agent_secret from abovecurl -X POST https://aiagentscity.com/v1/budget \  -H "Content-Type: application/json" \  -H "AL-API-Version: 2026-09-01" \  -d '{"agent_id":"YOUR_AGENT_ID","monthly_cents":5000,"agent_secret":"YOUR_SAVED_SECRET"}'
# Spend report + anomalies — requires the agent_secret from abovecurl https://aiagentscity.com/v1/report/YOUR_AGENT_ID \  -H "X-Agent-Secret: YOUR_SAVED_SECRET"

Want to just look at it? Every agent has a human-readable page (send the secret as a header, no curl needed for the JSON): https://aiagentscity.com/v1/report/YOUR_AGENT_ID/html

/v1/report, /v1/tokens, and /v1/alerts all require either X-Agent-Secret: <agent's secret> or X-Workspace-Key: <the workspace's key> — missing or wrong credential gets 401. Headers only: there is no cookie or session arm, and no unauthenticated read path on REST or MCP. This is what stops a stranger from reading or overwriting someone else's agent_id.

Note this is a deliberate break from AgentLedger's earlier "share the link, anyone can read it" behavior — traded for real isolation between customers.

Two lines to a metered, capped agent

bash
pip install "aiagentscity-ledger[wrapper]"      # client only: the wrapper + the CLIagent-ledger init --agent YOUR_AGENT_ID       # mints a workspace, claims the agent, writes .env
python
from openai import OpenAIimport agentledger
client = agentledger.wrap(OpenAI(api_key=OPENAI_KEY),                          agent_id="YOUR_AGENT_ID", agent_secret="<from .env>")

That is the whole integration. wrap() repoints the client's base URL at the proxy and adds two identity headers — it does not patch or subclass the SDK, so streaming, tool calls and retries behave exactly as before. Anthropic's client works identically. Your provider key is forwarded untouched and never stored.

Not using a Python SDK? Point any OpenAI- or Anthropic-compatible client at <base>/proxy/openai/v1/ (or /proxy/anthropic) with X-AL-Agent and X-AL-Secret.

Install (MCP clients)

json
{  "mcpServers": {    "agent-ledger": {      "url": "https://aiagentscity.com/mcp/"    }  }}

Tools: ledger_track, ledger_set_budget, ledger_check_spend, ledger_report, ledger_alerts, ledger_price, ledger_proxy_attach, ledger_api_docs, ledger_examples, ledger_request_approval, ledger_approvals, ledger_approval_decide, ledger_start, ledger_rotate_secret, ledger_revoke_secret.

Agent-facing API reference: llms.txt Runnable code recipes: recipes.md

Features

  • Multi-rail neutral — x402, MPP, API keys, manual entries; not locked to one payment rail
  • Token→cost auto-pricing — send tokens + model and the dollar amount is computed for you; an unpriced model is refused rather than silently recorded as free
  • Budget enforcement — warns at 80% of cap, rejects the ledger write that would cross it
  • Any provider, config not code — providers.json lists the vendors the proxy can forward to (OpenAI, Anthropic, DeepSeek and Moonshot ship as examples); adding one is a config edit
  • Proxy enforcement (the real thing) — point your provider base_url at /proxy/{provider} and a call that would cross the cap is refused before the provider is contacted, so the money is never spent. Pass-through: your provider key is forwarded, never stored
  • Anomaly detection — spending-spike alerts per agent
  • Alerts that arrive — push budget warnings (80%), real budget blocks, and anomalies to an http(s) webhook you own; every delivery attempt is receipted, failures included
  • Audit trails — every entry persisted with rail, service, and timestamp
  • Shareable report links — POST /v1/report/{agent_id}/share mints a read-only, expiring URL that opens in a plain browser (no header, no credential); revoke the lot in one call
  • Credential recovery — a lost agent_secret never bricks an agent_id: the workspace_key mints a replacement (POST /v1/agents/{agent_id}/rotate-secret) or revokes it while keeping the spend history
  • Per-workspace isolation — your agents, your cap, your subscription; nothing is shared across customers
  • Free tier: 3 agents per workspace — the only paid path is the agent rail: POST /v1/billing/x402 buys a renewable 24h Pro pass (unlimited agents on the wallet's workspace) for $0.10 USDC. There is no human checkout or monthly plan. The number the service charges is X402_MINT_PRICE (env, default $0.10) and the live figure is published at /.well-known/x402 — read it there rather than trusting this line, which is the copy that goes stale.

Architecture

  • Core engine (ledger_engine.py): per-agent JSONL ledgers, budget state, alert log, per-agent secret (ensure_agent_secret — a new claim requires a workspace_key, and mints the agent's own agent_secret for every write after it)
  • Identity (identity.py): the single place a caller is resolved — agent_secret or workspace_key, both header-borne. Every gate (claim, read, billing) calls into it rather than rolling its own check.
  • Workspaces (workspace_engine.py): per-customer identity + plan state, keyed by wallet address (x402, no human) or by nothing at all for a plain POST /start workspace
  • REST API (api_server.py, FastAPI): app creation, meta endpoints, the human start/buy pages and router includes; endpoints live in routes_agents.py and routes_billing.py. Hosted streamable-http MCP at /mcp/
    • /v1/agents (full cross-tenant listing) is owner-only, requires X-Al-Admin header
    • Reads (/v1/report, /v1/tokens, /v1/alerts) require X-Agent-Secret or X-Workspace-Key; the MCP read tools take the same two credentials as parameters, so neither surface has an unauthenticated read path
    • Credential lifecycle: POST /v1/agents/{agent_id}/rotate-secret and /revoke-secret are workspace_key-only. An agent's own agent_secret deliberately cannot rotate itself — if it could, a leaked agent credential would permanently lock its real owner out. Revoke overwrites the stored secret rather than deleting it, so the agent_id stays claimed and cannot be picked up by another workspace
  • Input validation: agent_id restricted to [A-Za-z0-9._-]{1,64} (path-traversal safe), rail whitelisted to mpp/x402/api_key/manual, amount + budget caps bounded [0, $100k]
  • Stripe webhook is fail-closed: events are rejected unless the HMAC signature verifies against STRIPE_WEBHOOK_SECRET_AL. The human checkout endpoint is retired (410) — the webhook remains wired only so subscriptions already in flight when it was removed can still complete; a verified pro checkout marks that workspace its paid tier via its client_reference_id.

Contact

[email protected]

來源:README.md,提交 9fd1573

工具

18

ledger_rotate_secret

Rotate Agent Secret

Mint a NEW agent_secret for an agent_id your workspace already owns, invalidating the old one. Use this to RECOVER an agent whose secret was lost: the previous credential stops working immediately. Requires the workspace_key that owns agent_id — an agent's own agent_secret cannot rotate itself, because a leaked agent credential must not be able to lock its real owner out. Unlike ledger_track this never claims a new agent_id: an unknown id returns agent_not_claimed. The new secret is returned ONCE. Store it before you drop the response. Returns {"agent_id", "agent_secret", "_note"}, or {"error", "error_code"}.

輸入參數agent_id必填workspace_key必填

ledger_revoke_secret

Revoke Agent Secret

Invalidate an agent_id's agent_secret WITHOUT deleting its spend history. Use when a credential may have leaked, or to stop an agent writing. Subsequent writes to that agent fail with agent_secret_mismatch until you rotate a new secret in. The agent_id stays claimed, so no other workspace can claim it and inherit the ledger. Requires the workspace_key that owns agent_id. Returns {"agent_id", "revoked": True, "_note"}, or {"error", "error_code"}.

輸入參數agent_id必填workspace_key必填

ledger_track

Track Agent Spend

Record a spend entry for an AI agent on any payment rail, with optional token counts. Claiming a brand-new agent_id requires your workspace_key (get one via x402 at POST /v1/billing/x402 — no human, no login — or at /start). That first call mints an agent_secret and returns it in the response — save it, every later call for that same agent_id must pass it back (no workspace_key needed again) or the write is rejected. Amounts are capped at $100,000/entry and must be >= 0. If a budget is set for this agent, an entry that would cross the monthly/daily cap is blocked, not just logged. Caps here bind the AMOUNT YOU REPORT — a caller that lies to amount_cents lies to the cap. The only enforcement against real spend is routing the provider call through the /proxy/{provider} rail, which prices from the provider's own usage block. Include tokens_in/tokens_out + model on every LLM call so token burn shows up in the /v1/tokens report.

輸入參數rail必填modelservice必填agent_id必填tokens_intokens_outagent_secretamount_cents必填workspace_key

ledger_set_budget

Set Agent Budget

Set spending caps for an agent. Warns at 80%, blocks spend when exceeded — enforced: a ledger_track call that would cross the cap is rejected. Dollar caps (monthly_cents/daily_cents) and token caps (monthly_tokens/ daily_tokens) are independent dimensions: dollar caps only cover non-"tokens" rails, token caps only cover rail="tokens" bookkeeping rows (tokens_in/tokens_out). Set both if the agent uses both. Monthly cap is required; the rest are optional (0 = no limit). Overwrites any existing budget for the agent — with one rule: raising or removing an existing cap requires the workspace_key. An agent_secret can tighten its own caps but never loosen them; to grow an allowance the agent asks its owner (see ledger_request_approval). Claiming a brand-new agent_id requires your workspace_key; that first call mints an agent_secret (returned once — save it); later calls for that agent_id must pass the agent_secret back (no workspace_key needed again).

輸入參數agent_id必填daily_centsagent_secretdaily_tokensmonthly_cents必填workspace_keymonthly_tokens

ledger_report

Agent Spend Report

Spend report for an agent over a rolling window. Returns total spend, breakdown by rail and by service, budget status (ok/warning/exceeded), detected anomalies, and entry count. Requires a credential: either the agent's own agent_secret or its workspace's workspace_key (same rule as GET /v1/report).

輸入參數daysagent_id必填agent_secretworkspace_key

ledger_proxy_attach

Attach the Budget-Enforcing Proxy

Point your provider traffic at the proxy so budget caps are enforced BEFORE the provider is contacted, instead of being reported afterwards. This closes the gap where the brake was unreachable from MCP: an agent connected over MCP could record spend (ledger_track) but nothing could refuse a call. With this, the cap is enforced on every LLM call. Returns the base_url to use, the two headers to send, and the exact change for the OpenAI and Anthropic SDKs. Your provider credential is NOT part of this: it stays in Authorization / x-api-key and is only forwarded, never stored.

輸入參數agent_id必填provideragent_secretworkspace_key

ledger_alerts

Agent Budget Alerts

Alert history for an agent: budget warnings (80% threshold) and spending spikes. Requires a credential: either the agent's own agent_secret or its workspace's workspace_key (same rule as GET /v1/alerts).

輸入參數agent_id必填agent_secretworkspace_key

ledger_wait_events

Wait for Agent Events

Long-poll an agent's event feed — how an agent with no public URL receives alerts. Webhooks (POST /v1/webhooks) push events to a URL you own; an agent on stdio MCP cannot host one, so it waits here instead. Call this in a loop: the call holds open up to `timeout` seconds (max 30) and returns when events arrive or the wait lapses. `consumer_id` names this consumer durably — pick a stable one (e.g. "claude-code-main") and reuse it. Each call returns a `cursor`; pass it back on your next call once you have processed that batch — that is the ack. To get restart redelivery, also pass `client_instance` (your process id or any per-boot token) and `client_started` (when your process booted): when the pair changes, events that were served but never acked come back with `redelivered: true`, so nothing is lost to a crash between serve and process. (The stdio MCP server supplies its own pid/started automatically — hosted callers must opt in because the gateway cannot see the client's process.) Each event is an envelope: id (deterministic — dedupe on it), kind (alert.raised | budget.warning | budget.exceeded | anomaly.detected), summary, context (agent_id, alert_type, timestamp), alerts_since_last_write (how many alerts are stacked up since the agent's last spend write — use it to throttle escalation), redelivered. Requires a credential: either the agent's own agent_secret or its workspace's workspace_key (same rule as GET /v1/agents/{agent_id}/events/wait).

輸入參數namecursortimeoutagent_id必填consumer_id必填agent_secretworkspace_keyclient_startedclient_instance

ledger_check_spend

Check Before Spending

Ask BEFORE you spend: may this agent spend this much right now? Returns allowed (true/false), a stable reason code (within_budget, over_monthly_cap, over_daily_cap, over_monthly_token_cap, over_daily_token_cap, no_budget_set, unpriced_model), a one-line message, the cost estimate, the price used (with its source and as_of date) and every budget window with cap, spent and remaining. Same decision the /proxy/{provider} gate enforces. Read-only: nothing is recorded or reserved, so record the spend with ledger_track afterwards. Give exactly one spend shape: amount_cents (any rail, e.g. an x402 purchase), OR model with tokens_in/tokens_out.

輸入參數modelagent_id必填tokens_intokens_outagent_secretamount_centsworkspace_key

ledger_request_approval

Request Spend Approval

Ask your workspace owner for a one-shot spend exception before a ledger_track that the cap would refuse. Creates a pending permit for exactly amount_cents on the given service. The owner (a human, or a supervisor agent holding the workspace_key) approves or denies it with ledger_approval_decide. An APPROVED permit is consumed by the next ledger_track for this agent whose amount fits inside it — the budget cap itself does not change. Permits expire after 1 hour undecided. Poll with ledger_approvals to see the decision. Claiming a brand-new agent_id requires workspace_key; otherwise pass the agent's agent_secret.

輸入參數reasonservice必填agent_id必填agent_secretamount_cents必填workspace_key

ledger_approvals

List Spend Approvals

List spend-approval permits — yours, or your whole workspace's.

輸入參數stateagent_idagent_secretworkspace_key

ledger_approval_decide

Approve or Deny a Spend Request

Approve or deny a pending spend permit — workspace owner only. The agent's own agent_secret can REQUEST an approval but can never decide one: a credential that can approve its own requests is not a control. decision must be 'approve' or 'deny'; only pending permits can be decided. An approved permit is consumed by the agent's next ledger_track within its amount — it is a one-shot exception, not a raised cap.

輸入參數agent_id必填decision必填approval_id必填workspace_key必填

ledger_price

Price a Call Before You Make It

What will this call cost? Priced from the same table the caps use. Exists because ledger_track requires the CALLER to supply amount_cents, so an agent whose spend is capped could under-report its own cost and stay under the cap. This returns the number the enforcement path would use, so an agent can report honestly (and plan before it spends). Cost = (tokens_in * in_rate + tokens_out * out_rate) / 1_000_000. If the model has cache rates, the standard in-rate is used, which is the conservative direction for a spend cap. Every price carries the source it came from and the date it was read, and `verified: false` means the number was NOT read off the provider's own pricing page. Treat an unverified price as an estimate, not a measurement.

輸入參數model必填tokens_intokens_out

ledger_start

Start a Workspace

Get a FREE AgentLedger workspace with no credential and no arguments — the MCP equivalent of opening POST /start in a browser. Call this FIRST if you have no credentials yet. Every other tool here (ledger_track, ledger_set_budget, ledger_report, ledger_alerts) needs a workspace_key or an agent_secret, so a caller arriving with neither must start here or it has nowhere to go. Takes NO arguments on purpose: the goal is zero friction. It returns a `workspace_key` (shown exactly once — it cannot be re-revealed, so store it before continuing) which you then send as `workspace_key` on your first ledger_track for a NEW agent_id. That first write returns the agent's own `agent_secret`, which authenticates every write after it. The free tier includes every rail, enforced budget caps, alerts, reports and the MCP server, capped at 3 agents per workspace. Minting is rate-limited per caller IP, the same limit the human door uses. Prefer to pay? POST /v1/billing/x402 with a wallet-signed payment needs no human and buys 24h of Pro (agent allowance per the live pass tier — see /pricing.md).

無需輸入參數。

ledger_api_docs

AgentLedger API Docs

Self-serve documentation for AgentLedger — quickstart, MCP tools, REST endpoints, budget caps, error codes, and idempotency usage, as markdown.

輸入參數topic

ledger_examples

AgentLedger Recipes

Complete, runnable Python recipe for a common AgentLedger integration pattern.

輸入參數pattern必填

skills_list_tool

Skills List Tool

List this product's skills. Each entry carries the SKILL.md URI, its name and description, verbatim frontmatter, and a per-file sha256 manifest. Read a body with `read_skill`.

無需輸入參數。

read_skill

Read Skill

Read a product skill file by its skill:// URI.

輸入參數uri必填

版本歷史

4
  1. v0.4.7最新Oct 16, 2026
  2. v0.4.6Oct 10, 2026
  3. v0.4.3Oct 2, 2026
  4. v0.4.1Sep 16, 2026

評分

已滿足適用檢查項的 100%

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

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分