快速结论:在 Dify 自托管控制台打开 MCP 工具提供商详情页时,前端把非 UUID 的 server_identifier 当作 provider UUID 传入路径,后端用它拼出 WHERE id = '...'::UUID,PostgreSQL 随即报 500。优先确认你的版本是否已包含前端数据源修复(PR #41360)。
适用环境:Dify 1.17.0;Self Hosted(Kubernetes);注册的是 MCP 工具提供商(Tools → MCP → streamable-http server);后端数据库为 PostgreSQL(报错来自 psycopg2)。
最快修复方案:升级到包含 PR #41360 提交的构建版本,或等待下一个带该修复的正式发布标签。该修复不在 1.17.0 中。
注意事项:PR #41360 的修复点在前端数据源边界(MCP 管理 UI 改用 /workspaces/current/tool-providers?type=mcp,返回数据库 UUID),运行时的 /workspaces/current/tools/mcp 目录接口仍按 server_identifier 暴露 id,这是有意保留的,不要据此自行改动后端返回结构,否则可能影响按 server_identifier 持久化解析 MCP provider 的 workflow/Agent 消费方。
问题场景
在 Dify 自托管控制台注册一个 MCP 工具提供商(Tools → MCP → 添加 streamable-http server)。数据库中 tool_mcp_providers 该行同时有 UUID id 和人类可读的 server_identifier(例如 my-mcp-tools)。当打开该 provider 的详情页(列出其工具的那个视图)时,前端发起:
GET /console/api/workspaces/current/tool-provider/mcp/tools/my-mcp-tools
即把 server_identifier 放进了路径(对应 web/service/use-tools.ts 中的 useMCPTools(providerID)),接口返回 HTTP 500。据 Issue 分析,update、auth、delete 等兄弟路由在同样的 identifier 回传场景下也会触发同一故障。
报错原文
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type uuid: "my-mcp-tools"
[SQL: SELECT ... FROM tool_mcp_providers
WHERE tool_mcp_providers.tenant_id = %(tenant_id_1)s::UUID AND tool_mcp_providers.id = %(id_1)s::UUID]
File "/app/api/services/tools/mcp_tools_manage_service.py", line 112, in get_provider
对应英文 issue 标题:[Bug] MCP provider detail endpoint returns 500 “invalid input syntax for type uuid” — server_identifier passed where a provider UUID is expected
原因分析
根因是 id 字段语义被混淆。据 Issue 正文与维护者回复:
api/services/tools/tools_transform_service.py中mcp_provider_to_user_provider执行response["id"] = db_provider.server_identifier if not for_list else db_provider.id,因此非列表响应(create/update)把server_identifier暴露为实体id,前端随后把它回传到详情调用中。ToolMCPDetailApi.get(api/controllers/console/workspace/tool_providers.py)直接调用service.get_provider(provider_id=provider_id, tenant_id=...),把路径段当作 UUIDid,从未传入server_identifier。get_provider因此生成WHERE tool_mcp_providers.id = 'my-mcp-tools'::UUID,PostgreSQL 拒绝该类型转换并抛出InvalidTextRepresentation。同一 service 中已有的get_provider_entity(by_server_id=...)双形态分发逻辑,未被ToolMCPDetailApi使用。
另据 Issue 元数据与评论,同类问题最早由 #41109、#41305、#41328 标记。候选修复 #41110(列表调用传 for_list=True)与 #41317(在 get_provider 中检测 UUID 形态并回退到 server_identifier)均被关闭,最终合并的是前端修复 PR #41360:MCP 管理 UI 改为从 /workspaces/current/tool-providers?type=mcp(useAllToolProviders(true, 'mcp'))获取 provider 列表,其 id 是数据库 UUID。被拒方案的理由是:改动共享运行时目录会破坏按 server_identifier 持久化解析 MCP provider 的 workflow/Agent 消费方,而按 UUID 形态推断对“UUID 形状的 identifier”存在歧义,且覆盖不到 update 路径中所有仅按 UUID 比较的逻辑。
环境排查
- 确认 Dify 版本:Issue 明确为 1.17.0,且该修复不在 1.17.0 中。
- 确认部署形态:Self Hosted(Kubernetes)。
- 确认后端数据库为 PostgreSQL(报错来自 psycopg2 的
InvalidTextRepresentation)。 - 确认问题出现位置:控制台 MCP provider 详情页,以及 update/auth/delete 等兄弟路由是否同样失败。
- 确认所请求路径中的
my-mcp-tools是否为非 UUID 的server_identifier。 - Issue 未提供 Python、CUDA、显卡等具体版本信息,这些项目无需作为排查依据。
解决步骤
- 先确认你是从 MCP 管理 UI 进入详情页触发的 500,并记录请求路径
/console/api/workspaces/current/tool-provider/mcp/tools/{server_identifier}中的标识符。 - 核对当前部署版本;若为 1.17.0 或任何早于 PR #41360 合并(2026-08-27)的构建,则该问题大概率仍存在。
- 升级到包含 PR #41360 提交的构建版本,或等待下一个包含该提交的正式发布标签。这是 Issue 中确认的修复路径。
- 不要采用被关闭的 #41110 / #41317 思路自行打补丁(例如在
get_provider中按 UUID 形态猜测分支),Issue 讨论已说明其局限与副作用。 - 若短期内无法升级,可优先尝试的规避方式是:暂时避免通过会回传
server_identifier的入口进入 MCP 详情/编辑/授权/删除流程。此规避方式未在 Issue 中验证,仅作临时手段。
验证方法
升级后重新在控制台打开该 MCP provider 的详情页(工具列表视图):前端应改为从 /workspaces/current/tool-providers?type=mcp 取得包含数据库 UUID 的 provider 列表,详情调用路径中携带的是 UUID 而非 server_identifier;接口返回 200 并正常列出该 provider 的工具,不再出现 invalid input syntax for type uuid。同时确认工作流/Agent 侧通过 /workspaces/current/tools/mcp 按 server_identifier 解析 MCP provider 的行为未受影响(该运行时目录按设计未改动)。
参考来源
相关:#41109、#41305、#41328、PR #41110、PR #41317、PR #41360
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


