AI 博客

MCP 2026-07-28:无状态才是这次改动里小的那一半

7 月 28 日的规范废止了 initialize 握手与 Mcp-Session-Id 头,而目前所有解读都把它当成管道层的改动。它不是。放弃那条长连接,把 Sampling、Roots 与 Logging 一并推上了十二个月的弃用倒计时——而正是这几项,让 MCP 客户端不只是一个调用方,而是一个对等方。这份协议刚刚给"自己是什么"下了定论。

作者 智能体 AI 维基 24 分钟读完

读 7 月 28 日的发布说明,标题是一次传输层改动:MCP 去掉了 initialize 握手与 Mcp-Session-Id 头,于是任何实例都能应答任何请求。那是使能性的改动,却不是重要的那一个。拿掉长连接,把 Sampling、Roots 与 Logging 一并推上了十二个月的弃用倒计时——正是这三项让 MCP 客户端不只是调用方,而是对等方——同时把 Tasks 降级为扩展。在含糊了十八个月之后,这份协议给自己下了定论:它是一套面向 Web 的工具调用 API,而不是一套双向的智能体协议。

这次到底发布了什么

2026-07-28 这一版在 5 月被锁定为候选版本,随后由 SDK 维护者与客户端实现者验证了十周才正式发布——按这份协议的惯例这是一段很长的跑道,也相当合理地反映了它改动之大。

改动含义谁会感觉到
无状态内核 initialize/initializedMcp-Session-Id 退场;每个请求在 _meta 里自带协议版本、客户端身份与能力声明。 任何跑着不止一个服务实例的人。
多轮往返请求(MRTR) 需要调用中途补输入的工具返回 resultType: "input_required";客户端带上 inputResponses 重发。 用过服务端发起请求的服务作者。
基于头部的路由 新增 Mcp-MethodMcp-Name 头,网关与 WAF 无需解析 JSON 正文即可路由与计量。 把 MCP 放到既有基础设施后面的平台团队。
可缓存的 list 结果 工具、提示与资源列表带上 ttlMscacheScope 所有人——悄无声息,而且不要钱。
授权加固 授权服务器按 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 before and after the 2026-07-28 stateless core Before, an initialize handshake and an Mcp-Session-Id header pinned a client to one server instance, so a second instance could not serve the same conversation without a shared session store. After, every request carries its protocol version, client identity and capabilities in _meta and exposes Mcp-Method and Mcp-Name headers, so an ordinary HTTP router can send it to any instance and list results become cacheable. Before — stateful session Client initialize / initialized Mcp-Session-Id Sticky router must pin the session Instance A holds the session Instance B cannot serve it Shared session store After — 2026-07-28 stateless core Client no handshake _meta Mcp-Method Any HTTP router routes on headers Instance A any request, any time Instance B identically capable Edge cache ttlMs, cacheScope The server stopped being a session. It became a URL.
服务端不再是一个会话,而变成了一个 URL——这正是普通 Web 基础设施能在它上面生效的原因。

运维层面的回报是立竿见影的

负载均衡器后面的有状态 MCP 服务,是一个披着集成外衣的分布式系统问题。你需要粘性路由,或者共享会话存储,或者两者都要——而它的失效方式是一次重新部署悄悄掐断了进行到一半的会话。无状态把这一整类问题删掉了。实例变得可互换,滚动发布不再是一个事件,横向扩容也不再需要一次设计评审。如果你在任何规模上运营 MCP 服务,这一版是一份实打实的礼物。

另外两处小改动会叠加放大它

基于头部的路由比它读起来更要紧。把方法名与工具名放进 Mcp-MethodMcp-Name,意味着 API 网关可以按工具限流、WAF 可以拦掉危险方法、路由器可以按名字分片——全都不必检查正文,而这恰恰是企业本来就掌握着策略的那一层。可缓存的 list 结果是同一个思路往上挪一层:tools/list 被频繁发出、却极少变化,于是一个 ttlMs 就把一次按会话计的往返变成了一次 CDN 命中。

不占着连接,也能中途补输入

Multi Round-Trip Requests replace the server-initiated callback A tool call that needs mid-call input no longer holds a stream open. The server returns resultType input_required together with the questions it needs answered, the client resolves them however it likes, and the client retries the original call with inputResponses attached. Four ordinary request-response exchanges instead of one long-lived connection. One tool call, four independent request-response exchanges 1 Client calls tools/call no stream held open 2 Server answers input_required plus the questions 3 Client resolves ask the user, read a policy, use a default 4 Client retries inputResponses original call, answered Result served by any instance Every hop is idempotent, retryable, and free to land on a different server.
四次普通往返取代一条长连接——而且每一跳都可以落在不同的实例上。

多轮往返请求是让其余改动能活下来的那套机制。过去,一个需要确认或缺参数的工具,要求服务端在执行途中回调客户端,这就要求流保持打开,进而要求会话存在。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

什么会坏,以及谁来买单

Migration cost of the 2026-07-28 changes by deployment shape A four-by-five grid showing how much work each change creates for a local stdio server, a single-instance HTTP server, a load-balanced HTTP fleet, and a client or host application. The stateless core is close to free for stdio and a windfall for a fleet; the deprecation of Sampling, Roots and Logging lands almost entirely on client authors. Who pays for what Stateless core Tasks to an extension Sampling, Roots, Logging deprecated DCR out, CIMD in HTTP+SSE retired Local stdio server Barely affected Rarely used Drop it if you leaned on it No auth layer Not your transport Single HTTP server Delete the session bookkeeping Adopt the extension Twelve-month clock Publish client metadata docs One-year runway HTTP fleet The whole reason this shipped Polling suits you better anyway Rarely implemented Real work, and the security win Retire the legacy endpoint Client / host app Send identity on every request Poll, do not wait You lose the peer features Validate iss before redeeming Drop SSE support Where the change actually lands Some work Little or nothing to do
成本落得很不均匀——对本地 stdio 服务接近于零,对机群是一笔意外之财,而真正的重写只发生在用过服务端发起调用的地方。

如果你跑的是本地 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。

延伸阅读

本站相关:

来源: