为常关闭的 Mac 应用做 MCP server:一位开发者的踩坑长文

roaringfantong · reddit · 2026-11-03

作者维护一个被 Claude Desktop/Claude Code/Codex 通过 MCP 驱动的 Electron Mac 应用,难点是 MCP 客户端要求一个常驻 stdio 命令而应用通常没开,于是他写了个 stdio broker,并踩了一连串坑:- 用 ELECTRONRUNASNODE=1 复用应用自带的 Electron 运行时跑 broker,仅 12MB(空 Electron 约 45MB);配一个 58KB 的 Swift launcher 定位运行时,避免了打包 Node 的 141MB。- 签名会改动二进制导致 manifest 校验和永远对不上,最终干脆去掉校验——macOS 本身会把 helper 封进应用签名并在启动时校验。- broker 生命周期与客户端等长(人们不退出 Claude Desktop),需握手检测过期 broker;版本号比较会在开发构建时误杀,改为「版本+工具结构」双双变化才拒绝。- broker 自留工具 schema 副本会在更新后按旧校验丢弃新参数,最终改为向运行中的应用实时取工具列表、参数透传由应用自校验,通过 hash 变化发 notifications/tools/listchanged;应用关闭时才回退本地副本。- 超过 45 秒的任务先返回 run id,用 waitforrun 工具收结果,绕开 Claude Desktop 约 1 分钟的调用超时。- 处理了双开应用抢 socket、更新替换 broker 而旧应用仍在跑等边缘情况,错误提示也从裸 client ID 改为「退出并重开 Claude」。

原文链接 →

「编程与Agent」频道最新

更多「编程与Agent」频道 AI 资讯 →