全栈开发 / AI 系统工程

Agent 权限与未知终态恢复工作台

用真实 MCP 协议网关和确定性故障状态机验证 Agent 写操作的可信身份、租户隔离、一次性审批、审计、幂等意图与未知终态恢复。

2026-07 - 持续迭代当前代码
  • Node.js
  • MCP TypeScript SDK
  • Zod
  • Node Test Runner
  • JSON
  • GitHub

Reuse contract

复用合同

已独立复现JSON 清单
最近核验
2026/07/19
固定版本
83952b3bae58
代码入口
project-kits/ai-engineering-workbench/README.md公开副本固定源码

输入

  • 认证层提供的 principal、tenant、resource 与 scopes,不接受 tool arguments 自报身份
  • 包含 expectedVersion、一次性 approvalId 和幂等键的有限写操作
  • dispatch 前失败、commit 后响应丢失、权威状态分叉等固定故障场景

输出

  • 策略允许或拒绝决定、最小化审计事件和经过 schema 校验的上游结果
  • 权威记录版本、上游 mutation 次数与租户隔离断言
  • succeeded、blocked、failed 或 unknown 终态及是否需要人工处理

可执行命令

mcp-gateway-test测试
npm run lab:mcp:test
平台
macOS、Linux 或 Windows;离线 Node.js
权威输出
TAP stdout;从网关返回、上游调用次数、租户记录和审计阶段共同判定
副作用
不修改状态
前置条件
  • Node.js >=22.12.0
  • 仓库根目录已安装锁定依赖
mcp-gateway-demo采集
npm run lab:mcp-gateway
平台
macOS、Linux 或 Windows;离线 Node.js
权威输出
stdout 中的确定性 MCP 权限网关 JSON 示例
副作用
不修改状态
前置条件
  • Node.js >=22.12.0
  • 仓库根目录已安装锁定依赖
agent-recovery-test测试
npm run lab:agent-recovery:test
平台
macOS、Linux 或 Windows;离线 Node.js
权威输出
TAP stdout;11 个故障场景及工件 replay/hash 断言
副作用
不修改状态
前置条件
  • Node.js >=22.12.0
  • 仓库根目录
agent-recovery-capture采集
npm run lab:agent-recovery:capture
平台
macOS 或 Linux;离线 Node.js
权威输出
/tmp/younis-ai-lab-agent-recovery.json
副作用
会修改运行环境
前置条件
  • Node.js >=22.12.0
  • POSIX /tmp 可写

可直接复用

  • 为 CRM、工单或知识库 MCP server 增加业务侧身份、租户和参数授权
  • 为不可逆或高价值工具调用增加一次性审批与并发版本保护
  • 把超时后的盲重试改为幂等查询、权威对账和人工接管状态机

明确边界

  • 身份注入、ApprovalStore、审计、记录和恢复状态均为内存实现,不是生产 IAM 或分布式事务。
  • 确定性故障注入不证明真实网络能够判断请求是否越过 dispatch 或 commit 边界。
  • 没有验证数据库持久化、跨进程并发、durable outbox、速率限制、撤销和长期运行。

固定结果工件

  • MCP 网关状态变更示例mcp-gateway-demo-result
    仓库路径
    labs/mcp-policy-gateway/results/2026-07-13-demo.json
    SHA-256
    e608eb2cd3e341b9e5530671670bb951f5a19065d1c080eea9483b22a1cc0586
    生成/验证命令
    mcp-gateway-demo
  • 未知终态 11 场景结果agent-recovery-result
    仓库路径
    labs/agent-recovery/results/2026-07-13-results.json
    SHA-256
    2831d4c8cd6b051c20b06fdbf62cb4bc775c6cd7752ee24b4f35e7cc26c63bc5
    生成/验证命令
    agent-recovery-capture

项目问题

MCP 能统一 Agent 连接工具的方式,却不会自动回答“谁能以什么参数改变哪个租户的哪条记录”。同样,工具调用超时也不意味着操作失败:请求可能没有送达,也可能已经提交但响应丢失。若系统把两种情况都直接重试,权限缺口和重复副作用会叠加。

