MCP Python SDK 2.0移除了fastmcp模块,导致旧代码import直接崩溃,解决方案是锁定mcp<=1.27.0或mcp<=0.30.0。
MCP 2.0's stateless overhaul breaks local servers via removed mcp.server.fastmcp.
Pin mcp<2.0.0 and audit session-tied state before migrating.
Model Context Protocol 于 2026-07-28 的规范更新移除了有状态传输、持久会话以及初始化握手。现在每个请求都通过简洁的 HTTP 携带一个自我描述的 _meta 上下文载荷。
对于在 Cloudflare Workers 或 AWS Lambda 上运行数千个无状态 Agent 的企业团队来说,这是一个礼物。对于运行自定义 Python 服务器的本地工具开发者来说,这是一个破坏性变更——会悄无声息地让你的环境崩溃。
将 mcp 升级到 >=2.0.0 并运行 pip install 会让你的环境崩溃。
这个破坏非常精准:MCP Python SDK 2.0.0 完全移除了 mcp.server.fastmcp,并将 FastMCP 重命名为 mcp.server.mcpserver 下的 MCPServer。如果你的代码仍然写的是 from mcp.server.fastmcp import FastMCP,进程会在导入时死掉。你的客户端看到的是传输错误,而不是回溯,因为子进程在说出协议之前就退出了。
陷阱在于:fastmcp 3.x 用 mcp<2.0,>=1.24.0 保护了自己。但任何其他声明了 mcp>=1.0.0(无上限)的依赖都会直接穿透这个破坏性的大版本。温暖的 pip 缓存让一切看起来正常工作。你的下一次全新克隆或容器构建就会坏掉。
在动任何东西之前,先运行 pip show mcp 找到到底是哪个包实际控制了你的 mcp 解析。如果是传递依赖,编辑 requirements.txt 什么都改变不了——你需要在上游定位并固定,或者使用约束文件。

SDK 的迁移指南很直接:"如果你的包依赖 mcp,在迁移完成之前保持 <2 的上限。"
以下是 zerikai_memory 的作者在 v1.0.0-beta.15 中使用的精确固定版本:
# --- CORE (MCP & SERVER LOCKS) ---
fastmcp>=3.2.4,<4.0.0
mcp>=1.27.0,<2.0.0
uvicorn>=0.30.0,<1.0.0
starlette>=0.35.0,<1.0.0
提交这个,CI 测试,验证它能干净解析,然后再做其他变更。
MCP 包含协议时代协商。当 Cursor、Windsurf 或 Claude Desktop 连接到运行 mcp 1.27.0 的服务器时,客户端会探测 v2 特性(server/discover RPC、无状态 _meta 原语)。如果不存在,它会降级到向后兼容的基于会话的握手模式。不会产生运行时错误。
这是一个安全阀,不是永久解决方案。协商层不会无限期地维护下去。现在就制定你的升级路线图。
无状态模型移动了执行边界。会话生命周期钩子没了。每个请求都冷启动到达。你的持久化层必须使用请求载荷内的应用级标识符作为键——完全独立于传输生命周期。
审计会话依赖——搜索 Mcp-Session-Id、会话生命周期钩子或有状态的握手回调。
映射持久化边界——记录每一次对本地状态的读/写;确认每个都是通过应用逻辑而非传输句柄作为键。
固定你的环境——在任何其他变更之前,先给 mcp、fastmcp、uvicorn、starlette 加上上限。
未固定的依赖——mcp>=1.27.0 没有上限会在下一次自动化更新时崩溃。
同时迁移框架和持久化——双重爆炸半径;将它们分开顺序处理。
信任 beta 兼容性声明——fastmcp 4.0.0b1 需要 mcp>=2.0.0,<3.0.0。这是 beta 版。当作 beta 来对待。
忽略确认流程的重新设计——v2 用多轮往返的 InputRequiredResult 循环替换了双向采样。非请求式客户端推送需要重新设计。
[Updated 20 Aug via devto_mcp]
除了 SDK 移除的 fastmcp 模块之外,MCP 2.0 还引入了几个机械性的破坏点。streamable_http_client() 现在返回 2 元组而不是 3 元组,导致旧的反 unpack 代码在启动时抛出 ValueError。类型从 camelCase 切换到 snake_case(.inputSchema → input_schema),而且客户端现在只接受 JSON Schema draft 2020-12,拒绝声明 draft-07 的服务器(per dev.to)。这个 schema 方言问题没有干净的固定方案;一个薄薄的 stdio 代理重写 outputSchema 到 2020-12 是经过验证的变通方案。
Originally published on gentic.news