自更新机制
YouTeacher MCP 服务端带有一个工具 update_self,让服务端能在一次运行中的会话里自行升级二进制。设计意图是:驱动 MCP 的助手可以拉取最新版本并就地替换,用户不必打开终端。
工作方式
该工具分四步:
- 拉取 tarball。 它向 auth client 已登录的那个 YouTeacher 环境发起
GET /api/mcp-package。这个端点在服务端做了 admin 门禁,会把最新的@youteacher/mcp发布 tarball 流式返回。 - 落盘缓存。 字节写入
~/.youteacher/cache/youteacher-mcp-latest.tgz,缓存目录不存在则创建。 - 覆盖安装全局包。 它 shell out 执行
npm i -g <path>,把缓存的 tarball 装到已有的全局安装之上。npm 会改写二进制入口;内存里已在运行的进程仍跑旧代码,直到退出。 - 退出,让客户端重启它。 工具回应之后约 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 以非零退出,工具会返回错误文本而不退出,因此升级失败时运行中的服务端保持完好。