面向 AI 代理工具调用的故障关闭式 Cedar 策略门禁,外加签名回执。
protect-mcp 是一道位于 AI 代理工具调用之前的门禁。它会依据 Cedar 策略(与 AWS 用于 IAM 的同一种语言)评估每一次调用,在违反规则的调用运行之前将其拦截,并为每一次决策签署一份可离线验证的 Ed25519 回执。它在本地运行,不会将你的决策遥测数据发送到任何地方,并采用 MIT 许可证。
would_deny: true,因此失败绝不会悄无声息。serve --enforce 和 doctor 会运行启动自检,除非能证明某个已知被禁止的操作确实被拒绝,否则拒绝启用门禁。无法证明其会拒绝的门禁不会启动。@veritasacta/verify 离线验证。无需信任任何厂商:数学不在乎由谁来运行它。npx protect-mcp init
npx protect-mcp wrap -- node your-mcp-server.js
npx protect-mcp dashboard --open
npx protect-mcp recommend --write
npx protect-mcp --policy protect-mcp.recommended.json --enforce -- node your-mcp-server.js
对于 Claude Desktop,先运行一次 dry-run 配置补丁,然后再应用它:```bash
npx protect-mcp wrap --claude-desktop
npx protect-mcp wrap --claude-desktop --write
npx protect-mcp dashboard --open
仪表盘绑定到 127.0.0.1,仅读取本地日志/回执文件,不会上传任何内容。仅当你明确需要托管的 ScopeBlind 仪表盘时,才使用 npx protect-mcp connect。
如果你更愿意将网关作为工具调用,而不是接入 Claude Code 钩子,可以将其作为 MCP 服务器运行:```bash npx protect-mcp mcp
它通过 stdio 使用 MCP,并暴露四个只读工具,构成整个闭环:
- **`evaluate_action`**:根据内联 Cedar 策略对提议的工具调用进行判定,失败即关闭(任何策略错误均为 DENY)。返回 `{ allowed, decision, reason, policy_digest }`。
- **`sign_decision`**:将判定转换为 Ed25519 签名回执(拒绝会签署 `gateway_restraint`,允许会签署 `decision_receipt`)。返回回执及其公钥;如果你未提供密钥,则生成一个临时密钥。
- **`verify_receipt`**:使用公钥离线验证已签名回执。返回 `{ valid, error, type, kid, issuer }`。
- **`self_test`**:无需输入即可自证。一个已知被禁止的操作会被拒绝,然后一个已签名回执完成往返验证,而一个被篡改的副本会验证失败。
将任意 MCP 主机指向它,例如 Claude Desktop:```json
{
"mcpServers": {
"protect-mcp": { "command": "npx", "args": ["-y", "protect-mcp", "mcp"] }
}
}
回执与网关在运行时签名的回执字节兼容,因此在此处生成的回执可通过 @veritasacta/verify 以及浏览器验证器进行同样的验证。
protect-mcp dashboard 是操作员视图,用于从可见性过渡到强制执行:
Require approval、Block 或 Observe。审查更改后重启包装器。对于实时桌面回退审批,请使用包装器打印的本地网关审批端点和 nonce 启动仪表盘:```bash
npx protect-mcp dashboard --open
--approval-endpoint http://127.0.0.1:9876
--approval-nonce "$PROTECT_MCP_APPROVAL_NONCE"
`Approve` 在存在这些标志时会转发到本地实时网关。
`Deny`、`Edit` 和 `Take over` 会在本地记录为审批解决记录;在需要时将它们用作操作员指令并重新运行该工具。
### 付费边界 MVP:摘要锚定,而非数据上传
本地自签名回执保持免费且可离线验证。付费边界是独立证据,证明 ScopeBlind 在某个时间、以某个组织身份看到了回执摘要,而无需接收原始提示、工具负载、输出、私钥或原始回执。```bash
# Create or refresh a local org identity and public-key directory.
npx protect-mcp registry init --org "Meridian Global Macro" --billing-account acct_meridian
# Local preview: writes a digest registry and shareable static verifier page.
npx protect-mcp registry anchor
# Hosted mode: uploads receipt digests only for independent anchoring.
SCOPEBLIND_TOKEN=... npx protect-mcp registry anchor \
--hosted \
--endpoint https://api.scopeblind.com \
--verifier-base https://scopeblind.com
本地预览被刻意标记为 local-preview-not-independent。
托管模式仅锚定收据哈希、请求 ID、组织公钥和
计费元数据。它不会上传原始收据或敏感上下文。
protect-mcp killer-demo 生成一套完整的三分钟销售/演示包:```bash
npx protect-mcp killer-demo --dir ./scopeblind-demo
它创建模拟文件系统、GitHub、电子邮件和 PMS 活动;在影子模式下显示有风险的调用;应用策略包;对敏感的 PMS 预订要求审批;通过网关执行;写入签名回执;证明原始回执可验证;证明被篡改的回执验证失败;并创建一个选择性披露包,在隐藏敏感上下文的同时展示最小证明。
首先打开生成的 `DEMO-RUNBOOK.md`。然后运行打印出的仪表盘命令,引导客户走完确切的流程。
### Selective Disclosure v0
承诺模式回执可以携带一个 `committed_fields_root`,而不是以明文暴露每个字段。之后,持有者可以仅披露选定的字段:```bash
npx protect-mcp verify-disclosure \
--receipt ./receipts/selective-disclosure.receipt.json \
--disclosure ./receipts/selective-disclosure.tool-only.json
验证器会检查父收据哈希、Ed25519 签名、承诺根, 以及每个披露字段的 Merkle 证明。随后它会说明哪些字段已被 披露,哪些已承诺字段仍保持隐藏。这是加盐承诺 披露,而非完全零知识,但它使隐私声明变得具体: 审计者可以验证选定的事实,而无需接收完整的工具载荷或 敏感的桌面上下文。
你可以在不披露记录的情况下对其证明一项 CLAIM。铸造一份针对 整个记录的签名、位置盲证明,仅披露每个决策的 类别(收据摘要、裁决、能力标签),绝不披露你的工具 输入、输出或数据:```bash
npx protect-mcp claim --no net.egress
任何人都可以离线验证它,只看到类别,永远看不到内容:```bash
npx protect-mcp verify-claim claim-<id>.json
验证方会在披露集合上重新计算 Merkle 根,并独立重新计算谓词,因此发行方无法在给定披露的情况下对声明撒谎。添加 --anchor 可将声明的摘要记录到公开、仅追加的 ScopeBlind 透明度日志中,这样不信任你的交易对手就能确认披露集合是完整的,且没有被悄悄重新裁剪(仅发送哈希值;记录保留在本地):```bash
npx protect-mcp claim --no net.egress --anchor
这是一种可问责、位置盲的证明,而非完全零知识:它揭示的是形状,而非内容。
## 60 秒内试用(无需 agent)
[](https://scopeblind.com/film)
在 [scopeblind.com/film](https://scopeblind.com/film) 观看两分钟影片,然后针对你自己的副本重放:```bash
npx protect-mcp sample # seed a labeled sample record (8 decisions: 1 blocked, 2 payments)
npx protect-mcp record # open it: signatures verified in your browser
npx protect-mcp claim --payment-under 100 --anchor --output payments-under-100.json
npx protect-mcp verify-claim payments-under-100.json
npx protect-mcp anchor-record
将生成的 demo-tampered.jsonl 拖入记录页面,即可看到签名后的编辑被捕获。sample 拒绝触碰已存在的记录,因此请在空文件夹中运行它。当你准备好进行实际操作时,接入下面的门控,相同的命令将针对你自己 agent 的记录运行。
npx protect-mcp init-hooks
npx protect-mcp serve --enforce --cedar ./cedar
一次性评估,即 PreToolUse 钩子调用它的方式。退出码 2 表示拒绝
(工具被阻止);退出码 0 表示允许:```bash
npx protect-mcp evaluate --cedar ./cedar --tool Bash --input '{"command":"rm"}'
echo $? # 2 -> denied, fail-closed
npx protect-mcp evaluate --cedar ./cedar --tool Read --input '{"path":"README.md"}'
echo $? # 0 -> allowed
缺少或无法加载的策略会拒绝(退出码 2),除非你显式传入
--fail-on-missing-policy false。
protect-mcp init-hooks 会为你写入一个 .claude/settings.json。若要手动
接入该门禁,你需要用到的两个动词是 evaluate(PreToolUse,以退出码 2 阻断)
和 sign(PostToolUse,记录回执)。Claude Code 会以 JSON 形式通过 stdin 将
调用交给 hook,并且不会设置 TOOL_NAME 或 TOOL_INPUT 变量,因此请传入
--format claude,不要传入关于该调用的其他任何内容:门禁会从载荷中读取
tool_name 和 tool_input,在拒绝时它会将原因作为
hookSpecificOutput.permissionDecisionReason 返回给模型,同时以退出码 2 退出。
请固定版本,以便 Claude Code 会话始终运行你测试过的门禁:```json
{
"hooks": {
"PreToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "npx [email protected] evaluate --cedar ./cedar --format claude"
}
]
}
],
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "npx [email protected] sign --format claude --receipts ./receipts --key ./keys/gateway.json"
}
]
}
]
}
}
### 将已签署的标准置于生效状态,并让记录落在其页面上