)
1. 为什么 Dify 插件 MCP 是 Agent 开发的分水岭如果你正在用 Dify 搭 Agent大概率遇到过这个场景工作流里想让模型查一下数据库、读一个本地文件、或者调一个内部 HTTP 接口结果发现要么得自己写一个自定义工具再打包成插件要么在代码节点里硬编码请求逻辑。每接一个新工具就多一份胶水代码维护成本随工具数量线性上涨。MCPModel Context Protocol模型上下文协议要解决的就是这件事。你可以把它理解成 AI 世界的 USB-C 接口以前每个外设都有自己的插头现在统一成一个标准口。MCP 把「模型要调用的外部能力」抽象成标准化的服务端服务端负责暴露工具tools、资源resources和提示模板prompts客户端这里是 Dify只负责按协议发现和调用。模型不再需要知道某个工具是数据库还是文件系统它只需要知道「有一个叫 query_user 的工具参数是 SQL」。Dify 的插件体系则提供了另一层价值它把 MCP 客户端能力做成了可安装的插件你不需要改 Dify 源码在插件市场装一个「MCP SSE」或「Agent 策略支持 MCP 工具」就能让 Agent 节点动态发现远端 MCP 服务暴露的工具。两者结合后一个可运行的插件化 Agent 工作流大致是这样Dify 负责编排对话入口、上下文管理、Agent 决策循环MCP 插件负责工具发现与调用远端 MCP Server 负责真正执行。这套组合适合谁三类人最直接受益一是做企业内部知识助手、需要接内部 API 的开发者二是做多工具编排 Agent、不想为每个工具写适配层的团队三是想快速验证 MCP 生态工具、又不想从零搭客户端的个人开发者。本文会从零走一遍装插件、配 MCP Server、用 TaoToken 统一 Key 打通模型调用、验证请求、排错。每一步都给可复制的配置片段。需要先说明一个前提Dify 本身要能调用大模型Agent 节点才能做决策。模型接入这块我用 TaoToken 的统一 Key 通道一个 Key 覆盖多家模型省去在 Dify 里逐个配 provider 的麻烦。下面进入实操。2. TaoToken 前置统一 Key 与 API 通道准备在动 Dify 插件之前先把模型调用通道理顺。原因很简单Agent 节点每轮决策都要调模型如果模型通道不稳定或配置分散后面 MCP 工具调通了也跑不起来。TaoToken 在这里的角色是「统一入口」——你拿到一个 Key配一个 Base URL就能在 Dify 里调用多家模型不用为每个模型厂商单独维护一套凭证。第一步是拿 Key。访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进入控制台在 API Keys 页面创建一个新 Key。建议按用途分 Key比如「dify-agent-dev」一个、「dify-prod」一个方便后面按 Key 维度看用量和排障。创建后立刻复制保存页面刷新后不再完整显示。第二步是确认 API 地址。TaoToken 的 API 端点是 https://taotoken.net/api注意这个地址不带任何查询参数直接作为 Base URL 使用。在 Dify 的模型供应商配置里如果你选的是「OpenAI-API-compatible」这类通用兼容入口Base URL 填 https://taotoken.net/apiKey 填刚才创建的模型名填你要用的具体模型 ID。这里有个容易踩的坑Dify 里不同模型供应商插件的 Base URL 拼接规则不一样。有的插件会在你填的 Base URL 后面自动补 /v1/chat/completions有的则要求你填到 /v1 为止。TaoToken 的兼容层对这两种都支持但你要保证最终请求路径是 https://taotoken.net/api/v1/chat/completions 这种形态。实测下来在 Dify 的 OpenAI-API-compatible 配置里Base URL 填 https://taotoken.net/api 即可插件会自己补全路径。如果你填成 https://taotoken.net/api/v1有些版本会拼成 /v1/v1/chat/completions 导致 404。第三步是确认模型 ID。在控制台的模型列表里能看到当前 Key 可用的模型。Agent 场景建议选工具调用能力强的模型因为 MCP 工具发现和调用依赖模型的 function calling 能力。把模型 ID 记下来后面在 Dify Agent 节点里要填。如果你还想先单独验证 Key 是否可用不用急着进 Dify可以直接用 curl 打一发curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d { model: 你的模型ID, messages: [{role: user, content: 回复 ok}], max_tokens: 16 }返回里能看到 choices[0].message.content 就说明通道通了。这一步通过后再进 Dify能省掉后面「到底是模型通道问题还是 MCP 问题」的扯皮。关于 Key 管理和模型列表控制台入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API Keys 页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。3. 可复制配置Dify 插件安装与 MCP Server 接入这一节是全文的核心操作区所有片段都可以直接复制改参数。先明确版本要求Dify 建议 1.3.0 及以上低版本插件市场里可能搜不到「Agent 策略支持 MCP 工具」。进入 Dify 控制台后点右上角「插件」进入插件市场。需要装两个插件。第一个是「Agent 策略支持 MCP 工具」它让 Agent 节点具备通过 MCP 发现工具的能力第二个是「MCP SSE」或「MCP StreamableHTTP」负责实际的传输层连接。搜索关键词用「MCP」即可注意选官方或高下载量的版本版本号建议 0.0.8 及以上旧版在 streamable_http 传输下有过 Content-Type 兼容问题。装完后进入 MCP 插件的配置页。这里要填的是 MCP Server 的连接信息。Dify 的 MCP 插件配置是一个 JSON 结构键是服务别名值是连接参数。可复制片段如下{ my-mcp-server: { transport: streamable_http, url: http://127.0.0.1:8000/mcp/, headers: { Authorization: Bearer your-mcp-token }, timeout: 60 } }逐字段说明。transport 支持 streamable_http 和 sse 两种新服务优先用 streamable_http它是 MCP 较新的传输规范支持流式返回。url 是 MCP Server 的端点注意末尾的斜杠——很多 MCP Server 实现要求路径以 / 结尾少了会返回 307 重定向或直接报 Unsupported Content-Type。headers 里放认证信息如果你的 MCP Server 没开认证就留空对象。timeout 单位是秒工具执行慢的场景比如跑 SQL建议给到 60 以上。如果你用的是 SSE 传输配置形态不同{ my-sse-server: { transport: sse, url: http://127.0.0.1:8000/sse, headers: {}, timeout: 60 } }SSE 模式下有个关键点工具列表留空让插件自动发现。如果你手动填了工具名但和服务端实际暴露的不一致会出现「工具存在但调用 404」的怪现象。接下来是 Agent 节点配置。新建一个 Chatflow 应用把默认的 LLM 节点删掉添加「Agent」节点。在 Agent 策略里选「ReAct」模式工具列表选「通过 MCP 发现工具」。然后在模型配置里供应商选 OpenAI-API-compatibleBase URL 填 https://taotoken.net/apiKey 填你的 TaoToken Key模型 ID 填你在控制台确认的模型。这三件套Base URL Key Model ID必须齐全缺一个 Agent 节点就无法发起决策请求。Agent 的指令提示词可以这样写把工具使用意图说清楚你是一名数据助手。当用户询问数据相关问题时优先调用已发现的 MCP 工具完成查询不要凭空编造数据。 调用工具前先说明你要调用哪个工具、传什么参数。 如果工具返回错误把原始错误信息展示给用户不要自行改写。配置保存后Dify 会在 Agent 节点初始化时连接你配置的 MCP Server拉取工具列表。你可以在节点右侧的调试面板看到「已发现 N 个工具」的提示。如果显示 0 个工具先别急着改 Agent回到 MCP 插件配置页检查连接。4. 验证请求从工具发现到成功返回配置完成后必须做端到端验证否则你不知道是「工具没发现」还是「模型没调工具」还是「工具执行失败」。验证分三层逐层往上排。第一层验证 MCP Server 本身可达。在 Dify 所在机器上直接 curl 你的 MCP Server 端点curl -i -X POST http://127.0.0.1:8000/mcp/ \ -H Content-Type: application/json \ -H Accept: application/json, text/event-stream \ -d {jsonrpc:2.0,id:1,method:tools/list,params:{}}如果返回 200 且 body 里有 tools 数组说明 MCP Server 正常。如果返回 401检查 headers 里的 token如果返回 404检查 url 路径和末尾斜杠如果返回 415检查 Content-Type 和 Accept 头——streamable_http 要求 Accept 同时包含 application/json 和 text/event-stream。第二层验证 Dify 插件能发现工具。在 Agent 节点调试面板点「刷新工具」观察日志。成功时你会看到类似discovered tools: [query_user, list_files]的输出。如果这里报PluginInvokeError: Unsupported Content-Type八成是 url 末尾少了斜杠或者 MCP Server 返回的 Content-Type 不是插件预期的类型。补上斜杠重试。第三层验证模型能正确调用工具。在 Chatflow 预览里输入一个明确需要工具的指令比如「帮我查一下 users 表里 id 为 1 的记录」。观察执行链路Agent 节点先调模型走 TaoToken 通道模型返回一个 tool_callDify 把 tool_call 转成 MCP 请求发给 MCP ServerServer 执行后返回结果Dify 再把结果喂回模型生成最终回复。成功时你在调试面板能看到完整的调用链LLM 请求 → tool_call → MCP 请求 → MCP 响应 → LLM 请求 → 最终回复。如果模型这一步没返回 tool_call 而是直接编了一段回答说明模型没识别出要用工具。这时候检查两点一是 Agent 提示词里有没有明确要求「优先调用工具」二是你选的模型是否支持 function calling。部分轻量模型不支持工具调用换一个工具能力强的模型 ID 即可。如果 MCP 请求发出去了但返回错误把错误原文贴出来看。常见的是参数 schema 不匹配——模型生成的参数名和 MCP Server 定义的 inputSchema 对不上。这时候要么在 MCP Server 端放宽 schema要么在 Agent 提示词里把参数格式写清楚。验证通过后建议把这条链路固化成一个测试用例固定输入、固定预期工具调用、固定预期返回结构。后面改提示词或换模型时跑一遍就知道有没有回归。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节按真实报错来每个错误给现象、原因、修法。401 Unauthorized。两种来源要分清。如果错误发生在调 TaoToken 模型时说明 Key 无效或没带上。检查 Dify 模型配置里的 Key 是否完整、有没有多余空格、Base URL 是否是 https://taotoken.net/api。如果错误发生在调 MCP Server 时说明 MCP 插件配置里的 headers.Authorization 不对。注意 MCP 的 token 和 TaoToken 的 Key 是两套东西别混用。修法分别用 curl 单独验证两个通道定位是哪一个 401。local proxy failed。这个报错通常出现在 Dify 通过插件访问外部服务时本质是网络层不通。可能原因MCP Server 地址填的是 127.0.0.1 但 Dify 跑在容器里容器内的 127.0.0.1 指向容器自己而不是宿主机。修法把 url 里的 127.0.0.1 换成宿主机的可达 IP或者用 Docker 的 host.docker.internalLinux 下需要额外配置。另一个原因是 MCP Server 没启动先确认进程在监听。reading choices 相关报错。典型形态是Cannot read properties of undefined (reading choices)或reading 0。这说明模型返回体里没有 choices 字段但代码按 OpenAI 格式去取了。原因通常是 Base URL 配错导致请求打到了非兼容端点或者模型 ID 不存在返回了错误体。修法先用第 2 节的 curl 命令确认 https://taotoken.net/api/v1/chat/completions 返回正常结构再回 Dify 检查 Base URL 有没有多写 /v1 导致路径重复。如果返回体是{error: {...}}把 error.message 读出来通常是模型 ID 拼错或该 Key 无此模型权限。OAuth 相关报错。如果你接的 MCP Server 走 OAuth 授权报错可能是invalid_token或OAuth flow not completed。MCP 的 OAuth 需要先完成授权码流程拿到 access_token再把 token 放进 headers。Dify 的 MCP 插件本身不帮你跑 OAuth 流程你需要自己在外部完成授权、拿到 token 后填进配置。修法确认 token 没过期OAuth token 通常有有效期过期就重新授权换新 token。如果 MCP Server 支持长期 API Key 认证优先用 API Key 而不是 OAuth省掉刷新逻辑。工具发现为 0。除了前面说的斜杠问题还有一个隐蔽原因MCP Server 的 tools/list 返回了工具但工具的 inputSchema 里有 Dify 插件不支持的 JSON Schema 关键字比如 oneOf、anyOf 嵌套过深。修法简化 schema把复杂联合类型拆成多个独立工具。Agent 不调工具直接回答。这不是报错但很常见。原因有三模型不支持 function calling、提示词没强调用工具、工具描述太模糊。修法换支持工具调用的模型提示词里加「必须调用工具获取数据禁止编造」在 MCP Server 端把工具的 description 写清楚模型是靠 description 判断何时调用的。排障时建议开 Dify 的详细日志把 LLM 请求体、MCP 请求体、响应体都打出来。很多问题看一眼原始请求就明白了。如果你在接入文档里找不到对应说明可以对照 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里的接口规范核对字段。6. 长期编码与 Agent 工作流的通道选择把 Dify MCP 跑通只是第一步。真正投入日常开发后你会面临一个通道选择问题Agent 工作流每轮决策都调模型调用频次远高于普通对话这时候用按次计费的临时 Key 还是用套餐制的 Coding Plan成本差异会很明显。如果你的场景是长期跑 Agent、做自动化编码辅助、或者需要频繁做工具调用循环建议用 Coding Plan 这类套餐通道。入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。它的逻辑是给你一个稳定的调用额度池适合高频、持续的 Agent 场景不用每次调用都心疼 token。而如果你只是偶尔验证模型输出、调试提示词用模型对话页面就够了入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 里的对话功能按需调用。具体到 Dify 里的配置如果你切到 Coding Plan 通道Base URL 和 Key 的填法不变还是 https://taotoken.net/api 加对应 Key只是 Key 的额度来源不同。Dify 侧无感知Agent 节点照常工作。这也是统一通道的好处换套餐不用改 Dify 配置只换 Key 即可。还有一个实战建议把 MCP Server 和 Dify 的部署位置规划好。如果 MCP Server 要访问内网数据库它得部署在内网可达的位置Dify 如果跑在公网两者之间的网络策略要提前打通。我试过把 MCP Server 和 Dify 放同一台机器用 Docker Compose 编排网络用同一个 bridge配置里 url 直接写服务名省掉 IP 变动带来的维护成本。最后留一个可跟做的收尾动作把你验证通过的那条 Agent 链路连同 MCP 配置 JSON、Agent 提示词、测试输入一起存成一个模板。下次接新工具时只改 MCP Server 的 url 和工具描述Agent 节点和模型通道完全复用。这样每接一个新能力增量成本就是一段 JSON 配置而不是重新搭一遍工作流。