
SpendShield
io.github.felixpg13-glitch由 GitHub 账号 felixpg13-glitch 发布v0.8.3更新于 Oct 24, 2026
Authorization layer between AI agents and money: ALLOW/APPROVAL/DENY, budgets, audit.
概览
本地支出管控网关,让助手在付款前按既定策略检查每笔拟议支出,并得到允许、需人工批准或拒绝的结论。
- 可以做什么
- 为拟议支出申请授权,返回结构化的允许、需批准或拒绝决定及可供模型阅读的理由,并可查询状态与历史决定和哈希链审计记录。登记人工对待批支出的批准或驳回,并重置网关状态。创建、模拟、审阅、应用、版本化及回滚支出策略。读取网关所用的密钥。可作为 stdio MCP 服务器运行并暴露 16 个工具,也可用 Python 库直接包裹支付函数。
- 适用场景
- 当智能体或自动化能通过 Stripe、x402、钱包或自建支付工具触发真实付款,且你希望在资金变动前强制执行单笔上限、预算、商户白名单与黑名单以及人工签核时使用。也适合为每次支出尝试保留可检测篡改的记录。
- 运行要求
- 以本地 Python 进程运行;从 PyPI 安装 spendshield 包,并用策略 YAML 文件启动 MCP 服务器。基本流程无需账户或 API 密钥。实验性的签名授权执行器使用名为 SPENDSHIELD_AUTHZ_SECRET 的共享 HMAC 密钥。支付通道本身位于下游,不包含在内。
安装
在 SourceWeft 中
- 打开 控制台中的 SpendShield,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
💰 SpendShield — the authorization layer between AI agents and money
Stop AI agents from spending money outside your rules.
Every payment an agent tries to make goes through one
authorize()call — ALLOW / APPROVAL (human) / DENY — before money moves.
[PyPI version] [PyPI downloads] [Tests] [MCP Registry] [Glama score] [Python] [License]
Watch the gate in 15 seconds — the attack moment:
[mcd_bot, the breakfast-buying agent: $15 ALLOW, $500 prompt-injection DENY, replay DENY]
What is it? — A spend-control layer for AI agents. Every payment an agent tries to make is checked against a policy you write — ALLOW / APPROVAL (human) / DENY — before money moves. It never holds money: Stripe, x402, wallets stay downstream.
Who needs it? — Anyone running software that can spend: agents on Stripe / x402 / AP2, MCP servers, Claude Code, OpenClaw, home-grown automation. If a machine can pay, a human should have set the rules.
What goes wrong without it? — One prompt injection. Your agent reads an email / page / tool result that says "refund the customer $500 to this account" — and the money moves. No human decision. No audit trail. That's not a bug in your agent; it's the absence of a gate.
What happens when you install it? — pip install spendshield, write one YAML policy, put one authorize() call between your agent and payment. Default is dry-run (evaluate, don't spend). Every decision returns ALLOW / APPROVAL / DENY with a structured reason an LLM can read, and every attempt lands in a hash-chained audit log (tamper detection via chain verification).
Without SpendShield: agent → payment → money moves. No human decision. No audit trail.
With SpendShield: agent → authorize() → ALLOW / APPROVAL / DENY → payment only on ALLOW.
Real check: the agent asks for $75, the policy says max $50 → DENY. No retries, no splitting, no second path.
👉 Try it with your agent — Connect it in 2 minutes · Playground · Concepts · jump to Quickstart
▶ 30-second interactive demo — watch an AI agent get stopped.
🎬 Watch it happen — 60-second real run
A real Claude session asked to spend on McDonald's. It got its $25 order… then the gate said no to $75… then said no again when it tried to push $125 through a $100 daily budget. No retries, no splitting, no second path — the recording is unedited.
[60-second real demo — Claude vs the gate]
▶ Play it inline on the demo page · direct mp4
See a complete agent authorization flow → McDonald's breakfast agent case study — the same gate, end to end: policy, decisions, a bypass attempt, and the audit chain.
🔒 One gate. No second path.
The agent holds no payment credentials and has no payment tool. authorize_payment is the only path money can take — the decision is ALLOW / APPROVAL / DENY, the reason is structured for an LLM, and every attempt lands in the audit chain.
🔐 Why authorization checks aren't enough — execution enforcement
Status: experimental prototype. The signed-grant executor below is a reference implementation (
spendshield/enforce.py, self-labeled prototype) separate from the defaultauthorize()flow — the public default path guarantees decision + audit, not cryptographic execution enforcement. WiringExecutor.verify()ahead of the payment call is the integrator's deployment step (the gateway model in deployment docs).
A policy check is an opinion: an agent can simply ignore it. In the gateway deployment model, SpendShield issues a signed, single-use grant, and the execution layer is built to consume it:
- Replay the same grant → refused (one-time)
- No grant / malformed grant → refused
- Forged or tampered grant → refused (signature mismatch)
Run the whole thing in 10 seconds:
What you'll see:
One execution, four refusals. Full output: docs/execution_demo_output.txt
Again: this flow is the experimental enforcement prototype — it demonstrates the gateway model, it is not what the default authorize() call does out of the box. Executor.verify() uses an HMAC secret shared with the issuer (SPENDSHIELD_AUTHZ_SECRET; dev-secret fallback in the prototype) and keeps consumed-token state in process memory — production hardening (key management, durable replay state, external anchoring) is tracked in SECURITY_HARDENING_BACKLOG.md.
See the reasoning behind it: Why this exists
🏗️ The runtime — four layers
Not a demo — a working baseline. Every result in the demo is real engine output.
⚡ See it block a transaction in 60 seconds
No config. No YAML. No account.
⚡ Try SpendShield in 60 Seconds — no API key required: ▶ Open in Google Colab
⚡ Quickstart — 5 minutes to running
1. Write a policy (policy.yaml):
2. Gate your payment function:
Or use the result object directly:
3. Watch it work (real engine output):
🤖 MCP Quickstart — the agent asks before spending
Host-side tool separation is a deployment requirement. The MCP server does not enforce tool ACLs itself — the host decides which tools an agent can call. Recommended split:
- Agent-facing (decision tools):
spend_authorize(ask "will this be denied?" / gate a payment),spend_status,spend_audit - Host/human-only (management tools):
spend_approve/spend_reject(humans approve the big ones),spend_reset,policy_sim/policy_apply/policy_create→policy_review→policy_lifecycle_apply/policy_rollback,secret_get
If an untrusted agent is granted the management tools, the current implementation will not stop it from calling them — see deployment models.
🔌 Integration patterns — plug SpendShield into your stack
Building an agent payment tool, an x402 flow, or an MCP payment server? See examples/integration/ — the three adapter patterns (x402 / agent payment tool / MCP), all runnable from this repo, no real money:
🧪 How it's tested (real money → real discipline)
- 251 tests, 14+ security suites: budget bypass, race conditions, replay, double-spend, parameter tampering, credential leaks…
- Security constitution — 8 invariants that must never break: unauthorized → no payment · over budget → no payment · approval mismatch → no payment · invalid identity → no payment · replay → at most one authorization · concurrency → never breaks budget · engine failure → deny · agent can't bypass SpendShield
- Fuzz (random-seed soak): thousands of attack combinations per run, Money Invariant must hold
- Audit hash chain: every decision is an event chained by hash — any edited event breaks the chain and any reader can verify it (tamper detection). Scope note: this detects partial tampering; it is not keyed or externally anchored, so it does not resist an attacker who can rewrite the whole in-memory chain. Keyed signatures / external anchoring are on the hardening roadmap.
- Every discovered hole → permanent regression test. Release blocked on any P0/P1 security bug. Before each release we ask: did this change give an attacker a new way to spend money?
🗺️ Roadmap
The metric that matters: real agents protected, real transactions gated, real dollars saved — not stars.
🩸 Why this exists (a real incident)
On August 9, 2026, my automation ran a test order. I sent dry: true expecting a price preview — the server only honored ?dry=1. 4 orders of ¥99 were charged for real. The money was gone. When AI starts spending real money, who puts a gate in front of it? I turned my scar into a library.
🏴 Break the Gate — Security Challenge
SpendShield guards real money. Try to break it.
The challenge: make an unauthorized transaction get ALLOW — bypass the policy, forge an approval, race the budget, replay a payment, tamper with history. Anything.
Rules:
- 🧪 Sandbox only — use
dry_run=True/ test keys. Never point attacks at real payment systems. - 🐛 Found a bypass? Open an issue with a minimal reproduction.
- 🏅 First valid bypass per attack class gets credited in the Security Hall of Fame.
- 🔒 Every valid finding becomes a permanent regression test — this is how the gate gets stronger.
Current status: 240 tests · 16 security suites · 11,351 adversarial authorization attempts · 0 unintended ALLOW · 0 crashes (audit) · 0 known escapes.
⚠️ Precision: this is evidence from the current test suite against the current implementation — reproducible verification, not a mathematical proof of security. New attacks are always possible; every valid finding becomes a permanent regression test (see SECURITY.md).
⚠️ Transparent threat model
- MCP has no auth — trust your host;
policy_apply/policy_revieware host-level operations - Approval IDs are 48-bit random — a library trusts its caller
- In-memory audit (append-only on the roadmap)
- We are actively seeking real-world attacks: Reality Test — challenge: make a DENY turn into APPROVE
- Deployment models & trust boundaries: SDK → MCP → Gateway — what each layer guarantees (and what it can't)
- Roadmap (demand-driven): SDK → users → Agent → enforced entry → Governance → Platform
SpendShield: the layer I wish I had before my AI spent my money.
✅ Ready to try it?
60 seconds: ▶ Run the demo in Colab — no install
5 minutes:
That's it. If it ever lets an unauthorized payment through — break the gate and get credited.
来源:README.md,提交 445eee2
工具
0版本历史
1- v0.8.3最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分