AttributeError: ‘str’ object has no attribute ‘get’

在运行 RAGFlow v0.26.3 版本,并启用 MCP 服务器( --enable-mcpserver --mcp-mode=host )时,任何 MCP 客户端(如 Claude Code)执行 tools/list 请求,都会导致服务器崩溃,报错 AttributeError: 'str'

AttributeError: 'str' object has no attribute 'get'

AttributeError: ‘str’ object has no attribute ‘get’

快速结论:此错误发生在 RAGFlow MCP Server 的 tools/list 调用中,原因是 list_chats() 函数假设 /api/v1/chats 接口返回的 data 是一个列表,但实际上返回的是一个包含 chatstotal 键的对象。优先排查 mcp/server/server.pylist_chats() 函数对响应数据的解析逻辑。

问题场景

在运行 RAGFlow v0.26.3 版本,并启用 MCP 服务器(--enable-mcpserver --mcp-mode=host)时,任何 MCP 客户端(如 Claude Code)执行 tools/list 请求,都会导致服务器崩溃,报错 AttributeError: 'str' object has no attribute 'get'。初始化(initialize)可以成功,但 tools/list 请求失败,导致无法加载任何工具。

报错原文

MCP error 0: 'str' object has no attribute 'get'
ERROR:mcp.server.streamable_http:Error in message router
...
AttributeError: 'str' object has no attribute 'get'

原因分析

mcp/server/server.pylist_tools() 函数中,会依次调用 list_datasets()list_chats() 来构建工具描述。list_chats() 函数直接使用 res_json.get("data", []) 并假设 data 是一个列表,然后遍历它并调用 data.get("id")。但是,GET /api/v1/chats 接口返回的 JSON 结构中,data 是一个对象(字典),而不是列表:

{"code": 0, "data": {"chats": [], "total": 0}, "message": "success"}

因此,当遍历 data 字典时,迭代出的元素是字典的键("chats""total"),这些都是字符串。对字符串调用 .get() 方法就会触发 AttributeError。此问题导致 list_tools() 在调用 list_chats() 时整体失败,使得 MCP 服务器在 host 和 self-host 模式下均不可用。list_datasets() 不受影响,因为 GET /api/v1/datasets 返回的 data 确实是列表。

环境排查

  • RAGFlow 版本:v0.26.3
  • ragflow-mcp-server 版本:1.19.0(来自 initializeserverInfo
  • 部署方式:Docker,启用了 --enable-mcpserver --mcp-mode=host
  • 文档引擎:elasticsearch

解决步骤

已在 PR #16639 中修复,并已合入代码库。建议采用以下修复方式(已在 mcp/server/server.py 中实现):

  1. 定位到 mcp/server/server.py 文件中的 list_chats() 函数。
  2. 修改从响应中提取聊天数据的逻辑:将从 res_json 中获取的数据先进行类型判断,如果 data 是字典,则从 data["chats"] 中读取聊天列表,否则退化为直接使用 data 作为列表。
  3. 修复后的代码逻辑如下(可直接替换原有部分):
    _chats_data = res_json.get("data", [])
    if isinstance(_chats_data, dict):
        _chats_data = _chats_data.get("chats", [])
  4. 之后继续使用 _chats_data 进行遍历操作:for data in _chats_data: ...
  5. 如果你使用的是 Docker 部署,请拉取最新的 nightly 镜像(post-v0.26.3),或者等待下一个包含此修复的正式版本发布。如果你是从源码运行,可以直接从仓库拉取最新的代码。

验证方法

启动 RAGFlow 的 MCP 服务器后,使用任意 MCP 客户端发送 tools/list 请求。如果问题已解决,服务器将不再返回 MCP error 0: 'str' object has no attribute 'get' 错误,并且客户端能够正常列出所有可用的工具(包括数据集和聊天工具),日志中也不会出现 AttributeError 信息。

参考来源

infiniflow/ragflow #16727

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 14989

发表回复

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