快速结论:该问题发生在 MCP Python SDK 2.x 服务端调用工具(tool call)抛出异常时,SDK 只返回错误结果但不记录错误日志,导致排障困难。优先排查服务端 `server.py` 中 `_handle_call_tool` 方法是否已补充 `logger.exception()` 调用。
适用环境:已确认环境:MCP Python SDK 2.x(当前稳定版,含最新 main 分支)、Python 3.13.5。操作系统、CUDA、显卡等其他环境信息在 Issue 中未提及,不做补充。
最快修复方案:升级到包含 PR #3271 修复的版本,或在服务端 `_handle_call_tool` 方法的 `except Exception` 块中、`return` 之前添加一行:logger.exception(f"Error calling tool {params.name}")。
注意事项:此修复仅影响服务端日志输出,不改变 `CallToolResult(is_error=True)` 的返回行为;若你的工具依赖捕获 `ToolError` 做流程控制,添加日志不会改变异常处理路径,但需注意日志级别为 ERROR,可能增加日志量。
问题场景
在使用 MCP Python SDK 2.x 构建 MCP 服务器时,客户端调用服务器注册的工具(tool),工具执行过程中抛出异常(包括自定义的 ToolError 或其他未预期异常)。对比之下,资源读取(resource)和提示词获取(prompt)操作在异常时都会记录错误日志,唯独工具调用异常时静默处理,只向客户端返回 is_error=True,服务器端不留下任何错误痕迹。
报错原文
Any exception while reading a resource or getting a prompt is being logged, while any exception during a tool call is not.
except Exception as e:
# 缺少 logger.exception(...) 调用
return CallToolResult(is_error=True)
原因分析
可能原因:服务端核心处理逻辑位于 src/mcp/server/mcpserver/server.py 的 _handle_call_tool 方法。该方法在 except Exception 块中直接返回 CallToolResult(is_error=True),但从未调用 logger.exception()。而对应的资源处理函数 _handle_read_resource(约第 566 行)和提示词处理函数 _handle_get_prompt(约第 1296 行)在各自的错误处理分支中都调用了 logger.exception()。
补充说明:需要特别注意的是,ToolError 继承自 MCPServerError,而非 MCPError,因此它会被 except Exception 捕获,而不会被基础处理器中的 except MCPError: raise 重新抛出。在 return 前添加 logger.exception() 可以同时捕获 ToolError 和其他未预期异常。
环境排查
- 确认 MCP Python SDK 版本为 2.x(当前稳定版),并检查是否已包含 PR #3271 的修复。
- 确认 Python 版本(Issue 中验证为 3.13.5,但其他版本也可能受影响)。
- 检查服务器代码中
_handle_call_tool方法的except Exception块,确认是否已包含logger.exception()调用。 - 若使用了自定义错误类型,确认其继承关系:
ToolError继承MCPServerError,会被except Exception捕获。
解决步骤
- 定位
src/mcp/server/mcpserver/server.py文件中的_handle_call_tool方法。 - 找到
except Exception as e:代码块,在return CallToolResult(is_error=True)之前添加一行日志调用:logger.exception(f"Error calling tool {params.name}") - 如果无法直接修改源码,检查是否可使用 MCP Python SDK 的更新版本(包含 PR #3271 的修复)。PR #3271 同时添加了一个测试,断言 ERROR 级别的日志记录与
is_error结果同时产生。 - 修改完成后重启 MCP 服务器进程,确保新代码生效。
验证方法
触发一次工具调用异常(例如让工具抛出 ToolError 或运行时错误),观察服务器日志中是否出现 Error calling tool [工具名] 的 ERROR 级别日志记录。同时确认客户端仍能正常收到 is_error=True 的结果,即修复不影响协议行为。
参考来源
modelcontextprotocol/python-sdk #3266
PR #3271 – Add missing logger.exception in _handle_call_tool
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[bug]: Model Library](https://www.chat-gpts.plus/wp-content/uploads/2026/08/9468-2093c507-768x403.jpg)