issue: MCP tool errors reach the model as a Python list dump instead of the server’s error text

当模型通过 MCP(Streamable HTTP)调用工具,而传入参数是合法 JSON 但不符合工具 schema 时,Open WebUI 会把 MCP 服务器返回的 content 列表用 Python repr 序列化成 {"error": "..."} 交给模型,导致模型看不到「哪个参数缺

快速结论:当模型通过 MCP(Streamable HTTP)调用工具,而传入参数是合法 JSON 但不符合工具 schema 时,Open WebUI 会把 MCP 服务器返回的 content 列表用 Python repr 序列化成 {“error”: “…”} 交给模型,导致模型看不到「哪个参数缺失/类型错误」,从而反复用同样的错误参数重试。优先排查 backend/open_webui/utils/mcp/client.py 中 MCPClient.call_tool 的 isError 分支。

适用环境:Open WebUI v0.12.3(Docker 安装,镜像内安装 open-webui==0.12.3 到 Debian venv;问题位于该 PyPI 包本身);Windows 11 + Docker Desktop;MCP 服务器为独立 .NET 进程(问题本身不依赖 Windows);未使用 Ollama,模型通过 OpenAI 兼容 API 访问并启用原生工具调用(native tool calling);浏览器无关。

最快修复方案:Issue 讨论中已给出针对 PR #32942 的修复思路(该 PR 是否已合入并验证,Issue 中未明确说明,可优先尝试):在 MCPClient.call_tool 的 isError 分支中,不要直接 Exception(result_content),改为与成功路径一致地提取 content 中的 text 块,用该文本抛出异常;当没有 text 块时给出可读的兜底信息。

注意事项:该修复属于代码层修改,需改动 backend/open_webui/utils/mcp/client.py 并重新构建/部署容器,不是配置项开关;Issue 中未提供正式发布版本号,升级前请确认目标版本是否已包含该 PR;PR 附带回归测试的计划在评论中提出,是否落地未在 Issue 中确认。

问题场景

在 Open WebUI v0.12.3 中添加一个 MCP(Streamable HTTP)服务器连接,启用其中的工具(例如名为 get_section、要求 scenariocode 与 sectioncode 两个必填参数的工具),并对使用原生函数调用的模型开启该工具。当模型生成的工具调用 JSON 可以解析、但违反工具 input schema(例如漏掉 sectioncode、sectioncode 传成数字或对象、嵌套字符串短于 minLength、出现被 additionalProperties: false 禁止的属性)时,服务器返回的校验失败信息在回传给模型时被错误序列化,触发本问题。

报错原文

issue: MCP tool errors reach the model as a Python list dump instead of the server's error text

{
  "error": "[{'type': 'text', 'text': \"An error occurred invoking 'get_section'.\", 'annotations': None, 'meta': None}]"
}

原因分析

问题分为两层:内层错误文本由 MCP 服务器生成;Open WebUI 在回传时会把整个 content 块字符串化,导致模型收到的是 MCP content 对象的 Python 表示(单引号、annotations/meta 等字段),而不是面向模型的可读错误说明。根据 Issue 中提交者的定位,backend/open_webui/utils/mcp/client.py 的 MCPClient.call_tool 在 isError 分支中执行 Exception(result_content),直接对完整的 content 列表做字符串化;而成功路径会提取 text 块。因此模型无法判断参数被拒绝,只能以相同结构重试。关联 Issue #28926 表明 MCP 结果处理在到达模型前已被错误归一化,本问题是同一客户端归一化逻辑的错误路径。

环境排查

  • 确认 Open WebUI 版本是否为 v0.12.3,并检查所用镜像中实际安装的 open-webui 包版本;Issue 提到相关代码路径在当时的 main 中仍存在。
  • 确认 MCP 服务器连接类型为 MCP(Streamable HTTP),且工具确实暴露了带 required 字段的 input schema。
  • 确认模型侧已启用原生工具调用(native tool calling),而非由其他方式模拟。
  • 确认模型通过 OpenAI 兼容 API 访问;本问题与 Ollama、浏览器无关,无需排查 CUDA、PyTorch、显卡驱动等环境。
  • 检查 backend/open_webui/utils/mcp/client.py 的 MCPClient.call_tool 中 isError 分支是否仍为 Exception(result_content)。

解决步骤

  1. 先按 Issue 的复现步骤构造一次违反 schema 的工具调用(例如省略 sectioncode),在追加给下一次模型请求的工具结果中确认出现 {“error”: “[{‘type’: ‘text’, …}]”} 形式的 Python 列表字符串。
  2. 定位 backend/open_webui/utils/mcp/client.py 中的 MCPClient.call_tool,找到 isError 分支里 Exception(result_content) 这一行。
  3. 按 Issue 中修复作者描述的思路修改:在该分支中与成功路径一致地提取 content 中的 text 块,用提取出的文本抛出异常;没有 text 块时返回可读的兜底错误信息,而不是列表 repr。
  4. 重新构建并部署 Open WebUI 容器,使修改生效。
  5. 可优先尝试参考 PR #32942 的实现与其回归测试,确认与当前代码分支兼容后再合入。

验证方法

再次让模型用违反 schema 的参数调用同一个工具(如 get_section 漏传 sectioncode),检查下一次模型请求中的工具结果是否为可读文本,例如包含 “An error occurred invoking ‘get_section’: The arguments dictionary is missing a value for the required parameter ‘sectioncode’.” 或明确指出参数被拒绝的说明,而不是带单引号和 annotations/meta 字段的 Python 列表字符串。若模型能在下一轮修正参数并成功调用,说明问题已解决。

参考来源

open-webui/open-webui #32918

相关修复 PR:open-webui/open-webui #32942

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29951

发表回复

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