读 7 月 28 日的发布说明,标题是一次传输层改动:MCP 去掉了 initialize 握手与 Mcp-Session-Id 头,于是任何实例都能应答任何请求。那是使能性的改动,却不是重要的那一个。拿掉长连接,把 Sampling、Roots 与 Logging 一并推上了十二个月的弃用倒计时——正是这三项让 MCP 客户端不只是调用方,而是对等方——同时把 Tasks 降级为扩展。在含糊了十八个月之后,这份协议给自己下了定论:它是一套面向 Web 的工具调用 API,而不是一套双向的智能体协议。
这次到底发布了什么
2026-07-28 这一版在 5 月被锁定为候选版本,随后由 SDK 维护者与客户端实现者验证了十周才正式发布——按这份协议的惯例这是一段很长的跑道,也相当合理地反映了它改动之大。
| 改动 | 含义 | 谁会感觉到 |
|---|---|---|
| 无状态内核 | initialize/initialized 与 Mcp-Session-Id 退场;每个请求在 _meta 里自带协议版本、客户端身份与能力声明。 |
任何跑着不止一个服务实例的人。 |
| 多轮往返请求(MRTR) | 需要调用中途补输入的工具返回 resultType: "input_required";客户端带上 inputResponses 重发。 |
用过服务端发起请求的服务作者。 |
| 基于头部的路由 | 新增 Mcp-Method 与 Mcp-Name 头,网关与 WAF 无需解析 JSON 正文即可路由与计量。 |
把 MCP 放到既有基础设施后面的平台团队。 |
| 可缓存的 list 结果 | 工具、提示与资源列表带上 ttlMs 与 cacheScope。 |
所有人——悄无声息,而且不要钱。 |
| 授权加固 | 授权服务器按 RFC 9207 返回签发者(iss),客户端须在兑换 code 前校验;凭据与其签发者绑定;动态客户端注册(DCR)被弃用,改用客户端 ID 元数据文档(CIMD)。 |
对远程服务做 OAuth 的任何人。 |
| 扩展框架 | Tasks 从内核移出,进入 io.modelcontextprotocol/tasks,改为轮询式,并带上 tasks/update。 |
写长耗时工具的作者。 |
| 弃用清单 | Roots、Sampling 与 Logging 弃用,最短窗口十二个月;旧的 HTTP+SSE 传输弃用,过渡期一年。 | 几乎全落在客户端作者头上。 |
四个一级 SDK——TypeScript、Python、Go 与 C#——在规范发布时即支持新版本,Rust SDK 为 beta。这与以往"规范先落地、SDK 用一个季度追上来"的姿态有实质区别。
无状态内核,以及它值多少
运维层面的回报是立竿见影的
负载均衡器后面的有状态 MCP 服务,是一个披着集成外衣的分布式系统问题。你需要粘性路由,或者共享会话存储,或者两者都要——而它的失效方式是一次重新部署悄悄掐断了进行到一半的会话。无状态把这一整类问题删掉了。实例变得可互换,滚动发布不再是一个事件,横向扩容也不再需要一次设计评审。如果你在任何规模上运营 MCP 服务,这一版是一份实打实的礼物。
另外两处小改动会叠加放大它
基于头部的路由比它读起来更要紧。把方法名与工具名放进 Mcp-Method 与 Mcp-Name,意味着 API 网关可以按工具限流、WAF 可以拦掉危险方法、路由器可以按名字分片——全都不必检查正文,而这恰恰是企业本来就掌握着策略的那一层。可缓存的 list 结果是同一个思路往上挪一层:tools/list 被频繁发出、却极少变化,于是一个 ttlMs 就把一次按会话计的往返变成了一次 CDN 命中。
不占着连接,也能中途补输入
多轮往返请求是让其余改动能活下来的那套机制。过去,一个需要确认或缺参数的工具,要求服务端在执行途中回调客户端,这就要求流保持打开,进而要求会话存在。MRTR 把控制流反了过来:服务端把它需要的东西返回来然后停下,客户端爱怎么解决就怎么解决——问用户、查策略、填默认值——再把答案附上、把原调用重发一遍。
抛开无状态不谈,这本身也是更好的设计。重试是幂等的,待决的问题成了一个你可以持久化的值,而不是一个必须一直活着的回调;一个跑开十分钟才回答的智能体,对服务端没有任何成本。它同时也让客户端作者多干活:一台过去白送的状态机,现在归他们自己维护。
弃用清单才是真正的新闻
Sampling 让服务端可以请客户端代它跑一次模型补全。Roots 让客户端告诉服务端自己文件系统的哪些部分在范围内。Logging 让服务端把结构化日志流回去。三者现在都上了十二个月的倒计时,而三者都依赖那条连接是双向的、活着的。
这三项的共同点
正是它们让 MCP 客户端不只是一个 HTTP 调用方。其中 Sampling 尤其有意思:一个能请求推理的服务端,是智能体循环里的参与者,而不是它伸手去取的一份资源。失去它就划出了一条硬线——模型完全留在客户端一侧,服务端是被你调用的东西,而有意思的智能体行为恰好只住在一个地方。
诚实的读法
它们也确实从未被广泛实现。Sampling 尤其如此:只有一小部分客户端支持,于是服务作者不敢依赖,于是用的人更少,于是更少客户端愿意去做。砍掉生态拒绝采纳的功能,比把它们当作一个永久的星号背下去要健康——而十二个月的窗口是一次认真的弃用,不是一次破坏。但值得把被决定的事说清楚,而不是让它读起来像日常打扫:规范放弃了"客户端作为对等方"这条路。
Tasks 移出内核,是同一个决定的另一个声部
长耗时工作现在是一个扩展——io.modelcontextprotocol/tasks,轮询式,带 tasks/update——而不再是内核关切。轮询是无状态协议的正确形状,也是任何想要推送的东西的错误形状,这一点是自洽的;而扩展框架至少给这个模式一个明确的落脚处,不必再作为"实验性"待在内核里。
那处没人写的授权改动
动态客户端注册(DCR)被正式弃用,改用客户端 ID 元数据文档(CIMD),而对企业部署来说,这是尾巴拖得最长的一条。DCR 让客户端在运行时向授权服务器自我注册,方便,而安全团队讨厌它恰恰就因为这份方便。CIMD 用一份放在客户端自己控制的 URL 上的文档取代运行时注册,于是授权服务器是去解析客户端的身份,而不是接受一次自我声明。
与之配套的还有:授权服务器必须按 RFC 9207 返回签发者、客户端必须在兑换 code 之前校验该签发者、凭据与签发它的那个签发者绑定。三条合起来堵住了混淆攻击——即把客户端骗到错误的授权服务器去兑换 code。如果你的 MCP 集成正摆在一次合规评审面前,这一段值得原样引用;这套流程被加固的形状见 MCP 授权与 OAuth 2.1。
什么会坏,以及谁来买单
如果你跑的是本地 stdio 服务,这里大半内容不是说给你听的:没有会话簿记要删、没有授权层、没有传输要迁。如果你运营一个 HTTP 机群,无状态内核就是这一版存在的理由,而 CIMD 迁移是真正的工作量。如果你写的是客户端,你既接下了新的按请求带身份的管道活儿,也接下了对等能力的丧失——而且要由你去告诉用户:他们依赖的某项服务端能力要没了。
真正的重写比噪音显得的要窄:只有用过服务端发起请求的服务,现在需要改成 MRTR 模式。其余的要么是删代码、要么是改配置、要么是往日历上记一条十二个月后的事。
这个季度该做什么
显式钉住协议版本,而不是让 SDK 默认值去协商,因为未来一年里你的依赖里会同时活着两个版本。把服务里的 Sampling、Roots 与 Logging grep 出来,趁窗口还长把替代方案的价钱算清。在 DCR 通路还被接受的时候就启动 CIMD 的活儿,因为它触及的授权服务器多半不归你管。而如果你一直因为会话让事情别扭而推迟横向扩展的 MCP 部署,这个理由已经过期了。
常见问题
2026-07-28 这一版会立刻弄坏我现有的 MCP 服务吗?
不会立刻。旧的 HTTP+SSE 传输与被弃用的功能都带着一年以上的弃用窗口。现在就坏掉的只有依赖协议层会话的代码——initialize 交互与 Mcp-Session-Id 头在新版本里已经不存在了。
为什么非要把会话去掉?
因为会话逼着每个服务实例共享状态,于是你要么粘性路由、要么共享存储、要么两者都要。无状态请求可以由普通 HTTP 基础设施后面的任何实例应答——负载均衡器、网关、CDN——这正是让 MCP 能像 Web 其余部分那样扩展的东西。
什么取代 Sampling?
按设计,没有。推理完全移到客户端一侧;想要模型补全的服务端被期望自己去调模型,而不是借用客户端的。你有最短十二个月的窗口来迁移。
动态客户端注册现在就没了吗?
它是被正式弃用、改用客户端 ID 元数据文档,而不是被移除。把它当作今年要排期的一次迁移,而不是本周要抢修的一次故障——但要早点开始,因为它通常牵涉到另一个团队掌管的授权服务器。
哪些 SDK 支持它?
四个一级 SDK——TypeScript、Python、Go 与 C#——随规范一同发布了支持,Rust SDK 为 beta。
延伸阅读
本站相关:
- 什么是模型上下文协议(MCP)?——如果你是刚接触,这是一页版。
- 深入 MCP Streamable HTTP——这一版所简化的那层传输。
- MCP 授权与 OAuth 2.1——签发者校验所加固的那套流程。
- MCP Sampling 与 Elicitation——被弃用的那几项对等能力当初是干什么的。
- 生产环境中的 MCP 运维——当实例变得可互换之后该怎么运营服务。