HTTP MCP 断线不再重复发送:只有只读或幂等工具会被重试
接了远程 HTTP MCP 服务器的人,可能碰到过这种怪事:让 Claude 建一个工单、发一条消息或者插一行数据,结果对面出现了两条一模一样的记录。
CLI 2.1.307 的更新说明里正好有一条对应的修复:HTTP MCP 工具调用在连接中途关闭时会被发送两次,这个问题修掉了。
问题出在哪
网络请求的老难题:请求已经发出去,连接却在响应回来之前断了。客户端不知道服务器到底有没有执行,最省事的做法就是「再发一次」。
对读操作来说这没问题,查两次结果一样;但对写操作,重发一次就可能真的多执行一次。以前 Claude Code 对 HTTP MCP 的处理就属于前者的思路,不区分工具类型,于是写操作也会被重放。
现在的规则
修复后的行为是:连接中途关闭时,只有只读或幂等的工具会被自动重试。其他工具不再自动重发,而是把失败交回给会话处理。
- 只读:比如搜索、查询、读取文件,重试不改变任何状态;
- 幂等:执行一次和执行多次效果相同,比如「把某个字段设为某个值」;
- 其他写操作:创建、追加、发送这类,不再被悄悄重放。
至于 Claude Code 怎么判断一个工具是只读或幂等,更新说明没有展开。按 MCP 协议,服务器可以在工具定义上声明只读、幂等之类的提示(tool annotations),我们推测判断依据就是这些声明,但这一点以官方文档为准。
对 MCP 服务器作者的建议
如果你自己维护 HTTP MCP 服务器,这次修复提醒了一件事:把工具的性质如实声明出来。
- 纯查询类工具标成只读,断线后能自动恢复,体验更顺;
- 真正幂等的写操作(例如按 ID 更新)标成幂等,同样能享受重试;
- 不幂等的创建类工具不要乱标,否则又会回到重复执行的老问题。
服务器端如果能接受客户端传来的去重键(比如请求 ID),再加一层服务端去重会更稳,这属于通用的接口设计做法,不依赖 Claude Code 的具体实现。
同版本的另外两个 MCP 修复
2.1.307 还顺手修了两个让 MCP「看起来坏了」的场景:
- 电脑休眠:macOS 或 Linux 在 MCP 服务器连接过程中进入睡眠,醒来后服务器会被报告为超时,在无头运行(headless)里还会一直保持失败状态。现在不会了。
- macOS 钥匙串锁定:在
claude -p里,如果登录钥匙串被锁,MCP 服务器以前只显示「needs authentication」,让人以为要重新登录。现在会说明真实原因,解锁后的下一次运行可以直接连上,不需要重新授权。
另外还有一条:后台任务运行时,某一轮有时拿不到 SDK MCP 服务器的最新工具列表,也一并修复了。
小结
- 2.1.307:HTTP MCP 调用中途断线时,只重试只读或幂等工具,写操作不再被执行两次;
- 服务器作者应如实标注工具的只读、幂等属性;
- 休眠导致的超时、钥匙串锁定导致的误报认证,同版本一起修好。
之前遇到过重复工单、重复消息的团队,升级到 2.1.307 后可以再观察一下,大概率就不会再出现了。