1. 为什么要把 Dify 工作流变成第三方可调用服务
Dify 里跑通一个工作流只是第一步。真正让人头疼的是:你花了两天调好的「儿童故事绘本 PPT 生成」流程,同事想用、外部系统想调、另一个 Agent 想接,结果只能截图发链接,或者让对方也装一套 Dify。工作流被锁在 Dify 的聊天窗口里,出不去。
MCP-Server 这个插件解决的正是这件事。它把任意一个 Dify 应用(Chatflow 或 Workflow)抽象成一个符合 MCP 标准的 Server Endpoint,对外暴露 HTTP + SSE 两个地址。任何支持 MCP client 的工具——Cursor、Claude Desktop、Cline、Windsurf、Cherry Studio、魔搭 MCP 广场——都能像调用本地工具一样调用你的 Dify 工作流。你不用改一行工作流逻辑,只需要在插件里填一个 JSON Schema,服务就发布出去了。
但发布出去之后,调用侧的鉴权和路由又成了新问题。第三方工具五花八门,有的只认 Base URL + Key,有的要求 OpenAI 兼容格式,有的走 Anthropic 协议。如果每个客户端都单独配一套 Key、单独记一个地址,维护成本会迅速失控。这时候用 TaoToken 做统一 Key 和 API 通道就顺理成章:调用侧只认一个 Base URL、一个 Key,背后路由到不同模型和服务,Dify 工作流作为其中一个「工具端点」挂进来。
这篇文章面向三类人:已经在用 Dify 但工作流只在自己电脑上跑的开发者;想把内部工作流开放给外部系统调用的团队;以及正在搭 MCP 工具链、需要统一鉴权入口的工程师。下面从插件安装、.env 配置、Schema 编写、真实请求验证到报错排查,一步步走完。
2. TaoToken 前置准备:统一 Key 与 Base URL 怎么拿
在配置 MCP-Server 之前,先把调用侧的鉴权通道准备好。TaoToken 在这里扮演的角色是「统一入口」:你不需要为每个 MCP client 单独申请模型 Key,也不需要把 Dify 的内部 Key 暴露给第三方。调用方拿到的是 TaoToken 的 Key,请求先到 TaoToken 的 API 通道,再按路由规则分发。
第一步,打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册并登录控制台。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,进去之后左侧菜单找到 API Keys。
第二步,创建 Key。建议按用途命名,比如dify-mcp-thirdparty,方便后面排查是哪个客户端在调。创建完成后立刻复制保存,页面刷新后就不再完整显示。
第三步,记下两个核心参数:
| 参数 | 值 | 用途 |
|---|---|---|
| Base URL | https://taotoken.net/api | 所有 OpenAI 兼容请求的根地址 |
| API Key | 控制台生成的 sk- 开头字符串 | 调用侧鉴权 |
注意 Base URL 后面不要加/v1,也不要加斜杠。很多 401 和 404 都是因为地址拼错。如果你用的是 Anthropic 协议客户端(比如 Claude Code),Base URL 填同一个地址即可,TaoToken 会按请求头自动识别协议。
第四步,验证 Key 是否可用。用 curl 发一个最小请求:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的Key" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "ping"}] }'返回里出现choices数组就说明 Key 和通道都正常。如果返回 401,先检查 Key 有没有多余空格;如果返回local proxy failed,说明请求根本没到 TaoToken,检查网络出口。
这一步做完,你手里就有了调用侧的统一凭证。接下来配置 Dify 的 MCP-Server,把工作流发布出去,第三方客户端用这个 Key 就能调。
3. 可复制配置:MCP-Server 插件安装与 .env 修改
这一节是全文最需要动手的部分。我把它拆成三块:插件安装、.env 修改、Schema 填写。每一块都给可复制的片段。
3.1 安装 MCP-Server 插件
进入 Dify 工作台,左侧菜单点「插件」,在插件市场搜索MCP-server。注意名字里有个连字符,搜mcp server可能搜不到。找到由 Dify 社区贡献的那个 Extension 类型插件,点安装。安装完成后在「已安装」列表里能看到它。
3.2 修改 .env 文件
MCP-Server 要对外提供服务,默认的 localhost 绑定必须改掉,否则只有本机能访问。找到你 Dify 部署目录下的.env文件(如果你用的是官方 docker 部署,路径通常是dify/docker/.env)。搜索EXPOSE_PLUGIN_DEBUGGING_HOST,大约在 1001 行附近。
修改前:
PLUGIN_DEBUGGING_HOST=0.0.0.0 PLUGIN_DEBUGGING_PORT=5003 EXPOSE_PLUGIN_DEBUGGING_HOST=localhost EXPOSE_PLUGIN_DEBUGGING_PORT=5003 PLUGIN_DIFY_INNER_API_URL=http://api:5001 ENDPOINT_URL_TEMPLATE=http://localhost/e/{hook_id}修改后(把 localhost 换成你的局域网 IP 或公网 IP,这里以14.103.204.132为例):
PLUGIN_DEBUGGING_HOST=0.0.0.0 PLUGIN_DEBUGGING_PORT=5003 EXPOSE_PLUGIN_DEBUGGING_HOST=14.103.204.132 EXPOSE_PLUGIN_DEBUGGING_PORT=5003 PLUGIN_DIFY_INNER_API_URL=http://api:5001 ENDPOINT_URL_TEMPLATE=http://14.103.204.132/e/{hook_id}改完保存,执行docker compose restart重启 Dify。注意PLUGIN_DIFY_INNER_API_KEY那行不要动,改了会导致 agent 节点失败。
3.3 填写 App Input Schema
回到 Dify 工作台,插件 → MCP-server → 右上角加号,弹出配置页。四个字段:
- 端点名称:随便起,比如
pptchatflow - App:下拉选择你要发布的工作流
- App Type:Chat 或 Workflow,按实际选
- App Input Schema:JSON 格式,定义外部调用时传什么参数
Schema 的关键在properties和required,这两个值必须和你工作流的输入参数一一对应。比如你的工作流只有一个prompt输入变量,Schema 就写成:
{ "name": "pptchatflow", "description": "儿童故事绘本-ppt chatflow,输入主题生成 PPT", "inputSchema": { "title": "儿童故事绘本-ppt chatflow", "type": "object", "properties": { "prompt": { "title": "主题", "description": "输入一个儿童故事主题,工作流会生成对应 PPT", "type": "string" } }, "required": ["prompt"] } }如果你的工作流有多个输入变量,比如prompt和style,就在properties里加两个字段,required里按需列出必填项。保存后页面显示「服务正常」,说明 MCP-Server 已经跑起来了。
3.4 修正对外地址
保存后页面会显示两个地址,形如:
http://localhost/e/56uageiwt2ezf8e9}/sse http://localhost/e/56uageiwt2ezf8e9}/messages/这里有两个坑。第一,localhost 没被替换成你的 IP,手动改成14.103.204.132。第二,hook_id 后面多了一个右花括号},去掉它。修正后:
http://14.103.204.132/e/56uageiwt2ezf8e9/sse http://14.103.204.132/e/56uageiwt2ezf8e9/messages/把 SSE 地址贴到浏览器里访问,如果返回event: endpoint和data: messages/?session_id=...,说明网络通了,第三方可以访问。
4. 验证请求:用 Cherry Studio 和魔搭广场实测调用
配置完不验证等于没配。这一节用两个真实客户端跑一遍,确认第三方调用能拿到结果。
4.1 Cherry Studio 验证 Chatflow
打开 Cherry Studio(建议升级到 1.2.4 以上),找到「MCP 服务器」配置,点添加。类型选 SSE,名称填dify-ppt,URL 填刚才修正后的 SSE 地址:
http://14.103.204.132/e/56uageiwt2ezf8e9/sse保存后回到聊天窗口,选一个支持 function call 的模型。这里有个关键点:模型本身走的是 TaoToken 的通道,Base URL 填https://taotoken.net/api,Key 填你在第 2 节拿到的那个。这样模型调用和 MCP 工具调用走的是两套通道,互不干扰。
在对话框输入「喜羊羊与灰太狼」,模型会识别到pptchatflow这个工具并调用。点开工具调用详情,能看到它确实触发了 Dify 里那个 PPT 生成工作流。返回结果里会带一个 PPT 下载链接。
这里有个已知问题:如果 PPT 生成在 Dify 容器内部,第三方点链接是下载不了的,因为容器内文件没有公网出口。解决办法是在工作流里把生成的 PPT 上传到对象存储(比如腾讯 COS),返回公网可访问的 URL。这个改造在上期 PPT 工作流文章里有详细步骤,这里不展开。
4.2 魔搭 MCP 广场验证 Workflow
再拿一个 Workflow 类型的例子。我之前的即梦 AI 绘画工作流,App Type 选 Workflow,Schema 同样只有一个prompt:
{ "name": "Dream AI Painting", "description": "即梦 AI 绘画工作流,输入描述生成 4 张图", "inputSchema": { "title": "即梦 AI 绘画", "type": "object", "properties": { "prompt": { "title": "绘画描述", "description": "输入画面描述,工作流返回 4 张风格不同的图", "type": "string" } }, "required": ["prompt"] } }保存后拿到 SSE 地址http://14.103.204.132/e/boaavozuvj5w3dk9/sse。登录魔搭社区,进「MCP 广场」→「MCP 实验场」,点配置添加 MCP server,类型选 SSE,URL 填上面这个地址。保存后回到实验场,输入一段描述,比如「一只在星空下奔跑的柴犬」,执行。
结果返回 4 张风格不同的图。同时回到 Dify 工作流的调用记录里,能看到魔搭的 MCP client 发起的调用日志。这说明 Workflow 类型的发布和 Chatflow 一样跑通了。
4.3 用 curl 直接验证 SSE 端点
如果你不想装客户端,用 curl 也能验证端点是否活着:
curl -N http://14.103.204.132/e/boaavozuvj5w3dk9/sse-N关闭缓冲,你会看到持续输出的 SSE 事件流,包含event: endpoint和session_id。按 Ctrl+C 退出。这个命令只验证连通性,不触发实际工作流调用。
5. 常见报错排查:401、local proxy failed、reading choices
配置过程中最容易卡在几个固定报错上。这一节按报错原文对照排查,每条都给定位思路。
5.1 401 Unauthorized
调用侧返回 401,九成是 Key 问题。先确认三件事:Key 有没有复制完整(sk- 开头,后面没有省略号);请求头是不是Authorization: Bearer sk-xxx,注意 Bearer 后面有一个空格;Base URL 是不是https://taotoken.net/api,有没有多加/v1或结尾斜杠。
如果 Key 确认没问题还是 401,去 TaoToken 控制台看这个 Key 的状态,是不是被禁用或额度耗尽。另外检查请求有没有经过额外的代理层,有些代理会改写 Authorization 头。
5.2 local proxy failed
这个报错说明请求根本没到达 TaoToken 的服务端,在本地出口就失败了。常见原因:本机网络无法直连外网;请求地址写成了内网地址;或者客户端配置了错误的代理。排查方法是用 curl 直接打https://taotoken.net/api/v1/chat/completions,如果 curl 也失败,就是网络层问题,和 Key 无关。
5.3 reading choices 相关报错
返回体里出现reading 'choices'或cannot read property choices of undefined,说明服务端返回的 JSON 结构里没有choices字段。通常是模型名写错了,或者请求体格式不对。检查model字段是不是有效模型 ID,messages是不是数组格式。用第 2 节的 curl 命令做对照,能快速定位是请求体问题还是模型问题。
5.4 MCP 端点连不上
Cherry Studio 或魔搭里配置 SSE 后连不上,先确认三件事:SSE 地址里的 hook_id 有没有多余的};IP 是不是改成了公网或局域网可达地址;Dify 的 5003 端口有没有在防火墙放行。如果浏览器能打开 SSE 地址但客户端连不上,检查客户端是不是要求 HTTPS,部分平台对 HTTP 的 SSE 有限制。
5.5 OAuth 相关报错
如果客户端提示 OAuth 失败或 token 无效,说明该客户端走的是 OAuth 流程而不是简单 Bearer。这种情况下需要在 TaoToken 控制台确认该 Key 是否支持对应协议,或者改用支持 Bearer 的客户端。Claude Code 这类走 Anthropic 协议的客户端,Base URL 填https://taotoken.net/api,Key 填同一个,不需要额外 OAuth 配置。
6. 统一 Key 接入的后续玩法
走到这里,你已经完成了从 Dify 工作流到第三方可调用服务的完整链路:插件安装、.env 修改、Schema 编写、地址修正、真实客户端验证、报错排查。剩下的就是把这套模式复制到更多工作流上。
几个实用建议。第一,Schema 里的description写清楚,这是给模型看的,描述越准确,模型越容易在正确场景调用你的工具。第二,多个工作流发布时,端点名称不要重复,否则客户端里分不清。第三,调用侧统一用 TaoToken 的 Key,不要每个客户端单独发 Key,否则轮换和审计会很痛苦。
如果你要长期跑编码类或 Agent 类任务,建议看一下 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,里面有按量计费和额度包的对比。需要管理多个 Key 和查看调用日志,去控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有各协议的 Base URL 对照表。想先试试模型对话效果,直接开 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 生成 Key 就能用。
最后提醒一个我踩过的坑:改完 .env 一定要重启 Dify,只保存不重启,MCP-Server 读的还是旧配置,地址里会一直显示 localhost。重启命令是docker compose restart,在 dify/docker 目录下执行。