面向 AI 代理工具调用的故障关闭式 Cedar 策略门禁,外加签名回执。
protect-mcp 是一道位于 AI 代理工具调用之前的门禁。它会根据 Cedar 策略评估每一次调用,在违反规则的调用运行之前将其阻止,并为每一次决策签署一份可离线验证的 Ed25519 回执。所配置的网关在本地运行,不发送任何决策遥测数据。独立的协调适配器连接到 ScopeBlind 的托管协作服务;其请求和返回记录的数据路径如下所述。两者均采用 MIT 许可。
对于共享仓库协作,请使用客户项目:各方就任务简报和限制达成一致,代理准备审查,双方在所有者接收方能够更改仓库之前批准一个确切的版本。下方的仓库工作流包含设置步骤和五个有边界的代理工具。
would_deny: true,因此失败绝不会悄无声息。serve --enforce 和 doctor 会运行启动自检,除非它们能够证明某个已知被禁止的操作确实被拒绝,否则拒绝武装门禁。无法证明其会拒绝的门禁不会启动。@veritasacta/verify 离线验证。签名验证无需网络查询。关于执行的声明仍然取决于所标识的门禁操作者。# 1. Generate an Ed25519 keypair, config template, and sample policy.
npx protect-mcp init
# 2. Print a shadow-mode client configuration, then apply it in your MCP host.
# This command prints configuration and exits; it does not launch the server.
npx protect-mcp wrap -- node your-mcp-server.js
# 3. Reopen the host and use its tools, then inspect the local-only dashboard.
npx protect-mcp dashboard --open
# 4. Draft a reviewable policy from observed calls.
npx protect-mcp recommend --write
# 5. When reviewed, restart the wrapper in enforce mode with that policy.
npx protect-mcp --policy protect-mcp.recommended.json --enforce -- node your-mcp-server.js
对于 Claude Desktop,先运行一次 dry-run 配置补丁,然后再应用它:
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 服务器运行:
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:
{
"mcpServers": {
"protect-mcp": { "command": "npx", "args": ["-y", "protect-mcp", "mcp"] }
}
}
回执与网关在运行时签名的回执字节兼容,因此在此处生成的回执使用相同的 Acta 信封。验证能力和规范化兼容性取决于验证器版本;对于下文描述的一致性行为,请使用网关的 verifyReceipt API。
此源代码树修复了 0.14.0 及之前版本中存在的整数键排序缺陷:签名和链哈希现在使用直接 JCS 成员输出,保留网关的 ASCII 对象键配置。形如数字的键(如 "10")排在 "2" 之前,包括在嵌套对象内部。非 JSON 值和无效 Unicode 会被拒绝。
编码未发生变化的普通 JSON 回执仍可验证。使用旧数字键顺序签名的历史回执会被报告为 legacy_non_jcs_signature;严格验证不会将其视为有效的 JCS。如需进行显式的历史兼容性检查,请使用 verifyReceipt(receipt, publicKey, { allowLegacyNumericKeys: true }) 并检查 canonicalization 和 warning 字段。此时其 hash 为原始的历史哈希。请保留原始回执和链链接:使用 receiptHash 重新计算旧数字键回执现在会生成其 JCS 哈希,并可能破坏历史链。这些更改包含在 0.15.0 中。
版本 0.25.0 包含一个可复用的 agent 配置文件。打开
通过你的 agent 开始
以获取带有服务所显示授权密钥的设置命令。在连接之前,请对照可信来源核对该密钥。例如:
npx --yes [email protected] coordination agent setup \
--client claude-code \
--profile ~/.scopeblind/agent.json \
--endpoint https://scopeblind.com/api/coordination \
--authority-key PINNED_64_HEX_AUTHORITY_KEY
使用 --client codex 或 --client json 获取对应的注册说明。
设置过程会打印配置;在你的客户端中应用该配置,然后重新打开该客户端。
私有配置文件保存一个代理密钥和单独限定范围的连接,文件权限为 600。设置过程不授予任何任务权限,也不复制任何人类浏览器密钥。注册的服务器运行 coordination agent --profile FILE。
让你的代理准备一个共享发票任务供你审核。工具流程如下:
coordination.prepare_task({request_id, draft}) 保存一份未签名的草稿,并
返回一个供你使用的私有审核链接。重试时保持相同的 request_id。
草稿包含标题、目标,以及可选的提议限制、假设和私有偏好。
它不会创建房间或人类权限。coordination.inspect_task_request({request_id}) 检查该审核。
coordination.claim_task_connection({request_id}) 认领确切的已授权
授予并返回一个 connection_id。然后在提议或测试之前调用
coordination.inspect_negotiation({connection_id})。coordination.check_handoffs({connection_id}) 发现该授权;
coordination.claim_execution_connection({connection_id, handoff_id}) 保存
一个新的执行连接。在提交支付之前检查其返回的 connection_id。
协商令牌永远不会变成支付令牌。配置文件中的每个限定范围工具都需要显式的 connection_id;使用
coordination.connections 列出已保存的连接(不含凭据)。配置文件
在认领之前保留令牌,因此不确定的回复可以用相同的 ID 恢复。
初始配对窗口最长持续十分钟。如果该
窗口或授予过期,原始人员必须在当前限制下明确重新连接
同一配置文件。缺失的配置文件需要重新授权。
一个配置文件最多保存 50 个请求和 50 个连接;请保持其私密。
现有的单房间连接仍然可用。在设置配置文件后,使用
coordination agent import --profile FILE --config OLD_PRIVATE_CONFIG 导入一个。
导入会保留其范围,且无法重建被旧版配对丢弃的
私有代理密钥;该连接无法认领同密钥的执行交接。
草稿文本和私有指令会发送到 ScopeBlind。你的代理的模型 提供商可能会收到工具结果,包括你自己授权的私有简报。 托管助手会收到其自身委托人的简报以及共享记录。 无论是配置文件设置还是已停止的客户端,都不会运行后台代理或模型。
从原始授权浏览器上的任务中,选择 在另一台设备上继续。 在你的手机上打开或扫描其链接,请求访问权限,并在两台设备上 比对显示的代码。原始浏览器签署确切的手机密钥、 房间、权限和过期时间。仅凭链接或二维码不授予任何权限; 每台设备保留自己的私有签名密钥。
访问权限最长持续七天或至任务过期,以先到者为准。根据 所选范围及该人员现有的角色,手机可以检查任务、 批准或拒绝一笔确切的支付、接受或请求对其确切结果的更改, 并签署自己的协商授权或确切的已测试方案决定。它不能 创建任务、邀请人员或代理、启动托管模型、采纳规则、执行 支付,或委托给另一台设备。未来的协议和审核者角色 签名仅在该确切共同审核的提案范围内被允许。它们 不会将手机访问权限带入新任务。
原始浏览器或已链接的设备可以撤销该设备的访问权限。 撤销会阻止新操作;它不会抹除有效的先前决定。 证据保留实际设备签名者、原始委托人的已签名 授权,以及服务的已签名授权使用回执。可移植的 协商、结果和演练验证会检查所需的谱系。 这些签名标识密钥,而非经过验证的现实世界身份。
你的决定 读取 由此设备认证的当前工作。打开一个项目会再次检查当前 请求;已过期或被取代的决定无法授权已更改的 支付或结果。可选的浏览器提醒不包含任何任务详情或 凭据,会打开此收件箱,且绝不会批准工作或唤醒外部代理。 送达取决于浏览器、操作系统和主机配置。在 iPhone 或 iPad 上,将 ScopeBlind 添加到主屏幕,链接该应用的设备密钥, 并在那里启用提醒。可以在不更改任务 权限的情况下关闭提醒。
protect-mcp 版本 0.25.0 将你安装的代理连接到与共享房间相同的准入和
样本账本服务。在
ScopeBlind 启动一个房间,然后选择 使用你
自己的代理 → 创建配对码。这是一个虚构的发票沙盒;不会转移真实
资金。
该版本以版本化包的形式从 scopeblind.com 分发。其 SHA-256 校验和 随其一同发布。在你的终端中运行该房间的命令。对于单个连接:
npx --yes [email protected] coordination pair
在提示时粘贴私有代码。它绝不是命令行参数或 URL 参数。该命令会生成独立的代理密钥和凭据,在认领前保存待处理状态,验证所有者授权和固定服务确认,然后将完成的连接存储到 ~/.scopeblind/coordination.json 中,权限为 600。配对码最多持续十分钟;生成的连接最多持续 24 小时。所有者可以在房间中撤销它。如果响应丢失,请使用相同的配置文件重新运行相同的命令,以恢复相同的注册。
对于多个房间,请使用浏览器中显示的特定于房间的 --config 路径。现有配置绝不会被替换为不同房间的凭据。
成功配对后,会直接打印 Claude Code 注册命令。要再次打印它:
npx --yes [email protected] coordination setup --client claude-code
在你使用 Claude Code 的项目中运行它打印的命令。它会在本地作用域中注册一个 MCP 服务器,使用私有配置的路径,且命令或客户端设置中不含任何凭据。重启 Claude Code 并检查 /mcp,然后询问:
检查 ScopeBlind 发票房间及其采购订单。在约定的限制内完成允许的工作。在需要时请求精确批准;继续处理其他发票,然后使用 coordination.wait 等待决策。交付已完成的结果供接收方审核。
setup --client json 会打印标准的 mcpServers 配置,供手动与其他客户端配合使用。使用 setup --client codex 进行 Codex CLI 注册。这些命令会打印配置,不会编辑你的客户端设置。对于 Claude Code,请参阅其官方 MCP 文档。
MCP 工具包括:
coordination.inspect:检查所有者签署的协议、发票、采购订单、预算、当前和历史操作以及修订指令。ledger.pay:提交精确的 operation_id、invoice_id、amount_minor、currency(USD)和 destination。实时房间还需要来自 inspect 的 fixture_revision。适配器在执行前验证已签署的准入,并在执行后验证已签署的结果。coordination.wait:将 inspect 返回的事件 cursor 作为 after_cursor 传入。该工具最多等待 30 秒,每两秒检查一次变更,检查之间不调用模型。它返回 changed 或 waiting、当前 run/cursor 以及需要注意的事项。超时后,活跃会话可以再次等待;恢复取决于 MCP 客户端。此工具不发送推送通知;可选的浏览器收件箱提醒是独立的。取消和断开连接会停止活跃的等待。coordination.deliver:提供已检查的 run_id,并在所有工作都有记录的处置结果后冻结结果。服务会拒绝未解决的工作。接收方单独接受精确结果或请求修订。