完成 Python MCP 服务端的无状态迁移:删除 initialize 握手、实现 input_required 多轮交互、放弃已废弃特性并强化授权链路。
- 一个现存的 MCP 服务端,或 FlyPython 的可运行 MCP 示例
- Python 3.12 或更新版本
- 了解 JSON-RPC 2.0 基础
2026-07-28 的 Model Context Protocol 规范是 remote MCP 之后最大的一次发布:它彻底移除了 initialize 握手,用 input_required 多轮交互取代服务端主动发起的请求,并废弃了 roots、sampling 和 logging。MCP 现由 Linux 基金会旗下的 Agentic AI Foundation 管理,Python SDK 已随规范同步发布。
迁移完成的标准:你的服务端在完全不依赖任何会话状态的情况下响应 tools/list 与 tools/call,没有任何工具依赖已废弃的服务端主动请求,且授权链路满足新的发行方(issuer)规则。
2026-07-28 改了什么
- 无状态优先(SEP-2575、SEP-2567)。
initialize/initialized交互与Mcp-Session-Id头被移除。每个请求通过_meta自描述协议版本、客户端身份与能力;需要提前获取能力的客户端可以使用可选的server/discoverRPC。 - 多轮交互取代服务端主动请求(SEP-2322)。
elicitation/create、sampling/createMessage和roots/list不再保持长连接。需要客户端输入的工具返回带resultType: "input_required"的结果以及待回答的请求;客户端携带inputResponses重试原始调用。 - 按请求传递版本与路由头(SEP-2243)。
MCP-Protocol-Version随每个请求传递(值为2026-07-28),Streamable HTTP 请求必须携带Mcp-Method和Mcp-Name,让基础设施无需解析 JSON 请求体即可路由。 - 授权强化。 授权服务器必须按 RFC 9207 返回
iss参数(SEP-2468),客户端在动态注册时必须设置application_type(SEP-837),客户端凭据与发行方绑定——绝不能跨授权服务器复用(SEP-2352)。 - 响应缓存(SEP-2549)。
tools/list、prompts/list、resources/list和resources/read的响应携带ttlMs与cacheScope。 - Tasks 重构(SEP-2663)。 Tasks 移入
io.modelcontextprotocol/tasks扩展,采用轮询式tasks/get与新增的tasks/update,变更通知迁移到subscriptions/listen流。 - 至少十二个月窗口的废弃项。 Roots、sampling 和 logging 被废弃(SEP-2577);传统 HTTP+SSE 传输有一年过渡期;动态客户端注册(DCR)由客户端 ID 元数据文档(CIMD)取代。
迁移清单
- 删除握手。 移除
initialize与notifications/initialized的处理,以及所有Mcp-Session-Id查找。仍然发送initialize的请求应按未知方法失败,而不是被协商。 - 让每个请求自洽。 服务端以前从 initialize 记住的一切——客户端能力、协议版本、身份——现在必须按请求从
_meta读取,或在客户端主动选择时通过server/discover获取。 - 用 input_required 交互取代 elicitation。 过去调用
elicitation/create的工具现在返回带提问的resultType: "input_required",并在客户端携带inputResponses重试时完成。 - 不要在废弃原语上新建代码。 Roots、sampling 和 logging 在废弃窗口内仍然可用,但新代码不应再依赖它们。
- 升级官方 Python SDK。 TypeScript、Python、Go 和 C# SDK 已随规范发布;从 RC 到正式版大约有十周窗口,更早的 SDK 版本早于这些破坏性变更。
- 更新传输层。 在一年过渡期内下线传统 HTTP+SSE 传输,并在 Streamable HTTP 上输出必需的
Mcp-Method与Mcp-Name头。 - 检查授权链路。 按 RFC 9207 校验
iss,注册时设置application_type,每个发行方使用独立凭据。 - 采用缓存元数据。 为列表响应标注
ttlMs与cacheScope,让无状态基础设施可以安全缓存。
input_required 流程代码
可运行的完整参考是 MCP 工具服务示例。核心形状如下:
class InputRequired(Exception):
def __init__(self, requests):
super().__init__("tool execution needs additional client input")
self.requests = requests
def delete_resource(args, input_responses=None):
answer = str((input_responses or {}).get("confirm", "")).strip().lower()
if answer != "yes":
raise InputRequired([{"id": "confirm", "prompt": "Type 'yes' to confirm deletion."}])
return "deleted"
服务端在通用异常处理之前捕获 InputRequired,返回:
{
"result": {
"resultType": "input_required",
"requests": [{"id": "confirm", "prompt": "Type 'yes' to confirm deletion."}],
"content": [{"type": "text", "text": "Additional client input is required before this tool can finish."}]
}
}
客户端携带 "inputResponses": {"confirm": "yes"} 重试完全相同的 tools/call。因为整个流程基于重试,未确认的调用不会产生任何副作用——这与幂等自动化的安全性质完全一致。
在仓库根目录验证完整行为,包括 JSON-RPC 错误码与被移除的握手:
python examples/mcp-server/verify.py starter --expect-failure
python examples/mcp-server/verify.py solution
本指南不覆盖的内容
本指南基于已发布的发布公告与随规范交付的 SDK。_meta、requests 条目和 cacheScope 取值的字段级线缆协议请以规范与 SDK 类型定义为准,上线前务必核对;生产环境优先使用官方 Python SDK 而不是手写分发逻辑。授权的部署细节——发行方发现、凭据存储与 CIMD 的推进节奏——同样不在本指南范围内。
来源
- 2026-07-28 MCP 规范发布公告
- 2026-07-28 RC 与破坏性变更概览
- Anthropic:将 MCP 捐给 Agentic AI Foundation
- Agentic AI Foundation 下的 MCP
验证记录
依据 2026-07-28 官方发布公告编辑审校;配套示例的 8 项验证器可在仓库中运行。验证日期 2026-09-06。
关于作者
Organizational byline for FlyPython guides, verification records, and corrections. 编辑标准与联系方式 →