TypeError: mcp.types.JSONRPCRequest() got multiple values for keyword argument ‘jsonrpc’

该报错 `TypeError: mcp.types.JSONRPCRequest() got multiple values for keyword argument 'jsonrpc'` 通常出现在构建 MCP 网关/代理时,`ServerSession` 收到的 `ClientRequest`

快速结论:该报错 `TypeError: mcp.types.JSONRPCRequest() got multiple values for keyword argument ‘jsonrpc’` 通常出现在构建 MCP 网关/代理时,`ServerSession` 收到的 `ClientRequest` 被转发到 `ClientSession.send_request()`,因请求数据中残留 `jsonrpc` 和 `id` 字段导致冲突。优先检查 MCP Python SDK 版本,若为 1.x(如 1.27.0),可尝试手动剥离 envelope 字段或升级至 v2。

适用环境:MCP Python SDK 1.27.0(可能影响后续 1.x 版本);操作系统、Python 版本未在 Issue 中明确。

最快修复方案:
– 对于 v1.x 用户:在转发前从 `request.model_dump()` 中删除 `”jsonrpc”` 和 `”id”` 字段(详见解决步骤方案一)。
– 升级至 MCP Python SDK v2(#2838,已合并并发布)可根本解决,因为 v2 重写了 session 逻辑,不再存在该冲突。

注意事项:v2 对内部 API 有重大变更(`BaseSession.send_request` 已被移除),升级需适配新架构。手动剥离字段的方案已在 MCP-IDS 项目中验证,但非官方修复。

问题场景

用户在使用 MCP Python SDK 构建网关/代理时,典型模式为:通过 `ServerSession` 接收外来请求,再通过 `ClientSession.send_request()` 转发给下游服务。在转发过程中报错。

报错原文

TypeError: mcp.types.JSONRPCRequest() got multiple values for keyword argument 'jsonrpc'

原因分析

根本原因在于 `ServerSession._receive_loop` 中解析请求时,使用了 `model_validate` 且 `ClientRequest` 的子类型(如 `CallToolRequest`)配置了 `model_config = {‘extra’: ‘allow’}`,导致信封字段 `jsonrpc` 和 `id` 被保留在验证后的请求对象中。当该请求通过 `BaseSession.send_request` 转发时,内部代码先将请求 `model_dump` 为字典,再以 `JSONRPCRequest(jsonrpc=”2.0″, id=request_id, **request_data)` 构造新请求,此时 `request_data` 中已包含 `jsonrpc` 和 `id`,与显式关键字参数冲突,触发 `TypeError`。

环境排查

  • MCP Python SDK 版本:确认是否 ≤1.27.0(v1.x 系列)。Issue 中观察到的版本为 1.27.0。
  • 使用场景:是否使用了 `ServerSession` → `ClientSession.send_request` 的转发模式。
  • Python 版本、CUDA、显卡等在该问题中不是关键因素,无需特别排查。

解决步骤

方案一(适用于 v1.x,已验证):

  1. 在转发请求之前,定义一个辅助函数剥离信封字段:
    def _strip_envelope_fields(request: ClientRequest) -> ClientRequest:
        raw = request.model_dump(by_alias=True, mode="json", exclude_none=True)
        raw.pop("jsonrpc", None)
        raw.pop("id", None)
        return ClientRequest.model_validate(raw)
  2. 使用剥离后的请求调用 `client_session.send_request(…)`。

方案二(推荐,从根本上修复):

  1. 升级 MCP Python SDK 至 v2(如通过 `pip install mcp>=2.0.0`,具体版本号请参考发布说明)。
  2. 适配 v2 的 API 变动,例如 `send_request` 方法位置已变更。

验证方法

运行原有的网关/代理逻辑,确认不再抛出 `TypeError: got multiple values for keyword argument ‘jsonr

参考来源

modelcontextprotocol/python-sdk #2548

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 15798

发表回复

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