Softogram/softogram-mcp-spec-migration-checker

GitHub: Softogram/softogram-mcp-spec-migration-checker

静态扫描 Python MCP 服务器代码,报告在 2026-07-28 MCP 规范更新中会失效的写法,帮助开发者在截止日前完成迁移。

Stars: 0 | Forks: 0

# mcp-migration-check 一个命令行小工具,它可以读取你的 Python MCP 服务器代码,并告诉你哪些内容在 2026-07-28 的 MCP 规范更新中会失效。 它绝不运行你的代码。 它只读取你的代码(这被称为静态分析)。 ## 问题是什么? MCP (Model Context Protocol) 是一个共享的规则手册,允许 AI 应用与外部工具和数据进行通信。 对该规则手册的一次重大更新将于 **2026-07-28** 落地。 此次更新移除了一些旧版 MCP 服务器所依赖的模式,因此以旧方式编写的代码可能会在不知不觉中停止工作。 该工具会读取你的服务器代码,并用通俗易懂的语言准确报告在该日期到来之前需要更改的内容。 ## 下载并运行 - 无需 Python 从 [最新发布版本](https://github.com/Softogram/softogram-mcp-spec-migration-checker/releases/latest) 中获取适合你平台的文件,赋予其可执行权限并运行: ``` chmod +x mcp-migration-check-* ./mcp-migration-check-* path/to/your/server ``` 这是一个独立的单文件(由 [PyInstaller](https://pyinstaller.org/) 构建)- 无需安装 Python,无需 `pip install`,也无需克隆此代码库。如果省略路径,它将检查当前文件夹。 macOS 和 Windows 可能会显示首次运行警告,因为该二进制文件未经过代码签名(这对于小型开源工具来说很正常)- 在 macOS 上右键单击并选择“打开”,或在 Windows 上单击“更多信息 -> 仍要运行”,即可绕过此提示一次。 ## 如果你已经安装了 Python,也可以使用 pip 安装 要求 Python 3.11 或更高版本。 ``` git clone https://github.com/Softogram/softogram-mcp-spec-migration-checker.git cd softogram-mcp-spec-migration-checker pip install . mcp-migration-check path/to/your/server ``` 如果省略路径,它将检查当前文件夹: ``` mcp-migration-check ``` ## 其他选项 **`--json`** - 以机器可读的 JSON 格式打印相同的检查结果,而不是人类可读的报告,供 CI 封装器或编辑器集成使用。退出码约定与人类可读报告相同。 ``` mcp-migration-check --json path/to/your/server ``` **`--explain `** - 直接从规则元数据中打印某条规则的完整说明(它检查什么、为什么检查、确定程度及其来源),无需进行任何扫描。 ``` $ mcp-migration-check --explain R1 R1 - Hand-rolled reading of the old session header Severity: This will break Confidence: Confirmed The 2026-07-28 update removes protocol-level sessions and the Mcp-Session-Id header from the Streamable HTTP transport (SEP-2567). ... Source: https://modelcontextprotocol.io/specification/2026-07-28/changelog.md (checked 2026-07-28) ``` 未知的规则 ID 会以退出码 2 退出,并列出已知的规则 ID。 ## 真实的修改前后对比 此代码库中的 `examples/` 提供了一个小型的购物车 MCP 服务器,以两种方式编写。 `examples/before/` 手动实现了自己的 MCP-over-HTTP transport,完全绕过了官方 SDK - 并且这两个示例都已通过真实安装的 `mcp` 包进行了验证(不仅仅是手动编写以显得合理;请参阅 `examples/README.md`)。 在它上面运行该工具看起来像这样: ``` $ mcp-migration-check examples/before mcp-migration-check: scanned 3 Python files under examples/before server.py line 19 [THIS WILL BREAK] (Confirmed) R3 - Hand-rolled transport missing Mcp-Method / Mcp-Name > async def app(scope, receive, send): The 2026-07-28 update requires the Mcp-Method and Mcp-Name headers on every Streamable HTTP POST request (SEP-2243). This only applies to hand-rolled MCP-over-HTTP transport code - servers using the official SDK's built-in Streamable HTTP transport get this handled for them. If you wrote your own transport wiring instead of using the SDK's, add both headers. Source: https://modelcontextprotocol.io/specification/2026-07-28/changelog.md (checked 2026-07-28) line 24 [THIS WILL BREAK] (Confirmed) R1 - Hand-rolled reading of the old session header > session_id = headers.get("mcp-session-id") ... ... tools/legacy_handlers.py line 28 [THIS WILL BREAK] (Confirmed) R6 - SSE resumability opt-in (event_store) ... ... Summary: 10 will break, 1 worth checking, 0 needs manual check, 0 files skipped ``` `examples/after/` 是同一个服务器迁移后的版本。 在它上面运行该工具会给出一份干净的报告: ``` $ mcp-migration-check examples/after mcp-migration-check: scanned 2 Python files under examples/after No migration findings found. Summary: 0 will break, 0 worth checking, 0 needs manual check, 0 files skipped ``` 请参阅 `examples/README.md` 了解两者之间具体更改了什么以及原因 - 其中甚至包括真实 SDK 检查自身发现并修复的一个误报。 ## 工具对每项检查结果有多确定? 并非关于此规范更新的每一项声明都同样确凿。 有些直接来自官方更新日志(非常确信)。 其他一些则来自描述此次更新的可信次要来源,在官方页面提及之前(不太确信,但仍值得一听)。 报告中的每项检查结果都会标明属于这两个置信度等级之一,这样你就可以自行区分它们: | 置信度 | 含义 | 在报告中显示为 | |---|---|---| | **Confirmed** | 已列在 [官方 MCP 更新日志](https://modelcontextprotocol.io/specification/2026-07-28/changelog.md) 中 | “This will break” | | **Reported** | 由可信的次要来源描述,但尚未出现在官方页面上 | “Worth checking” | 规范的最终文本已于 2026-07-28 发布,因此以下每条规则现在均为 Confirmed - 每一项声明都可追溯到官方更新日志本身,而非二手来源。 一项检查结果可能表达的第四种独立情况是 **“我们无法判断这是否适用于你”**(`NEEDS-MANUAL-CHECK`)。 当你的服务器的 transport(可被 Web 访问还是仅限本地)是在 runtime 决定时,R3 就会出现这种情况 - 这纯粹靠阅读代码是永远无法确定的。 它不是一种严重程度级别,也绝不会影响退出码。 有关具体示例,请参阅 `tests/fixtures/r3/cannot_tell_runtime_transport.py`。 ## 八条规则 | ID | 检查内容 | 严重程度 | 置信度 | |---|---|---|---| | R1 | 手动按名称读取原始 `Mcp-Session-Id` header(绕过了 SDK 自身的 session 处理) | This will break | Confirmed | | R2 | 服务器内存以 session 而非显式句柄作为键 | This will break | Confirmed | | R3 | 手动实现的 HTTP transport 缺少两个新增加的必填 header:`Mcp-Method` 和 `Mcp-Name` | This will break | Confirmed | | R4 | 使用了 Roots、Sampling 或 Logging(已废弃,有十二个月的宽限期) | Worth checking | Confirmed | | R5 | 手动使用了规范重新编号的四个 MCP 错误代码之一 | This will break | Confirmed | | R6 | 通过 `event_store` 选择启用 SSE 流可恢复性(已被完全移除) | This will break | Confirmed | | R7 | 旧式的 `resources/subscribe` 或 `resources/unsubscribe` 请求处理程序 | This will break | Confirmed | | R8 | 旧式的 `logging/setLevel` 请求处理程序 | This will break | Confirmed | 每条规则的来源:[官方 MCP 更新日志](https://modelcontextprotocol.io/specification/2026-07-28/changelog.md),最后检查时间为 2026-07-28。有关每条规则的准确 SEP 引用和完整说明,请参阅 `src/mcp_migration_check/rules/rules.toml`。 **关于 R3 的说明:** `Mcp-Method` 和 `Mcp-Name` 是在 transport 层(即将 MCP 消息转化为 HTTP 请求的代码部分)添加的 header,而不是大多数应用程序代码会直接接触的内容。 如果你的服务器使用官方 MCP Python SDK 内置的 Streamable HTTP transport,SDK 会自动为你处理这些 header - 在你自己的代码中没有任何内容需要此工具标记,因此 R3 会保持静默。 R3 仅在那些手动实现自己的 HTTP transport 代码而不使用 SDK 的服务器上才会触发 “This will break”。 有关完整的推理过程,请参阅 `docs/low-level-design/003-r3-transport-detection.md`。 **关于 R1 的说明:** 通过 SDK 自身的 `Context` 对象读取 `ctx.session_id` 是真实 MCP Python SDK 中一项合法且仍受支持的便捷属性(通过直接安装已确认)- 它公开的是 transport 的连接 ID,而不是被移除的协议级 session 握手,因此本工具不会对其进行标记。R1 仅在代码按字面名称读取原始 `Mcp-Session-Id` header 时触发,这只发生在完全绕过 SDK 的 session 处理的代码中。关于这是如何被发现的,以及 R6/R7/R8 各自的真实 SDK 验证,请参阅 `docs/LEARNINGS.md` 中 2026-07-28 的记录。 **关于 R4 与 R8 的说明:** 两者都涉及“logging”,但它们是不同的情况。R4 关乎从工具*使用*已废弃的 Logging 能力(有十二个月的宽限期,仍然有效)。R8 关乎服务器自身*实现特定的、已被移除的 `logging/setLevel` 请求处理程序*(没有宽限期 - 该请求已不复存在)。检查真实的 SDK 显示,`set_logging_level` 从来不是应用程序代码所使用的面向客户端 session 对象上的方法 - 它仅仅是用于注册该处理程序的低级 `Server` 装饰器 - 因此它被完全从 R4 中移出,归入到了 R8。 **已知的未知数 - 此版本中不进行检查:** 针对真实的 SDK 对待办事项中的两个候选规则(被移除的 `initialize`/`notifications/initialized` 握手,以及新增的必填 `server/discover` RPC)进行了调查,发现它们在应用程序代码中没有干净且低误报率的特征 - 只要服务器使用了 SDK,这两者都会由 SDK 在内部处理,没有任何供开发者编写自定义代码的公开 hook。标记它们的缺失就意味着瞎猜。请参阅 `docs/LEARNINGS.md` 查看调查过程。 由于同一次更新中新增的任务处理、可视化界面或更严格的登录/安全功能属于新增内容,而不是会破坏现有代码的内容,因此该工具也不对它们进行检查。 有关正在跟踪但尚未构建到规则中的完整更改列表,请参阅 `docs/PRD.md` 的第 4.2 节。 ## 此工具不做的事情 - 它不会自动修复你的代码。它只负责报告 - 由人来决定更改什么。 - 它只理解使用官方 MCP Python SDK 编写的 Python 代码。不支持 TypeScript,也不支持其他 SDK。 - 它只读取你的代码(静态分析)。它从不运行你的服务器。 - 它仅检查一次规范更新:即从 2025-11-25 规范版本向 2026-07-28 的跳跃。它假定你的服务器已处于 2025-11-25 版本。 - 它是一个命令行工具,而不是网站或托管服务。无需账号,也不会向任何地方发送数据。 ## 规则即数据 每条规则的元数据(其解释、严重程度、置信度和源链接)都保存在 [`src/mcp_migration_check/rules/rules.toml`](src/mcp_migration_check/rules/rules.toml) 中,与查找到它的代码相互分离。 这意味着一旦官方规范在 7 月 28 日完全发布,更新规则的声明只是一项纯文本的数据更改,而无需重写该工具。 有关完整的设计,请参阅 `docs/high-level-design/001-scan-pipeline.md`。 ## 开发 ``` pip install ".[dev]" pytest # unit and fixture tests ruff check . # lint python scripts/e2e_check.py # release gate: runs the CLI against examples/, diffs against snapshots ``` ## 构建独立可执行文件 上面提供的可下载的、无需 Python 的文件是通过 [PyInstaller](https://pyinstaller.org/) 根据 `mcp-migration-check.spec` 构建的。 `.github/workflows/release.yml` 会分别为 macOS、Linux 和 Windows 各构建一个文件,并在推送 `v*` 标签时将它们附加到 GitHub Release 中。 要自行构建: ``` pip install ".[build]" pyinstaller mcp-migration-check.spec ./dist/mcp-migration-check path/to/your/server ``` 有关每个规则的测试夹具约定,请参阅 `tests/README.md`。
标签:MCP, Python, SOC Prime, 云安全监控, 代码迁移, 动态分析, 安全规则引擎, 开发工具, 无后门, 漏洞挖掘, 逆向工具, 静态分析