Unknown methods return -32602 Invalid params instead of -32601 Method not found

当基于 MCP Python SDK 的服务器收到未知 JSON-RPC 方法调用时,会返回 -32602 Invalid params ,而 JSON-RPC 2.0 规范要求返回 Unknown methods return -32602 Invalid params instead of -3

快速结论:当基于 MCP Python SDK 的服务器收到未知 JSON-RPC 方法调用时,会返回 -32602 Invalid params,而 JSON-RPC 2.0 规范要求返回 Unknown methods return -32602 Invalid params instead of -32601 Method not found。优先排查是否仍在使用 v1.x 版本,并确认 mcp/shared/session.py 中请求校验逻辑是否将未知方法与参数错误混为一谈。

适用环境:Issue 中确认的环境为 mcp 1.27.1、Python 3.14;服务器基于 MCP Python SDK。其他操作系统、CUDA、显卡或依赖版本未在 Issue 中明确。

最快修复方案:升级到 SDK 的 2.0.0 版本,该问题已在 v2 版本中修复。

注意事项:v1.x 已进入仅维护模式,仅修复漏洞等关键问题,因此 v1.x 上暂无确认的一步修复方案。升级到 v2 可能带来行为变化,Issue 评论中有人提到 v2 移除了 session 状态,企业部署需自行评估身份验证与审计影响;该评论属于社区讨论,不是官方修复说明。

问题场景

用户在使用基于 MCP Python SDK 构建的服务器时,客户端或目录扫描器(如 Smithery)探测服务器未声明支持的可选能力,例如 triggers/list、completions/complete 或 logging/setLevel。服务器对这些不存在的方法统一返回 -32602 Invalid request parameters,导致扫描器把“方法不存在”误判为“调用参数错误”。

报错原文

Warning: Failed to list triggers: MCP error -32602: Invalid request parameters

{"jsonrpc":"2.0","id":9,"method":"totally/bogus"}

{"jsonrpc":"2.0","id":9,"error":{"code":-32602,"message":"Invalid request parameters","data":""}}

原因分析

在 mcp/shared/session.py 中,self._receive_request_type.model_validate(...) 对不在请求联合类型中的方法会抛出异常,而外围的 except Exception 将所有异常统一映射为 INVALID_PARAMS。请求联合类型同时承担了“方法注册表”的职责,导致“我没有这个方法”和“参数无法解析”进入同一处理分支,无法区分 -32601 METHOD_NOT_FOUND 与 -32602 INVALID_PARAMS。

环境排查

  • 确认使用的 mcp SDK 版本;Issue 中观察到的出问题版本为 1.27.1。
  • 确认 Python 版本;Issue 中为 Python 3.14。
  • 确认服务器是否声明了被探测的能力,例如 triggers/list、completions/complete、logging/setLevel。
  • 检查 mcp/shared/session.py 中请求校验的异常处理逻辑,确认是否将未知方法与参数校验失败统一返回 INVALID_PARAMS。
  • 确认是否已升级到 2.0.0 或更高版本。

解决步骤

  1. 升级 MCP Python SDK 到 2.0.0 版本;维护者明确表示该问题已在 v2 版本中修复。
  2. 如果因兼容性原因必须停留在 v1.x,需注意 v1.x 仅处于维护模式,只修复漏洞等关键问题,因此该行为在 v1.x 上可能不会得到修复。
  3. 可优先尝试的替代思路:在构建错误响应前,先判断请求方法是否属于已知请求方法;若不属于,则返回 METHOD_NOT_FOUND(-32601),仅对已知方法但校验失败的情况保留 INVALID_PARAMS(-32602)。此方案来自 Issue 的建议方向,Issue 中没有将该改动合并进 v1.x 的确认记录。
  4. 可优先尝试的补充改进:在错误响应的 data 字段中填充具体的校验错误信息,当前该字段为空字符串,响应不携带任何诊断信息。

验证方法

完成 initialize 与 notifications/initialized 后,向服务器发送一个未知方法请求:

{"jsonrpc":"2.0","id":9,"method":"totally/bogus"}

若返回的错误码为 -32601(Method not found),说明未知方法已按 JSON-RPC 2.0 规范正确处理;若返回 -32602,则问题仍然存在。可同时对 triggers/list、completions/complete、logging/setLevel 等未声明能力的方法进行探测,确认它们不再被误报为参数错误。

参考来源

modelcontextprotocol/python-sdk #3193

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26832

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注