MCP 2026-07-28 核心协议变更为 Stateless · 干货攻略
- 链接: https://blog.modelcontextprotocol.io/posts/2026-07-28/
- 分类: x-tips
- 来源: X @omarsar0
- 作者: Jay
- 更新: 2026-08-16
这是什么
2026 年 7 月 28 日,Model Context Protocol(MCP)正式发布了有史以来最大的一次协议版本更新,版本号 2026-07-28。核心变化:MCP 从有状态的双向协议彻底改为请求/响应式的无状态协议。 附带 HTTP 路由增强、缓存指令、企业级授权加固、长任务扩展,以及一个正式的废弃政策窗口。
为什么值得关注
谁在用 MCP?
根据 MCP 官方博文,MCP 在各 Tier-1 SDK 上的月下载量已接近 5 亿次(close to half-a-billion downloads a month),其中 TypeScript 和 Python SDK 均已跨越 10 亿次总下载量。这个数字说明 MCP 已经过了早期采纳阶段,成为生产级 AI Agent 与外部工具/数据交互的实际标准。
解决了什么问题
MCP 起源于本地 STDIO 传输,远程化时把「客户端与服务器维持一个会话」这个模式也带了过去。这在本地开发没问题,但部署到云端时:
- 水平扩缩需要 sticky sessions:一个客户端的请求必须路由到同一个服务器实例,否则会话状态丢失。
- 部署变得复杂:滚动部署会失效或 strand 客户端会话。
- Serverless 几乎无法使用:FaaS 环境无法维持持久会话,而 MCP 原来要求的基础设施恰好是 FaaS 最难提供的。
- 运维负担重:需要分布式缓存或共享 session store 来在多实例间同步会话状态。
MCP 2026-07-28 通过彻底移除会话层解决了这个问题。 任何请求现在可以到达任何服务器实例,远程 MCP 服务器的部署第一次可以像普通 HTTP 服务一样简单。
核验过程
官方来源(Primary Sources)
-
官方博文:
https://blog.modelcontextprotocol.io/posts/2026-07-28- 确认了发布日 2026-07-28、协议版本号2026-07-28- 确认了 SDK 下载量(5 亿/月,TS/Python 各超 10 亿总下载) - 确认了 SEP-2575(移除 initialize 握手)、SEP-2567(移除 Mcp-Session-Id)、SEP-2322(MRTR)等具体提案编号 - 确认了废弃清单:Roots、Sampling、Logging,以及 HTTP+SSE 传输,全部给出 12 个月最短期废弃窗口 - 确认了 4 个 Tier-1 SDK(TypeScript/Python/Go/C#)同步发布 -
Cloudflare 官方博客(
https://blog.cloudflare.com/mcp-v2) - 确认 MCP 无状态化让「服务器可以跑在一个 Worker 里」,不再需要McpAgent或 Durable Objects 来维持会话 - 明确说明 MCP 2026-07-28 规范与 SDK 均已重写以适配新的无状态协议 - 提供了 MCP 在 Cloudflare 生态的历史背景(Asana/Atlassian/Block/Intercom/Linear/PayPal/Sentry/Stripe/Webflow 等公司已接入)
交叉验证(Cross-Validation)
-
Flavio Copes(
https://flaviocopes.com/mcp-2026-07-28-stateless) - 以开发者视角解析了为何无状态化对部署有利 - 解释了「显式 handle」模式(工具返回deployment_id,模型下次调用作为参数传入)与隐式会话状态的区别 - 确认了Mcp-Method和Mcp-NameHTTP header 的具体用法示例 -
TensorFoundry(
https://tensorfoundry.io/blog/mcp-2026-07-28-stateless) - 确认了resultType: "input_required"+inputResponsesMRTR 模式 - 确认 SSE resumability 取消——流断开后需要重新发请求,这是长任务依赖 Tasks 扩展的最强论据 - 确认迁移代价(breaking change)主要集中在:依赖 session ID 的网关、仅接受旧握手方式的服务器 -
The New Stack / Janakiram MSV(
thenewstack.io) - 独立媒体确认了废弃清单的具体内容 - 提供了「三实例 + round-robin + 无 session store」部署架构图
关键数字核验
| 说法 | 来源 | 核验结果 |
|---|---|---|
| 月下载量 5 亿次 | 官方博文 | ✅ 确认 |
| TypeScript + Python 各超 10 亿总下载 | 官方博文 | ✅ 确认 |
| SEP-2575/2567/2322 等提案编号 | 官方博文 | ✅ 确认,带 GitHub PR 链接 |
| 12 个月最短废弃窗口 | 官方博文 | ✅ 确认 |
| McpAgent 不再被协议层需要 | Cloudflare 博文 | ✅ 确认(Cloudflare 官方) |
上手步骤
1. 升级你的 MCP SDK
# TypeScript
npm update @modelcontextprotocol/sdk
# Python
pip install mcp --upgrade
# Go
go get github.com/modelcontextprotocol/go-sdk@latest
# C#
dotnet add package ModelContextProtocol
2. 迁移你的 MCP 服务器
旧版模式(有状态):
客户端 → initialize → 获取 session ID → 所有请求带 session ID → 服务器实例固定
新版模式(无状态,2026-07-28):
客户端 → 任意请求(携带 _meta: {clientInfo, capabilities, protocolVersion})
↓
任意服务器实例可处理
示例 HTTP 请求(新规范):
POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": {"q": "otters"}
},
"_meta": {
"io.modelcontextprotocol/clientInfo": {
"name": "my-app",
"version": "1.0"
}
}
}
迁移要点:
- 不再需要
initialize/notifications/initialized握手 - 不再使用
Mcp-Session-IdHTTP header - 服务器发现现在是可选的:调用
server/discover可以提前获取服务器能力,但不强制要求
3. 如果你的服务器需要维护跨请求状态
显式 Handle 模式(代替隐式 session):
# 服务器工具返回显式 ID
def create_deployment(config):
deploy_id = deploy(config) # 业务逻辑
return {"deploymentId": deploy_id}
def get_deployment_status(deploymentId: str):
return get_status(deploymentId)
// 第一次调用:创建资源,返回 handle
{"method": "tools/call", "params": {"name": "create_deployment", "arguments": {"config": {...}}}}
// 后续调用:模型将 handle 作为普通参数传入
{"method": "tools/call", "params": {"name": "get_deployment_status", "arguments": {"deploymentId": "deploy_82f1"}}}
这与标准 REST API 模式完全一致。 模型可以看到并管理这个 handle,协议不再偷偷维护状态。
4. 部署到 Serverless / Edge
# Cloudflare Workers 示例(MCP 2026-07-28 后可直接部署)
# 不再需要 McpAgent 或 Durable Objects
# Wrangler.toml
name = "my-mcp-server"
main = "src/index.ts"
compatibility_date = "2026-08-01"
# 三个副本,round-robin 负载均衡,现在可以直接工作
# 无需 sticky sessions,无需共享 session store
5. 多实例部署架构对比
旧(2026-07-28 之前):
客户端 → [负载均衡器] → [Sticky route to Instance A]
↓
[共享 Session Store] ← [Instance B / C](备用)
新(2026-07-28 起):
客户端 → [负载均衡器] → [Round-robin] → Instance A / B / C(任意)
↓
无需 Session Store
坑与适用边界
⚠️ Breaking Changes — 必须检查的部分
- 初始化握手移除:如果你的服务器或网关逻辑强依赖
initialize握手,会直接报错。需要先升级 SDK 再部署。 Mcp-Session-Id消失:任何在网关层基于 session ID 做流量管理、日志追踪或限流的逻辑都需要改写。- SSE resumability 取消:流媒体场景下断连需要完整重试,不能 resume。对于长时间运行的任务,必须用 Tasks 扩展(
tasks/get、tasks/update)。 - MRTR 替代 Server-Initiated Requests:如果你的服务器依赖采样(sampling)或 elicitation 机制,需要迁移到 MRTR 模式(
resultType: "input_required"+ 客户端重试带inputResponses)。
⚠️ 废弃倒计时已开始
| 废弃项 | 废弃起始 | 最晚移除 |
|---|---|---|
| Roots | 2026-07-28 | 2027-07-28(至少) |
| Sampling | 2026-07-28 | 2027-07-28(至少) |
| Logging | 2026-07-28 | 2027-07-28(至少) |
| HTTP+SSE 传输 | 2026-07-28 | 2027-07-28(至少) |
| Dynamic Client Registration (DCR) | 2026-07-28 | 正式废弃,未来移除 |
行动建议:今天就开始测试新协议,12 个月的窗口看起来很长,但遗留的 initialize 握手会在新客户端连接时报错,实际迁移窗口可能更短。
适用边界
- 适合:所有远程 MCP 服务器、Serverless/Edge 部署、需要水平扩缩的生产环境、任何在负载均衡器后面的 MCP 服务。
- 不适合:极度依赖 server-initiated 采样的实时交互场景(需用 MRTR 重构);已有稳定旧版部署且短期不打算升级的团队(但会面临兼容性问题)。
一句话结论
MCP 2026-07-28 把协议从「需要专门基础设施才能跑」变成「随便扔到一个 HTTP 端点就能跑」,水平扩缩和 Serverless 部署第一次成为 MCP 的默认选项——这是 MCP 真正进入生产级基础设施的标志,但遗留系统有 12 个月的强制迁移窗口,现在就该开始测试。