当 AI 通过 MCP 调用数据库、浏览器、代码仓库或业务系统时,一个请求往往会被拆成多个连续步骤。只要其中某一步遇到网络中断、进程重启、授权过期或人工审批,整条任务链就可能停止。🚧 因此,真正可用于生产环境的 MCP 应用不能只关注“工具能否调用”,还要解决“中断后从哪里继续”和“任务状态如何可靠保存”两个问题。
一、先明确:连接状态不等于任务状态
MCP 使用 JSON-RPC 消息连接 Host、Client 与 Server,并提供工具调用、进度跟踪、取消、日志和错误报告等能力,具体可参考 MCP 协议规范。但协议层面的会话或连接恢复,并不自动等于业务任务恢复。
例如,AI 正在执行“读取需求文档、生成代码、运行测试、提交合并请求”。即使 MCP Client 重新连接成功,它仍然需要知道哪些步骤已经完成、工具返回了什么结果、下一步是什么,以及前面产生的副作用能否安全复用。因此,应把任务状态独立于网络连接进行持久化。
二、用状态机管理执行生命周期
推荐把每个任务建模为显式状态机,而不是依赖一段不断增长的对话上下文。一个实用的生命周期可以包含:
- pending:任务已创建,尚未执行。
- running:执行器已经领取任务。
- waiting:等待用户授权、外部事件或资源释放。
- retrying:发生可恢复错误,等待重试。
- succeeded:全部步骤完成并通过结果校验。
- failed:达到重试上限,或出现不可恢复错误。
- cancelled:用户或系统主动终止任务。
每次状态变化都应记录发生时间、执行节点、原因和版本号。更新时使用条件写入或乐观锁,避免两个 Worker 同时恢复同一任务,导致工具被重复调用。🔒
三、检查点应该保存哪些内容
断点续执行的核心是检查点。检查点不应只保存“完成到第几步”,还应包含恢复执行所需的最小闭包:
- 任务标识:task_id、用户或租户、创建时间、协议版本。
- 执行计划:步骤列表、依赖关系、当前步骤和后续候选步骤。
- 调用快照:工具名称、参数摘要、MCP Server 标识及请求标识。
- 结果引用:返回内容的摘要、对象存储地址、校验值和过期时间。
- 重试信息:已重试次数、最后错误、退避时间和下次执行时间。
- 控制信息:取消标记、审批状态、锁持有者和状态版本。
大型文件、日志或模型上下文不宜全部塞进任务表。更稳妥的方式是将结构化状态放入事务数据库,将大对象放入对象存储,只在检查点中保留引用和校验值。这样既便于查询,也能控制存储成本。
四、在关键边界写入检查点
检查点至少应出现在工具调用前后。调用前先保存参数摘要、幂等键和状态版本;调用成功后,再保存结果引用并将步骤标记为完成。对于持续时间较长的工具,还可以按阶段记录进度。MCP 的工具机制及交互建议可参阅 官方 Tools 文档。
可靠顺序通常是:读取状态 → 获取执行锁 → 写入调用意图 → 调用工具 → 校验结果 → 保存检查点 → 推进状态 → 释放锁。
如果进程在“工具已执行但结果尚未保存”时崩溃,恢复器必须先查询外部系统,而不是立即重复调用。这也是任务恢复中最容易被忽略的故障窗口。
五、用幂等设计避免重复副作用
断点恢复必然伴随重试,因此所有有副作用的工具都应尽量支持幂等键。可以使用“task_id + step_id + attempt_group”生成稳定键,并由 MCP Server 或下游业务系统保存其执行结果。
对于查询类工具,重复执行通常风险较低;对于发邮件、扣款、删文件、提交代码等操作,则必须采用创建前查询、唯一业务键、条件更新或补偿事务。⚠️ 如果外部系统完全不支持幂等,应把该步骤标记为需要人工确认,不能让恢复器盲目重放。
六、设计可判断的错误分类
并非所有失败都适合重试。超时、限流和短暂网络异常可以采用指数退避并加入随机抖动;参数错误、权限不足、工具不存在通常需要修正输入或重新授权;业务冲突则可能需要重新规划任务。
因此,MCP Server 返回错误时,应提供稳定的错误类别、是否建议重试、建议等待时间和可供用户理解的说明。执行器根据错误类型决定重试、暂停、降级、补偿或终止,而不是简单地“失败后再试三次”。
七、恢复流程与安全边界
服务重启后,恢复器可以扫描长期处于 running 或 retrying 的任务,检查租约是否过期,然后重新获取锁。恢复前应重新验证工具是否仍然可用、参数是否符合当前 Schema、凭据是否有效,以及用户授权是否覆盖后续操作。工具列表可能随权限或服务能力变化,因此不能假设中断前后的运行环境完全一致。
对于高风险步骤,应在界面展示即将调用的工具、关键参数和可能影响,并保留人工拒绝入口。审批结果也必须持久化,否则系统重启后可能重复弹窗,或者更严重地绕过原有审批。🛡️
八、上线前的验证清单
- 在工具调用前、调用中和调用后分别强制终止进程,验证恢复结果。
- 模拟 MCP Server 超时、返回重复响应、Schema 变化和授权过期。
- 检查同一任务被多个 Worker 同时领取时是否会重复执行。
- 确认取消指令能够传播到执行器,并阻止后续步骤启动。
- 记录 task_id、step_id、request_id 和幂等键,形成完整追踪链路。
- 定期清理过期检查点,同时保留必要的审计记录与结果摘要。
总结
MCP 解决了 AI 与外部工具之间的标准化连接问题,而生产级任务可靠性仍需要应用层共同完成。✅ 一套稳健的实践应包括显式状态机、持久化检查点、并发锁、幂等键、错误分类、人工审批和可观测链路。设计时不要只考虑“正常情况下如何执行”,更要逐步追问“如果此刻崩溃,系统如何确认已经发生了什么”。当每个步骤都能被识别、校验和安全重放,AI 工具调用才真正具备可恢复、可审计和可扩展的工程能力。