MCP 协议团队在 2026 年 7 月 28 日发布了一个新版本,该版本取消了协议层面的会话(session),并强制要求每个请求都是无状态的。如果你运行 MCP 客户端、服务器或代理,你必须重写那些假设存在持久会话 ID 的代码——否则你将面临路由失效、缓存未命中以及后台任务失控的问题。
为什么这次转变至关重要
MCP 过去需要通过握手来生成会话标识符。下游服务依赖该 ID 来假设一系列请求会命中同一个进程,从而允许负载均衡器使用粘性路由,并在内存中存储每个会话的数据。7 月份的发布将该模型替换为纯粹的请求-响应流。现在,可以随意添加或移除服务器,而无需担心会话丢失。协议不再保留上下文;上下文必须由应用程序来维护。
保留旧有“以会话为中心”代码的团队将面临请求被路由到错误实例、缓存未命中以及后台作业堆积的问题。而采用无状态模式的团队则可以在非粘性负载均衡器后运行 MCP,并在整个请求链中获得更紧密的观测能力。
真正的变化在哪里
- 协议生命周期 – 握手和会话 ID 消失了。每个请求必须携带服务器所需的所有信息;无法保证后续请求会落在同一个进程上。
- HTTP 路由 – 网关现在通过读取两个新请求头
Mcp-Method和Mcp-Name来决定请求的转发位置。基于 Session-cookie 的路由不再有效。 - 缓存 – 规范为读取操作增加了
ttlMs(毫秒级生存时间)和cacheScope字段。你可以决定是否接受过期数据,并据此配置缓存。 - 可观测性 –
_meta块现在要求包含 W3C Trace Context 负载,这使得追踪系统能够将边缘网关、工具和后端工作缝合进一个完整的端到端追踪中。 - 组合性 – 扩展机制被正式化了;可以在不改动核心规范的情况下添加新功能,从而鼓励插件式的架构。
- 长时间运行的工作 – 对于运行数分钟或数小时的任务,简单的请求/响应模式已不再适用。协议现在定义了一个用于异步工作的
Task对象,并配备了完整的生命周期控制。
遗留代码中隐藏的风险
快速审计通常会发现那些假设具有状态性的模式:
- 以会话 ID 为键的内存映射(In-memory maps)。
- 配置为粘性会话(sticky sessions)的负载均衡器。
- 在启动阶段将每个会话的数据预加载到本地内存的例程。
- 在会话结束时删除业务数据的清理逻辑。
如果这些逻辑在迁移后依然存在,系统在高负载下将会丢失数据或导致资源泄漏。
具体的迁移清单
1. 盘点当前的假设
梳理代码中所有涉及会话 ID、粘性路由规则或进程本地缓存的地方。记录哪些组件依赖于每一项。
2. 使身份标识显式化
在每个请求负载或请求头中添加租户 ID(tenant IDs)、运行 ID(run IDs)和用户 ID(user IDs)。将这些标识符视为授权和数据分区的唯一事实来源。
3. 更新路由配置
将基于会话的路由替换为读取 Mcp-Method 和 Mcp-Name 的规则。在非粘性负载均衡器后使用最简化的两个实例部署,测试新的网关逻辑。
4. 重构缓存逻辑
切换到新的 ttlMs 和 cacheScope 字段。进行性能测试,观察不同的 TTL 值如何影响命中率和数据新鲜度要求。
启用端到端追踪:在 _meta 块中填充 W3C Trace Context 请求头。验证追踪信息现在能否从边缘网关无缝流经后端服务。
采用 Task 模型处理异步工作:定义谁可以创建任务,设置最大运行时间,并强制执行队列限制。添加明确的取消和重试策略,并限制代理在任务挂起期间的操作权限。
在 7 月 28 日之前查看 SDK 和客户端库的发布说明。
运行针对失败路径的回归测试套件:除了测试正常路径(happy-path)外,还要注入缺失的请求头、过期的任务和格式错误的缓存指令。确认系统能够优雅地降级。
下一步需要关注什么
能够安全迁移的团队会测试边界情况,而不仅仅是正常路径。任何在 7 月 28 日之后仍期望会话 ID 的生产环境部署,都可能无法与新的 MCP 服务器协同工作。
