跳转至

modelcontextprotocol/typescript-sdk

仓库:modelcontextprotocol/typescript-sdk

这个项目在系统里负责哪一层

它负责的是 MCP 在 TypeScript 和 Node 生态里的协议实现。这个项目最大的价值,不是“Node 里也能跑 MCP”,而是非常直接地告诉你:协议层和宿主运行时适配层必须分开看。

很多人一上来就看 Express 或 Hono 示例,然后误以为自己已经理解 MCP。这个仓库最重要的作用,就是纠正这种误会。

先抓整体结构

比较合适的顺序是:

  1. 先看一个 Streamable HTTP 示例。
  2. 再看 stdio。
  3. 回头看 serverclient、运行时适配和 schema 校验的拆分。

只有两种 transport 都看过,你才会知道什么是协议主干,什么只是宿主环境的承载方式。

一条典型执行链

一条链路通常这样跑:

  1. server 通过某种 transport 暴露工具、资源或 prompts。
  2. client 建立连接并协商能力。
  3. client 发现可用对象,按 schema 发起请求。
  4. server 校验输入、执行逻辑并返回结构化结果。
  5. transport 负责把协议消息安全地带过当前宿主环境。

这个过程和 Go SDK 是同一条协议主线,只是宿主环境变成了 Node 生态。

值得学的设计

这个仓库最值得学的是包拆分。serverclient、Node 运行时适配、schema 校验工具被明确分开,刚好对应四件不同的事:协议角色是谁,连接双方怎么互动,宿主环境怎么承载 transport,输入输出怎样被正式约束。

这件事放到工程里很重要。很多团队最后做着做着只剩下“某个 Web 框架 demo 能跑”,问题通常不是框架不好,而是协议边界没立住。

另一个值得注意的是版本成熟度。协议 SDK 演进通常很快,工程选型不能只看概念新不新,还要看稳定分支、迁移成本和上下游兼容性。

适合借回自己项目的点

  • 协议主干和 Express、Hono、Node HTTP 这类适配层拆开。
  • schema 校验不要只靠口头约定,最好成为正式依赖。
  • transport 选择服务互操作性,而不是只服务眼前的宿主框架。
  • 看协议实现时,同时关注版本演进和迁移成本。

不要照抄的地方

  • 不要把某个 Web 示例当成协议本体。
  • 不要只盯 API 表面写法,不看包拆分和版本演进。
  • 不要把宿主框架的便利性误解成协议层已经设计清楚。