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 分