断线一刻,重试策略比带宽更重要
用 Claude Code 挂 HTTP MCP(邮件、工单、支付、云资源、自家业务 API)时,最常见的惊吓不是「连不上」,而是:工具已经执行成功了,客户端却以为失败,又自动重试一次。只读查询多跑一遍通常无害;创建订单、发消息、改配置再跑一遍,就可能变成双份结果。
社区同步的方向很明确:较新的 Claude Code 版本里,HTTP MCP 的自动重试更偏向只读或幂等调用;会改远端状态的写操作,不再被悄悄连发两遍。你本地能做的,是把工具设计和机器环境对齐这套语义——而不是假定「永远不断线」。
claude --version 与官方说明为准。准备清单
- 一台常开的 Mac mini(整机独享),已装 Claude Code,并用你自己的账号登录
- 至少一个通过 HTTP 暴露的 MCP 服务(自建或第三方均可)
- 终端能 SSH 进机器;需要桌面时用 UU 远程连接
- 一张纸或仓库里的
MCP-TOOLS.md:列出每个工具是「只读 / 幂等写 / 非幂等写」
步骤一:先给每个 MCP 工具贴标签
打开 MCP 配置(常见在项目或用户目录的 Claude Code 配置里),把当前启用的工具列成表:
| 标签 | 例子 | 断线后自动重试是否可接受 | |------|------|--------------------------| | 只读 | 查余额、列工单、读文件元数据 | 通常可以 | | 幂等写 | 带幂等键的「创建或更新」、按固定 ID upsert | 可以(同一键多次结果一致) | | 非幂等写 | 无键的「新建」、发邮件、触发扣款、append-only 日志 | 不要依赖静默重试 |
做法:
- 在仓库建
docs/MCP-TOOLS.md(或 Skills 里一份短说明),只写工具名、标签、副作用一句话。 - 给 Claude Code 的项目规则里加一句硬规矩:未标注幂等的写工具,断线后先查状态再决定是否手动重跑,禁止盲目重试。
- 升级 Claude Code 后,用一次可控的测试会话确认:故意掐断只读调用与带幂等键的写调用,观察是否出现双份副作用。
这样客户端策略再严,你自己也不会在「半成功」时手滑点第二次。
步骤二:写操作一律带幂等键(或固定业务 ID)
「幂等」不是口号,是协议:
- 客户端生成
Idempotency-Key(或等价字段):UUID 即可;同一用户意图、同一次确认只用同一把钥匙。 - 服务端按键去重:已成功则返回第一次的结果;处理中则返回进行中状态;失败且可安全重放的再允许重试。
- Claude 侧把钥匙写进进度文件:例如项目里的
notes.md或RUN.md追加一行「已提交 key=… / 工具=create_order / 时间=…」,新会话先读再动手。
示例(伪代码,按你的 HTTP MCP 适配):
# 会话开始时生成一次,整段任务复用
IDEMPOTENCY_KEY=$(uuidgen)
echo "idempotency_key=$IDEMPOTENCY_KEY" >> ./RUN.md
MCP 工具参数里带上同一字段。没有服务端去重时,至少做到:重试前先用只读工具按业务 ID 查询是否已存在,存在就跳过创建。
步骤三:把「会改状态」的工具从自动路径里拿开
即便客户端已限制重试范围,仍建议分层:
- 只读工具:可以进日常 allow 列表(路径与工具名以你本机权限配置为准),方便 agent 调查。
- 幂等写:允许在无人值守流水线里调用,但必须带键;日志里打印键与响应摘要。
- 非幂等写:保留人工确认,或拆成「准备草稿 → 人点确认 → 执行」两步;不要和长循环批处理绑在同一条自动链上。
和权限提示相关的实践,可对照 无人值守权限规则:只读与写操作分开,比「全部自动 Yes」更安全。本文焦点是网络半失败时的重复执行,两者叠加更稳。
步骤四:常开机器 + 明确的断线策略
自动重试再克制,会话挂在会睡、会换网的笔记本上,仍然容易在半成功处卡住。把 Claude Code 与 MCP 客户端放在常开的新加坡 Mac mini 上,好处很具体:
- 进程与本机端口不跟着合盖消失:MCP 子进程、本地转发、长会话状态留在同一台机器。
- 你人离开时,机器还在:用 SSH 或 UU 远程连接回去,先读
RUN.md/ 进度文件,再决定要不要补一枪。 - 断线剧本写死三条(贴进项目规则即可):
- 超时或连接重置后,先只读探测(查资源是否已创建)。 - 已存在则标记完成,不重放非幂等写。 - 不存在且上次带了幂等键,才允许用同一键再调一次。
可选:用 tmux 或 LaunchAgent 保活 Claude Code 会话(见 OOM 与 tmux、LaunchAgent 保活),避免终端一关进度全丢。机器睡眠审计见 pmset 睡眠审计。
步骤五:验收一次「假断线」演练
上线前在测试环境做一轮:
- 对只读工具:调用中途
kill或拔掉测试链路,确认重试后结果仍一致、无多余副作用。 - 对带幂等键的写工具:第一次成功后故意再发同键,服务端应返回同一业务对象,而不是第二条记录。
- 对非幂等写:模拟客户端超时后,禁止自动重放;人工按「先查再写」走完,确认没有双份邮件或双份订单。
- 把演练结论写进
MCP-TOOLS.md的「验收日期」一栏,升级 Claude Code 或 MCP 服务后重跑。
建议验收清单
- 每个 HTTP MCP 工具都有只读 / 幂等写 / 非幂等写标签。
- 非幂等写不依赖静默重试;进度文件能看到幂等键与上次结果。
- 假断线演练中,只读与幂等写行为符合预期,非幂等写无双份副作用。
- Claude Code 与 MCP 跑在同一台常开 Mac mini 上;人离开后可用 SSH 或 UU 远程连接接上。
- 项目规则写明「断线后先查状态」,而不是「失败就立刻再调一遍」。
和 Zumac.Ai 怎么配合
MCP 重试语义最终要落在稳定、常开、你随时能连回去的同一台机器上。笔记本合盖、咖啡厅换网、系统睡眠,都会把「半成功」放大成事故。Zumac.Ai 提供位于新加坡家庭宽带上的实体 Mac mini M6,整机独享,7×24 在线,支持 SSH 与 UU 远程连接,适合把 Claude Code、HTTP MCP 客户端和进度文件长期放在同一环境里跑。新客户整机租用 ¥999/月起(季付 ¥2,697.30,半年付 6 送 1 ¥5,994,年付 12 送 2 ¥11,988);已购买客户续费保持原价。订购与开通走 panel.zumac.ai;方案说明见 首页费用区;使用问题见 帮助中心。需要人工协助可联系 Telegram @singatao。实际延迟取决于你本地的网络线路。
网络不可能永不抖动——把重试留给只读和幂等,把非幂等留给「先查再写」,再配一台不关机的新加坡 Mac mini,断线才不会变成双份账单。
