1. 从一句“把天气发给张三”说起DifyMCP 智能体到底能做什么你对着聊天框输入“把广州的天气情况通过微信发送给张三”几秒后微信里张三真的收到了一条天气消息。这背后不是某个写死的脚本而是一条完整的智能体链路Dify 负责理解意图、编排决策MCP 负责把“查天气”和“发微信”两个能力标准化地暴露给模型模型再按需调用。这套组合适合谁适合已经用过 Dify 做过简单对话应用、想进一步让应用“动手干活”的开发者也适合手里有一堆零散 Python 脚本、想用统一协议把它们接进大模型的人。传统做法里你要在 Dify 里写自定义工具每个工具都要手动定义 OpenAPI Schema改一个参数就得重新导入。而 MCPModel Context Protocol把这件事标准化了工具以 Server 的形式独立运行Dify 通过 MCP 插件去发现和调用工具增删改都不需要动 Dify 的工作流本身。我试过把天气查询和微信发送拆成两个独立 MCP ServerDify 侧只配置一次连接后面加第三个、第四个工具几乎零成本。这篇内容会带你走完完整链路先准备两个 MCP Server一个查天气、一个发微信再在 Dify 里装 MCP 插件、配好连接、建 Agent 应用最后真发一条消息验证并把常见的 401、连接失败、工具列表为空这些坑逐个排掉。全程命令和配置都可直接复制Windows 环境为主其他系统把路径换掉即可。2. 前置准备TaoToken 接入与 MCP Server 运行环境搭建在动手写 Server 之前先把两件事定下来模型从哪来、Python 环境怎么管。模型侧我用 TaoToken 做统一接入它兼容 OpenAI 风格的接口Dify 里选模型时填 Base URL 和 Key 就能用省去到处申请不同厂商 Key 的麻烦。你可以在官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 了解接入方式API 地址是 https://taotoken.net/api注意这个地址后面不加 UTM 参数。环境侧用 uv 管理 Python 项目和虚拟环境它比 pip 快很多而且uv init出来的项目结构清晰。Windows 下先装 uvpowershell -ExecutionPolicy ByPass -c irm https://astral.sh/uv/install.ps1 | iex装完后新开一个终端确认uv --version能输出版本号。接下来建两个独立项目目录一个放微信发送 Server一个放天气查询 Server。为什么要分开因为两个 Server 职责不同、依赖不同分开后各自启动、各自占端口互不干扰也方便单独重启调试。微信发送 Server 依赖wxauto它通过 UI 自动化操作微信 PC 客户端所以本机必须装微信 PC 版并完成扫码登录。这里有个硬性限制wxauto只兼容 3.9.x 版本的微信 PC 客户端版本太新会找不到控件。天气 Server 依赖httpx做异步 HTTP 请求调用的是公开的天气接口不需要额外 Key。两个 Server 都用 MCP 官方 Python SDK 的FastMCP来写它把工具注册、SSE 传输这些样板代码都封装好了你只需要关心工具函数本身。端口规划上微信 Server 用 8000天气 Server 用 8001后面 Dify 配置里会分别指向这两个端口。如果你本机 8000 被占用换成其他端口也行只要 Dify 配置同步改。还有一点要提前确认Dify 如果是用 Docker Desktop 跑的容器内部访问宿主机要用host.docker.internal这个域名不能用localhost。这是后面配置 MCP 连接时最容易踩的坑先记住。3. 可复制配置两个 MCP Server 的完整代码与 Dify 侧 JSON先写微信发送 Server。建目录、初始化、装依赖uv init wechat cd wechat uv venv .venv\Scripts\activate uv add mcp[cli] wxauto如果激活虚拟环境时报“无法加载 .venv\Scripts\activate.ps1因为在此系统上禁止运行脚本”用管理员权限开一个 PowerShell执行Set-ExecutionPolicy RemoteSigned确认后再回来激活。main.py内容如下注意端口是 8000传输方式用 SSEfrom mcp.server.fastmcp import FastMCP from wxauto import WeChat mcp FastMCP(port8000) wx WeChat() mcp.tool() async def send_wechat_msg(msg: str, who: str) - str: send wechat text message wx.ChatWith(who) wx.SendMsg(msg, who) return success if __name__ __main__: mcp.run(transportsse)wx.ChatWith(who)会切换到指定好友的聊天窗口wx.SendMsg(msg, who)发送消息。who传好友备注名必须和微信里显示的完全一致差一个字都会找不到人。再写天气 Serveruv init weather cd weather uv venv .venv\Scripts\activate uv add mcp[cli] httpxmain.py内容如下端口改成 8001import httpx import urllib.parse from mcp.server.fastmcp import FastMCP mcp FastMCP(port8001) mcp.tool() async def get_weather(location: str) - str: Get weather for a location. url http://weather.cma.cn/api/autocomplete?q urllib.parse.quote(location) async with httpx.AsyncClient() as client: try: response await client.get(url, timeout10.0) response.raise_for_status() data response.json() if data[code] ! 0: return 系统错误请稍后重试 location_code for item in data[data]: str_array item.split(|) if ( str_array[1] location or str_array[1] 市 location or str_array[2] location ): location_code str_array[0] break if location_code : return 没找到该位置的信息 url fhttp://weather.cma.cn/api/now/{location_code} response await client.get(url, timeout10.0) response.raise_for_status() return response.json() except Exception: return 系统错误请稍后重试 if __name__ __main__: mcp.run(transportsse)两个 Server 分别用uv run main.py启动看到监听 8000 和 8001 的日志就说明起来了。接下来是 Dify 侧。先在插件市场搜 mcp安装 “MCP SSE / StreamableHTTP” 插件。然后切到插件 tab点“去授权”把下面这段 JSON 填进去{ wechat_server: { url: http://host.docker.internal:8000/sse, headers: {}, timeout: 50, sse_read_timeout: 50 }, weather_searver: { url: http://host.docker.internal:8001/sse, headers: {}, timeout: 50, sse_read_timeout: 50 } }注意weather_searver这个拼写我故意保留了原文的写法你在自己配置时建议改成weather_server避免后面引用时拼错。host.docker.internal是 Docker 容器访问宿主机的固定域名如果你 Dify 不是 Docker 部署换成127.0.0.1即可。然后创建空白应用类型选 Agent。在工具里添加 MCP 工具系统提示词写你是一个超级助理可以通过调用 MCP 工具完成各种任务。为了获得 MCP 工具列表必须先通过 mcp_sse_list_tools 获取。模型选 qwen-plus 或你在 TaoToken 里配置好的其他模型。这里模型 ID 要填对Base URL 填https://taotoken.net/apiKey 填你的 TaoToken Key。三件套齐了模型才能正常响应。4. 验证请求真发一条天气消息并看日志确认配置完成后在 Dify 的调试预览里输入“把广州的天气情况通过微信发送给张三”。正常情况下你会看到 Agent 的思考过程先调用mcp_sse_list_tools拿到工具列表发现get_weather和send_wechat_msg两个工具然后调用get_weather传参location广州拿到天气 JSON再把结果整理成文本调用send_wechat_msg传参who张三、msg天气内容。验证成功的标志有三个Dify 调试面板显示工具调用链完整无报错微信 PC 端张三的聊天窗口弹出新消息两个 Server 的终端日志分别打印出收到的请求。天气 Server 日志里能看到对weather.cma.cn的两次请求一次 autocomplete、一次 now微信 Server 日志里能看到send_wechat_msg被调用。如果消息没发出去先看微信 Server 终端有没有报错。常见的是wxauto找不到窗口这时候确认微信 PC 版是不是 3.9.x、有没有登录、窗口有没有被最小化到托盘。wxauto需要微信窗口处于可交互状态最小化到托盘有时会失败把微信窗口正常显示在桌面上再试。天气查询返回“没找到该位置的信息”说明 autocomplete 接口没匹配到城市。换一个更标准的城市名比如“广州市”或“北京”接口对简称的支持不稳定。返回“系统错误请稍后重试”则可能是网络超时把timeout从 10 秒调大到 20 秒再试。Dify 侧如果工具列表为空检查 MCP 插件授权里的 URL 是否可达。在 Dify 容器内执行curl http://host.docker.internal:8000/sse看能不能建立连接。连不上就是host.docker.internal没解析或端口没通确认 Docker Desktop 的 “Use the WSL 2 based engine” 相关网络设置或者改用宿主机局域网 IP。5. 常见报错排查401、local proxy failed、reading choices、OAuth401 Unauthorized出现在 Dify 调用模型时说明 TaoToken 的 Key 没填对或过期。检查 Dify 模型配置里的 API Key 是否和 TaoToken 控制台一致Base URL 是否是https://taotoken.net/api。如果 Key 没问题看是不是把 Key 填到了 MCP 插件的 headers 里——MCP 插件不需要模型 Key模型 Key 在模型供应商配置里。local proxy failedDify 日志里出现这个通常是 MCP 插件连接 Server 时网络不通。先确认两个 Server 进程还活着netstat -ano | findstr 8000看端口有没有监听。如果 Server 正常但 Dify 连不上就是host.docker.internal的问题换成宿主机实际 IP 试试。另外检查 Windows 防火墙有没有拦 8000/8001 端口。reading choices 相关报错模型返回格式不符合预期时会出现比如模型没按 OpenAI 格式返回 choices 数组。这多半是模型 ID 填错或者 Base URL 指向了不兼容的端点。确认模型 ID 是 TaoToken 支持的名称不要自己编。如果用的是 qwen-plus确认它在你的 TaoToken 账号下有权限。OAuth 报错MCP 插件授权时如果提示 OAuth 相关错误说明插件尝试走 OAuth 流程但你的 Server 没实现。我们的 Server 是 SSE 直连不需要 OAuth在插件配置里不要勾选 OAuth 相关选项headers 留空即可。如果插件强制要求 OAuth换用支持纯 SSE 的插件版本。工具调用后没反应Agent 调用了工具但微信没收到消息看微信 Server 日志有没有send_wechat_msg的记录。有记录但没发出去是wxauto的问题没记录是 Dify 没调到这个工具检查系统提示词里有没有要求先mcp_sse_list_tools以及工具是否真的添加到了 Agent。Codex auth.json 相关如果你同时用 Codex 类工具它的auth.json里存的是 OpenAI 凭证和这套 DifyMCP 链路无关不要混用。Dify 侧的凭证在模型供应商配置和 MCP 插件授权里两套体系分开管理。6. 把链路跑通之后模型对话、Coding Plan 与接入文档怎么选链路跑通后你手里其实有了一个可复用的模板任何“查数据发通知”的需求都可以照这个结构拆成两个 MCP ServerDify 侧只改提示词和工具组合。想验证模型本身的表现可以直接在模型对话里试 https://taotoken.net/api 接入后的效果对比不同模型对工具调用的理解能力。如果你要长期做编码类或 Agent 类项目Coding Plan 更适合按量使用不用每次单独配 Key。接入过程中遇到配置问题优先查接入文档里面把 Base URL、Key、Model ID 三件套的填法写得很清楚。MCP 插件授权、Dify 模型配置、Server 启动这三步里任何一步的报错都能在文档里找到对应说明。把这篇里的两个 Server 代码存好下次加新工具时复制一份改改工具函数就行Dify 侧只需要在授权 JSON 里加一个 server 条目。