Deleting an MCP provider fails because the DELETE JSON body is ignored

该报错出现在 Dify 1.17.0 中删除 MCP Provider 时,原因是后端 `model_validate` 装饰器对 DELETE 请求只读取查询参数而忽略 JSON Body,导致 `provider_id` 校验失败返回 HTTP 422。优先检查 `wraps.py` 中 `mo

快速结论:该报错出现在 Dify 1.17.0 中删除 MCP Provider 时,原因是后端 `model_validate` 装饰器对 DELETE 请求只读取查询参数而忽略 JSON Body,导致 `provider_id` 校验失败返回 HTTP 422。优先检查 `wraps.py` 中 `model_validate` 对 DELETE 请求的处理逻辑。

适用环境:Dify 1.17.0,Self Hosted(Docker 部署),从 1.16.1 升级后更易触发。

最快修复方案:暂无官方发布的一步修复方案,可优先尝试修改 `api/controllers/console/wraps.py` 中 `model_validate` 装饰器(约 673-676 行),让 DELETE 请求在查询参数为空时回退读取 JSON Body:
raw = request.args.to_dict(flat=True) or (request.get_json(silent=True) or {})

注意事项:该修改会改变所有 DELETE 端点的参数解析行为,可能存在兼容性影响,建议先在测试环境验证;前端改用查询参数传 `provider_id` 也可绕过,但不够健壮。

问题场景

用户在 Dify 1.17.0(Docker 自托管)中通过 工具 > MCP 页面删除已配置的 MCP Provider 时触发。升级自 1.16.1 且已有 MCP Provider 配置的环境更容易复现。前端在 DELETE 请求的 JSON Body 中携带了 `provider_id`,但后端返回 HTTP 422,MCP Provider 无法删除。

报错原文

DELETE /console/api/workspaces/current/tool-provider/mcp HTTP/1.1 422

[
  {
    "type": "missing",
    "loc": ["provider_id"],
    "msg": "Field required",
    "input": {},
    "url": "https://errors.pydantic.dev/2.12/v/missing"
  }
]

原因分析

可能原因是 api/controllers/console/wraps.pymodel_validate 装饰器的参数源选择逻辑存在回归。该装饰器目前对 GET 和 DELETE 请求统一只读取查询参数(request.args),完全忽略 DELETE 请求携带的 JSON Body,导致 provider_id 校验时得到空对象。此问题由 PR #40238 引入——该 PR 将 ToolProviderMCPApi.delete 从手动读取 console_ns.payload 改为使用 @model_validate(MCPProviderDeletePayload),破坏了原有的请求契约。这与 #41109 是独立问题,即使 Body 中包含有效 UUID 也会因 Body 被忽略而删除失败。

环境排查

  • Dify 版本是否为 1.17.0(包含 Docker 自托管部署方式)
  • 是否从 1.16.1 或更早版本升级,且配置过 MCP Provider
  • 检查部署环境是否修改过 api/controllers/console/wraps.py 或相关依赖
  • 确认部署方式为官方 Docker Compose 部署

解决步骤

  1. 进入 Dify API 容器或后端源码目录,定位 api/controllers/console/wraps.py 文件。
  2. 找到 model_validate 装饰器中处理请求参数来源的代码段(约 673-676 行),当前逻辑为:
    if request.method in ("GET", "DELETE"): raw = request.args.to_dict(flat=True)
  3. 修改为回退逻辑,使 DELETE 请求在查询参数为空时读取 JSON Body:
    if request.method in ("GET", "DELETE"): raw = request.args.to_dict(flat=True) or (request.get_json(silent=True) or {})
  4. 重启 Dify API 服务,使修改生效。
  5. 回到前端,重新尝试删除 MCP Provider,确认 DELETE 请求返回成功。

验证方法

修改并重启后,在 Dify 界面重新尝试删除测试 MCP Provider。若删除成功且返回 200 响应,说明问题已修复。也可直接对 /console/api/workspaces/current/tool-provider/mcp 发送带 JSON Body 的 DELETE 请求,观察是否仍返回 422。

参考来源

langgenius/dify #41287

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20395

发表回复

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