深入探讨 MCP 在 AI agent 中的工具调用风险(创建用户、删表、转账等),以及第一步失败后的恢复和调试方案。
AI agent 不再只会说话。它们现在会做事——通过工具:创建数据库用户、发送电子邮件、扣款、删除表。这正是 Model Context Protocol (MCP) 的全部意义:一种向 AI 提供真实工具的通用方式。
这很强大。但也有点令人害怕。
2025 年 7 月,一个 AI 编码 agent 著名地删除了一家公司的生产数据库。基于名称的混淆——prod vs staging——正是快速、自信、握有工具的 agent 会犯的那种错误。最难受的部分是:在多步任务中,当第 4 步失败时,第 1-3 步已经在真实系统中提交了。没有 Ctrl+Z。
编排器(Temporal、Restate、LangGraph)在你自己的工作流代码中解决这个问题。但 MCP 服务器没有声明式的、协议级别的方式来说:"这个工具会变更数据,它的逆向操作是那个其他工具,用这些参数。"
所以我构建了一个。它叫 ChronoMCP,采用 MIT 许可,只需一次 npm 安装。
ChronoMCP 是一个位于任何 MCP 客户端和任何 MCP 服务器之间的代理。将你的客户端指向它,一切都原样通过——直到工具调用有风险。然后它:
服务器声明每个工具如何撤销它——通过一个开放扩展 mcp-compensate:
{
"name": "create_record",
"_meta": {
"dev.chronomcp/compensate": {
"reversibility": "compensable", // "readonly" | "compensable" | "irreversible"
"compensation": {
"toolName": "delete_record",
"parameterMapping": { "id": "$.output.structuredContent.id" } // static path only
}
}
}
}
现在守卫服务器并打开 saga 模式:
npm install -g chronomcp
chronomcp guard --mode gate --saga -- node examples/server-demo/server.mjs
当 agent 运行 create_record(成功)然后 charge_payment(失败),ChronoMCP 倒回已完成的步骤并在 agent 看到错误之前补偿它们:
! ChronoMCP: 'charge_payment' failed — starting rollback of 1 step(s)…
✓ create_record: compensated (via delete_record)
回滚路径中没有 LLM。补偿工具和它的参数是静态声明。为什么?因为"撤销"的那一刻正是被提示注入的 agent 想要临时发挥的时候("既然你在做这个,也删除那个吧")。确定性回滚无法被说服做任何事。
补偿 ≠ 撤销,我们就这么说。已发送的电子邮件不能取消发送;已结算的付款不会因为退款而反向。ChronoMCP 从不假装。不可逆操作在你批准前就被声明和标记——而不是作为失败后的意外:
│ [DANGER] db-mcp → drop_table
│ table: customers_prod ← a human catches this in one second
│ reversible: NO — IRREVERSIBLE effect declared by the server
Approve? [y/N]
这种诚实是特性,而不是限制。
因为它可以与任何 MCP 服务器配合工作而无需重写你的 agent,而且它是透明的——忽略元数据的客户端仍继续工作。它是你在已构建的任何东西前面添加的安全带,而不是你在其上重建的框架。(我写了一篇完整、诚实的 vs 编排器的比较——它们通常是互补的。)
GitHub: https://github.com/chronomcp/chronomcp (规范 + 零依赖 CLI + 演示服务器,70 个测试)
npm: npm install -g chronomcp
网站 + 指南:https://chronomcp.dev
mcp-compensate 规范是一个面向 MCP SEP 流程的社区草稿。如果你编写 MCP 服务器,我真诚地欢迎严厉反馈——特别是如果这个词汇不适合你的工具。开启一个 issue 让我知道它在哪里不适用。
如需进一步操作,你可以考虑屏蔽此人和/或举报滥用