快速结论:当 MCP 客户端在 2025-11-25 协议会话上调用 tools/list 时,如果服务端某个工具的 inputSchema/outputSchema 的 properties 下出现布尔子 schema(如 {"result": true}),Pydantic 会因 dict_type 校验失败而丢弃整个工具列表;应优先排查生成类型中 properties 的字段类型是否被限定为字典。
适用环境:Issue 已确认的环境为 Python 3.13.15、mcp 2.0.0 / mcp-types 2.0.0(PyPI 最新发布版)、pydantic 2.13.4;在 main @ 57394b05(mcp 2.0.1.dev21+57394b05)、pydantic 2.12.5 上同样复现。问题与操作系统、CUDA、显卡无关,Issue 未涉及这些信息。
最快修复方案:暂无确认的一步修复方案。Issue 被关闭时代码生成补丁方向已获维护者认可,但讨论中没有给出已验证的合并或发布版本;可优先尝试 Issue 提出的做法:在 scripts/gen_surface_types.py 的 SCHEMA_PATCHES["2025-11-25"] 中,把 2025-11-25 Tool 的 inputSchema/outputSchema 下 properties 的 additionalProperties 放宽为接受对象或布尔值,然后重新生成 surface 类型并补充回归测试。
注意事项:以上补丁属于 Issue 提案,需自行确认生成后 diff 是否符合预期(提案称改动仅两行:dict[str, dict[str, Any]] → dict[str, dict[str, Any] | bool],且 2026-07-28 模块不受影响)。若不愿改动生成模型,评论中也提出可优先尝试客户端防御性回退:校验失败时把布尔子 schema 归一化后重试一次。该回退同样是未经合并验证的方案,且需注意不要把真正的 schema 错误静默吞掉。
问题场景
用户使用 MCP Python SDK 在 2025-11-25 协议版本下建立会话,对服务端执行 tools/list。当服务端返回的工具定义中包含布尔形式的子 schema(例如 "outputSchema": {"type": "object", "properties": {"result": true}, "required": ["result"]})时,ListToolsResult 整体校验失败,客户端拿不到该服务器的任何工具。Issue 中给出的真实案例是 Microsoft 的 Azure Resource Manager MCP(https://mcp.management.azure.com):其 17 个工具中有 12 个带有上述 outputSchema 形态,导致 SDK 在 2025-11-25 会话上无法列出该服务的工具。同样的载荷在 2026-07-28 协议下可以正常通过。
报错原文
2026-07-28: ok
Traceback (most recent call last):
...
pydantic_core._pydantic_core.ValidationError: 1 validation error for ListToolsResult
tools.0.outputSchema.properties.result
Input should be a valid dictionary [type=dict_type, input_value=True, input_type=bool]
For further information visit https://errors.pydantic.dev/2.12/v/dict_type
原因分析
根因是类型模型与 JSON Schema 规范不一致。按 JSON Schema 2020-12,任何子 schema 位置都允许布尔值(true/false),包括 properties 中的属性值;但 2025-11-25 生成的 wire 模型把 InputSchema/OutputSchema 的 properties 标注为 dict[str, dict[str, Any]](位于 src/mcp-types/mcp_types/_v2025_11_25/__init__.py 约 1361 与 1379 行),因此 {"result": true} 触发 pydantic 的 dict_type 错误。
由于 ListToolsResult 是整体校验的,一个工具的 schema 不合规就会让整份工具列表被丢弃。Issue 认为 2025-11-25 的这种严格性来自 schema.ts 把 { [key: string]: object } 渲染为 JSON 的方式,而非规范文本要求;2026-07-28 的 surface 已通过 SEP-2106 / #2792 改为自由形式的 JSON Schema,所以能接受该载荷。可能原因还包括客户端侧缺少对布尔子 schema 的容错归一化(评论中提出的防御性方案),但该方向在 Issue 中尚未验证。
环境排查
- 确认
mcp与mcp-types版本;Issue 在 2.0.0 发布版及 main @ 57394b05 上均复现。 - 确认 pydantic 版本;Issue 在 2.13.4 与 2.12.5 上均复现。
- 确认 Python 版本;Issue 报告为 3.13.15。
- 确认客户端会话协商的 MCP 协议版本是否为
2025-11-25;切换或对比2026-07-28可帮助定位。 - 检查目标服务端
tools/list返回中是否含properties下的布尔值(如"result": true)。 - 如使用自建或修改过的生成类型,确认
scripts/gen_surface_types.py中的SCHEMA_PATCHES["2025-11-25"]是否已包含相关放宽补丁。
解决步骤
- 用 Issue 中的示例代码复现:同一工具定义分别对
2026-07-28与2025-11-25调用validate_server_result("tools/list", ...),确认后者抛出dict_type错误。 - 在
scripts/gen_surface_types.py中扩展已有的SCHEMA_PATCHES["2025-11-25"],把$defs/Tool/properties/{inputSchema,outputSchema}/properties/properties/additionalProperties放宽为anyOf:对象或{"type": "boolean"}。 - 重新生成 surface 类型,检查生成 diff 是否仅为
properties字段类型从dict[str, dict[str, Any]]变为dict[str, dict[str, Any] | bool],并确认 2026-07-28 模块无变化。 - 在
tests/types/test_methods.py增加回归测试,使用 Azure 载荷的确切形态{"type": "object", "properties": {"result": true}, "required": ["result"]},断言 2025-11-25 会话下tools/list可列出并调用该工具。 - 如暂不能改库:可优先尝试在客户端拿到校验结果前,对工具 schema 做布尔子 schema 归一化(如
true转为空 schema{}),或在校验失败时归一化后重试一次;同时让报错能指出具体出问题的工具名,便于服务端定位。
验证方法
重新运行 Issue 中的示例代码,确认 2025-11-25 分支不再抛出 ValidationError,两个协议版本均输出 ok;再用 Azure ARM MCP 或本地构造的含布尔 properties 的服务端执行实际 list_tools(),确认能返回完整工具列表(而非空列表或报错),并确认 2026-07-28 行为未发生改变。
参考来源
modelcontextprotocol/python-sdk #3353
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[v2] Expose request cancellation on MCPServer tool Context](https://www.chat-gpts.plus/wp-content/uploads/2026/11/3389-9eebc666-768x403.jpg)

