Log exceptions in tool calls

该问题发生在 MCP Python SDK 2.x 服务端调用工具(tool call)抛出异常时,SDK 只返回错误结果但不记录错误日志,导致排障困难。优先排查服务端 `server.py` 中 `_handle_call_tool` 方法是否已补充 `logger.exception()` 调用

快速结论:该问题发生在 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 捕获。

解决步骤

  1. 定位 src/mcp/server/mcpserver/server.py 文件中的 _handle_call_tool 方法。
  2. 找到 except Exception as e: 代码块,在 return CallToolResult(is_error=True) 之前添加一行日志调用:
    logger.exception(f"Error calling tool {params.name}")
  3. 如果无法直接修改源码,检查是否可使用 MCP Python SDK 的更新版本(包含 PR #3271 的修复)。PR #3271 同时添加了一个测试,断言 ERROR 级别的日志记录与 is_error 结果同时产生。
  4. 修改完成后重启 MCP 服务器进程,确保新代码生效。

验证方法

触发一次工具调用异常(例如让工具抛出 ToolError 或运行时错误),观察服务器日志中是否出现 Error calling tool [工具名] 的 ERROR 级别日志记录。同时确认客户端仍能正常收到 is_error=True 的结果,即修复不影响协议行为。

参考来源

modelcontextprotocol/python-sdk #3266
PR #3271 – Add missing logger.exception in _handle_call_tool

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20158

发表回复

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