
AttributeError: ‘str’ object has no attribute ‘get’
快速结论:此错误发生在 RAGFlow MCP Server 的 tools/list 调用中,原因是 list_chats() 函数假设 /api/v1/chats 接口返回的 data 是一个列表,但实际上返回的是一个包含 chats 和 total 键的对象。优先排查 mcp/server/server.py 中 list_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.py 的 list_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(来自
initialize的serverInfo) - 部署方式:Docker,启用了
--enable-mcpserver --mcp-mode=host - 文档引擎:elasticsearch
解决步骤
已在 PR #16639 中修复,并已合入代码库。建议采用以下修复方式(已在 mcp/server/server.py 中实现):
- 定位到
mcp/server/server.py文件中的list_chats()函数。 - 修改从响应中提取聊天数据的逻辑:将从
res_json中获取的数据先进行类型判断,如果data是字典,则从data["chats"]中读取聊天列表,否则退化为直接使用data作为列表。 - 修复后的代码逻辑如下(可直接替换原有部分):
_chats_data = res_json.get("data", []) if isinstance(_chats_data, dict): _chats_data = _chats_data.get("chats", []) - 之后继续使用
_chats_data进行遍历操作:for data in _chats_data: ...。 - 如果你使用的是 Docker 部署,请拉取最新的 nightly 镜像(post-v0.26.3),或者等待下一个包含此修复的正式版本发布。如果你是从源码运行,可以直接从仓库拉取最新的代码。
验证方法
启动 RAGFlow 的 MCP 服务器后,使用任意 MCP 客户端发送 tools/list 请求。如果问题已解决,服务器将不再返回 MCP error 0: 'str' object has no attribute 'get' 错误,并且客户端能够正常列出所有可用的工具(包括数据集和聊天工具),日志中也不会出现 AttributeError 信息。