本项目把这两个问题放进同一条写操作生命周期:调用前由权限网关决定是否允许 dispatch,调用后由恢复状态机根据幂等记录和权威状态决定成功、失败、unknown 或人工接管。

两个可独立复用的 lab

labs/mcp-policy-gateway/ 使用官方 MCP SDK 建立测试 Client、Gateway 和模拟记录存储 Server 三个角色。Gateway 对外暴露 records.readrecords.update,上游只暴露 storage.readstorage.update。可信 authInfo 提供 principal、tenant、resource 与 scopes;arguments 中伪造身份或租户会在 schema 边界被拒绝。

写操作审批绑定 principal、tenant、tool、规范化参数和 policy version,并要求 expectedVersion。审批在上游调用前同步消费,不能作为 MCP tool 由 caller 自批;并发复用最多一个请求进入上游。审计只保存参数键和哈希。写前 allow 事件无法落盘时 fail closed;上游成功后终态审计失败则进入内存待投递队列,避免把真实成功误报为拒绝。

labs/agent-recovery/ 不重复实现 MCP,而是抽出副作用恢复状态机。相同幂等键只能对应相同 principal、tenant、tool、desiredStatus 和 expectedVersion。确定未 dispatch 的故障允许一次安全重试;commit 结果不明确时停止自动重放,读取权威记录。若状态已经达到目标则对账为成功,若之后发生分叉则保持 unknown 并要求人工处理。

运行与验收

npm run lab:mcp:test
npm run lab:agent-recovery:test

MCP 测试从 Gateway 返回、上游调用次数、两个租户的记录值与版本共同验收策略,不只检查一段模型可见文本。冻结 TAP 与 demo JSON 记录了网关结果。

恢复实验冻结 11 个场景,结果为 4 succeeded、4 blocked、2 failed 和 1 unknown;意外重复 mutation 为 0,unknown 后的不安全自动重试为 0。该结论只对应固定内存模拟器,但能够作为真实业务状态机的回归合同。

接入方式

接入真实系统时,先将业务身份映射到网关可信上下文,再为每个 tool 定义 resource、scope、tenant、参数 schema 和副作用等级。只读工具可以直接经过策略;写工具还需一次性审批、expectedVersion、稳定幂等键和可查询权威状态。

生产实现必须把审批、幂等记录、业务状态与 outbox 持久化,并明确 dispatch 与 commit 的可观察边界。上游若没有幂等查询或权威结果接口,恢复状态机无法凭超时错误推导真实终态,应直接进入人工队列。

尚未证明

当前两个 lab 都是本地 reproduced 证据。InMemoryTransport 中的认证身份由测试夹具固定,策略、审批、记录和审计没有跨进程持久化。项目没有完成 OAuth token 验证、真实数据库事务、网络分区、长期并发、跨服务撤销或真实用户任务,因此不能把当前结果写成生产可靠性或 exactly-once 保证。

Research links

关联文章

这些文章分别提供问题背景、设计依据、实验验证或运行证据。

  1. 发布 2026/06/28

    本文把 Agent 收敛为固定工作流中的局部决策,并提出窄工具 schema、写操作审批、审计与失败恢复;本项目将这些原则具体化为 MCP 权限网关和未知终态恢复状态机。

  2. 本文将行动回路定义为任务身份、资源范围、窄工具 schema、审批、幂等执行、权威结果验证与恢复;本项目把这套控制面设计实现为 MCP 权限网关和未知终态状态机。

  3. 本文说明 MCP 只统一连接契约,身份、授权、审批、审计和恢复必须由外部控制面承担,为本项目划定系统边界。

  4. 本文逐项重放 MCP 网关的默认拒绝、租户注入、一次性审批、版本冲突和审计故障,并以模拟上游终态验收。

  5. 本文用 11 个故障场景验证安全重试、幂等意图绑定、权威对账和 unknown 后不自动重放。