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)

  1. 官方博文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#)同步发布

  2. 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)

  1. Flavio Copeshttps://flaviocopes.com/mcp-2026-07-28-stateless) - 以开发者视角解析了为何无状态化对部署有利 - 解释了「显式 handle」模式(工具返回 deployment_id,模型下次调用作为参数传入)与隐式会话状态的区别 - 确认了 Mcp-MethodMcp-Name HTTP header 的具体用法示例

  2. TensorFoundryhttps://tensorfoundry.io/blog/mcp-2026-07-28-stateless) - 确认了 resultType: "input_required" + inputResponses MRTR 模式 - 确认 SSE resumability 取消——流断开后需要重新发请求,这是长任务依赖 Tasks 扩展的最强论据 - 确认迁移代价(breaking change)主要集中在:依赖 session ID 的网关、仅接受旧握手方式的服务器

  3. The New Stack / Janakiram MSVthenewstack.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-Id HTTP 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 — 必须检查的部分

  1. 初始化握手移除:如果你的服务器或网关逻辑强依赖 initialize 握手,会直接报错。需要先升级 SDK 再部署。
  2. Mcp-Session-Id 消失:任何在网关层基于 session ID 做流量管理、日志追踪或限流的逻辑都需要改写。
  3. SSE resumability 取消:流媒体场景下断连需要完整重试,不能 resume。对于长时间运行的任务,必须用 Tasks 扩展tasks/gettasks/update)。
  4. 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 个月的强制迁移窗口,现在就该开始测试。