通过MCP服务器实现子Agent的加密级权限管控,限制工具范围、用量和生命周期,防止密钥滥用。
在 CrewAI、LangGraph、AutoGen 或 Claude sub-agent 架构中创建一个子代理,然后检查它实际持有什么:你的凭证。父级密钥,以完整权限、永久有效。你创建出来用于总结三份 PDF 的这个一次性代理,可以调用编排器能调用的所有工具,而唯一的"撤销"方式就是一次性轮换所有密钥。
我们接受这种设计,是因为给孩子少于一切向来很难:OAuth 范围需要一个授权服务器(还得有人运行它);角色系统需要一个管理员;API 密钥无法细分。所以整个生态圈默默标准化了"复制父级环境"然后继续前行。
这里提出一种不同的形态,作为一个运行在本地 MCP 服务器:
npx -y @grantor/mcp serve
# 或者接入 Claude Code:
claude mcp add grantor-mcp -- npx -y @grantor/mcp serve
这为任何支持 MCP 的框架提供五个工具。完整的模型可以塞进一段对话记录:
grant {tools: ["search","fetch"], max_uses: 20, ttl_secs: 3600}
→ {child_id: "…", sub: "…"} # 一个受限的子身份
check {child_id, tool: "search"}
→ {allow: true, remaining_uses: 19} # 对每次操作都进行 gate 检查
check {child_id, tool: "write"}
→ {allow: false, code: "CapabilityDenied"} # 未授权 → 拒绝
delegate {parent: child_id, tools: ["search"], max_uses: 5}
→ {child_id: "…"} # 一个范围更窄的孙代理
revoke {child_id}
→ revoked # 权限被撤回
有趣的特性在于你做不到的那些事:
子代理永远无法扩大自己的权限范围。要求 delegate 一个父级没有持有的工具,会在任何签名之前就被拒绝。要求更多使用次数或更长有效期,会被静默地钳制在父级的上限内。这不是策略文件让框架去查询——整个委托链是逐链加密签名的,每次 check 时验证都会重新检查这个收窄的数学过程。
预算真的会耗尽。max_uses: 20 意味着第 21 次 check 会被拒绝并返回 UsesExhausted,而不是记录后放行。
撤销是真实有效的。在你自己的租户内,revoke 会在一个公开的智能合约上更新撤销纪元;该批次中的每个 capability 无论被哪个进程持有,都会在下一次 check 时失败。
而这让它不同于你见过的每一个"策略引擎"的关键区别:这里没有服务器。没有授权服务,没有策略后端,没有厂商 API 在热路径上。权威锚定在 Base 上的一个公开注册表合约;验证是一个本地计算加一次任何 RPC 提供商都能服务的 eth_call。代理运行在你的机器上,在它守护的框架旁边,并持有子密钥,这样你的 agents 永远看不到密钥材料。
上面的零配置运行之所以可行,是因为这个包指向了生产注册表上的一个实时的共享沙盒租户——真链、真验证、一个按需发布的演示密钥,只控制沙盒内部而不控制任何外部的东西。诚实的限制:这是一个未经审计的开发者预览版,沙盒代理自行签发其防重放挑战(它在同一进程中既是持有者也是验证者),使用量计量在代理本地。
生产环境只需一次合约调用(Base 上的 USDC,无需注册——你的 agent 甚至可以读取机器可读的入门清单并自己完成)。文档:https://chaingrantor.com/docs/guide/mcp-broker
MCP 标准化了 agents 能调用什么。A2A 标准化了他们如何对话。没有人标准化他们被允许做什么——这正是这个层要填补的空缺。