self-update-mechanism

自更新机制

YouTeacher MCP 服务端带有一个工具 update_self,让服务端能在一次运行中的会话里自行升级二进制。设计意图是:驱动 MCP 的助手可以拉取最新版本并就地替换,用户不必打开终端。

工作方式

该工具分四步:

  1. 拉取 tarball。 它向 auth client 已登录的那个 YouTeacher 环境发起 GET /api/mcp-package。这个端点在服务端做了 admin 门禁,会把最新的 @youteacher/mcp 发布 tarball 流式返回。
  2. 落盘缓存。 字节写入 ~/.youteacher/cache/youteacher-mcp-latest.tgz,缓存目录不存在则创建。
  3. 覆盖安装全局包。 它 shell out 执行 npm i -g <path>,把缓存的 tarball 装到已有的全局安装之上。npm 会改写二进制入口;内存里已在运行的进程仍跑旧代码,直到退出。
  4. 退出,让客户端重启它。 工具回应之后约 250 ms(这段延迟先让响应刷出去),进程调用 process.exit(0)。MCP 客户端——Claude Code、Claude Desktop 或 Cursor——发现服务端死了,会在下一次工具调用时重启它,此刻新装的二进制就生效了。

回应里会报告先前版本、字节数和缓存路径,并提醒:在退出窗口期内发出的工具调用可能短暂报 "server not running",重试一次即可。

为什么是这个形状

MCP 服务端无法热替换自己正在执行的代码——运行中的 Node 进程把旧模块攥在内存里。所以工具不去尝试重新加载,而是借用 MCP 客户端本来就有的一个特性:它会重启一个已经死掉的服务端。退出再重生,把"升级一个活进程"变成了"装好新文件,然后让守护方拉起一个干净的进程"。版本号在工具运行时、安装之前从包自己的 package.json 读取,因此回应能说清替换前跑的是哪个版本。

约束

  • npm 必须在启动 MCP 服务端那个用户的 PATH 上。
  • npm 全局 prefix 必须对该用户可写。nvm 管理的 Node 安装满足这一点;系统级 Node 安装可能需要提权,在这一步会失败。
  • 助手必须等到下一次用户提示再发工具调用,否则会与自我退出发生竞争。

如果包拉取返回非 2xx 状态,或 npm i -g 以非零退出,工具会返回错误文本而不退出,因此升级失败时运行中的服务端保持完好。

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →

self-update-mechanism