目录
- [MCP 是什么](#MCP 是什么)
- [Dify 作为 Client:调用外部 MCP 工具](#Dify 作为 Client:调用外部 MCP 工具)
- [搭建 MCP 天气服务端](#搭建 MCP 天气服务端)
- [在 Dify 中接入"天气感知"能力](#在 Dify 中接入“天气感知”能力)
- [Dify 作为 Server:被外部应用调用](#Dify 作为 Server:被外部应用调用)
- 搭建"翻译专家"工作流
- [启用 MCP 服务](#启用 MCP 服务)
- [在外部 AI 应用中调用](#在外部 AI 应用中调用)
在之前的博客中已经介绍了 MCP 的概念,以及在 LangChain 中如何使用 MCP 协议。今天这篇博客,将带大家实战如何在 Dify 中实现 MCP 场景。在开始正式的内容前,还是先简单的介绍一下 MCP。
MCP 是什么
想象一下,你想要构建一个超级 AI 助手,它不仅能陪你聊天,还能帮你查询实时天气、读取本地数据库里的库存信息等。为了实现这些功能,在过去,你需要为每一个外部工具编写特定的"适配器"。AI 模型本该是通用的智能大脑,但连接外部世界(工具和数据)的方式却极其割裂和破碎,需要花费大量时间在"对齐接口"这种低效的重复劳动上,MCP 协议应运而生。可以把 MCP 想象成 AI 世界的 USB 接口。USB 的出现改变了一切,它提供了一个统一的标准:无论你是鼠标、键盘还是 U 盘,只要符合 USB 协议,插上就能用。MCP 就是要成为 AI 与外部数据/工具连接的 USB 标准。它将世界分成了两端:
- Host (主机端):需要使用工具的 AI 应用,比如 Claude Desktop 客户端、Dify。
- Server (服务端):提供特定能力的工具,比如一个能查天气的 Python 脚本,或者一个连接 MySQL 数据库的服务。
只要 Host 和 Server 都支持 MCP 协议,它们就能瞬间"握手"成功,Host 能够自动理解 Server 提供了什么工具,需要什么参数,而无需人工再去编写复杂的接口定义。

Dify 在 MCP 的生态中,它既可以是"插U盘的主机",也可以是"被别人插的U盘"。
- Dify 作为 Client (主机端):调用外部能力。
- Dify 作为 Server (服务端):暴露自身能力。 这可能是更有趣的一点,比如在 Dify 里精心编排了一个复杂的工作流,这个工作流本身可以被封装成一个标准的 MCP 工具。这意味着,在其他 AI 应用中,可以直接调用在 Dify 里搭建好的这个强大的 Agent。
Dify 作为 Client:调用外部 MCP 工具
在这一部分,想让 Dify 的 AI 助手拥有"感知"当下天气的能力,而不是在那胡诌过去的训练数据。即将 Dify 作为一个"主机",让它去连接一个 MCP Server。
搭建 MCP 天气服务端
首先,需要一个能够"说" MCP 协议的服务端。这里用到了 Python 的 mcp 库。
shell
pip install mcp httpx
创建一个 Python 文件 weather_server.py 实现天气查询的 MCP 服务,不需要手写复杂的协议握手代码,只需要用几个简单的装饰器即可。使用免费的 Open-Meteo API 进行天气查询。
python
import httpx
from mcp.server.fastmcp import FastMCP
# 初始化 FastMCP 服务器
mcp = FastMCP("Weather Service", host="0.0.0.0", port=8000)
async def _get_lat_long(city_name: str):
"""
内部辅助函数:使用 Open-Meteo Geocoding API 将城市名称转换为经纬度。
"""
url = "https://geocoding-api.open-meteo.com/v1/search"
params = {"name": city_name, "count": 1, "language": "zh", "format": "json"}
async with httpx.AsyncClient() as client:
response = await client.get(url, params=params)
data = response.json()
if not data.get("results"):
return None
location = data["results"][0]
return {
"name": location["name"],
"latitude": location["latitude"],
"longitude": location["longitude"],
"timezone": location.get("timezone", "UTC")
}
@mcp.tool()
async def get_weather(city_name: str) -> str:
"""
获取指定城市的当前天气情况。
输入城市名称(如 'Beijing', 'San Francisco', '上海'),返回温度、风速等信息。
"""
# 1. 首先获取经纬度
location = await _get_lat_long(city_name)
if not location:
return f"错误:未找到城市 '{city_name}'。请尝试使用更具体的名称或英文名称。"
# 2. 构建 Open-Meteo API 请求
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": location["latitude"],
"longitude": location["longitude"],
"current": ["temperature_2m", "relative_humidity_2m", "apparent_temperature", "weather_code", "wind_speed_10m"],
"timezone": location["timezone"]
}
async with httpx.AsyncClient() as client:
response = await client.get(url, params=params)
weather_data = response.json()
# 3. 解析并返回数据
current = weather_data.get("current", {})
units = weather_data.get("current_units", {})
# 将天气代码 (WMO Code) 转换为文字描述 (简化版)
weather_code = current.get("weather_code")
weather_desc = "未知"
if weather_code == 0: weather_desc = "晴朗"
elif weather_code in [1, 2, 3]: weather_desc = "多云/阴"
elif weather_code in [45, 48]: weather_desc = "有雾"
elif 51 <= weather_code <= 67: weather_desc = "有雨"
elif 71 <= weather_code <= 77: weather_desc = "有雪"
elif weather_code >= 80: weather_desc = "雷雨/阵雨"
return (
f"--- {location['name']} 天气报告 ---\n"
f"天气状况: {weather_desc}\n"
f"当前温度: {current.get('temperature_2m')} {units.get('temperature_2m')}\n"
f"体感温度: {current.get('apparent_temperature')} {units.get('apparent_temperature')}\n"
f"相对湿度: {current.get('relative_humidity_2m')} {units.get('relative_humidity_2m')}\n"
f"风速: {current.get('wind_speed_10m')} {units.get('wind_speed_10m')}"
)
if __name__ == "__main__":
# 运行 MCP 服务器
mcp.run(transport="sse")
在 Dify 中接入"天气感知"能力
现在 MCP 服务已经跑起来了,下面需要告诉 Dify 去哪里找到这个服务。回到 Dify 的网页界面:
- 点击顶部菜单栏的
工具 -> MCP -> 添加 MCP 服务。

- 在弹出的窗口中填写配置:
服务端点 URL:http://host.docker.internal:8000/sse
名称:Weather Service
服务器标识符:weather-service

如果连接成功,列表里会出现了一个绿色的"已连接"状态,点击展开,Dify 已经自动解析出了在 Python 代码里定义的 get_weather 函数,甚至连代码里写的注释都变成了工具的描述。

最后,来验证一下效果。
-
创建一个新的 Chatflow 应用
出行小助手。

-
删除原有的
LLM节点,添加一个Agent节点。

-
设置
AGENT 策略,如果下拉列表为空,可以在插件市场进行下载。

-
配置要使用的
模型,并在工具列表中新增刚刚添加的 MCP 服务。在指令中设置提示词。查询设置为用户输入。
markdown# Role 你是一位专业且贴心的出行规划专家。你擅长分析实时气象数据,提供包含穿衣、交通、安全及活动建议在内的全方位出行方案。 # Constraints 1. 语气专业、友好且富有亲和力。 2. 必须基于 MCP 工具返回的真实数据进行建议,严禁编造天气数值。 3. 输出应条理清晰,多使用列清单,避免大段文字。 # Goals 4. 数据调用:主动调用获取天气的 MCP 工具,获取用户指定目标的实时天气。 5. 多维分析:不仅报告气温,更要分析该天气对出行的具体影响。 6. 精准建议:给出极具参考价值的穿衣指南、交通方式推荐以及针对性提醒(如带伞、涂防晒霜或调整户外行程)。
以上配置完成后,先在右侧进行预览测试。例如"我明天要去北京,查一下天气和穿衣建议。"观察结果发现,Dify 成功获取了北京的天气,并根据天气给出了具体的出行建议。

Dify 作为 Server:被外部应用调用
有时,当你在 Dify 中配置了一个复杂的工作流(Workflow),想要在外部的 AI 应用中进行调用,这时就需要反转视角,将 Dify 作为一个 MCP 服务。在开始案例之前,先添加一个"翻译专家"工作流,作为要被调用的 MCP 服务。
搭建"翻译专家"工作流
-
在 Dify 首页点击
创建空白应用,选择工作流,命名为翻译专家,开始节点选择用户输入。

-
点击
用户输入节点,添加输入变量chinese,即要翻译的中文。

-
添加一个
LLM节点,并设置提示词。
markdown# Role 你是一位资深的翻译专家,擅长将中文翻译为英文。用户的输入是一段中文,请将其翻译成最地道、最专业、最简洁的英文。直接输出翻译后的英文,不要包含任何解释或废话。 # Input {{#1769390459829.chinese#}} -
添加一个
输出节点,并设置输出变量english。

启用 MCP 服务
- 进入工作流,点击左侧列表的
设置。

- 启用 MCP 服务,并添加描述。

- 复制
服务端点 URL留存备用。
在外部 AI 应用中调用
拿到了 URL 后,在任意支持 MCP 调用的应用中都可以使用刚刚配置好的工作流,这里以 Visual Studio Code 为例。
- 点击聊天框中的
配置工具按钮,在弹出的顶部菜单中点击添加 MCP 服务器。

- 选择
HTTP,输入刚刚复制的 URL,并设置唯一的服务器 ID。

- 配置完成后,可以看到 Visual Studio Code 输出的日志,提示已经连接到 MCP 服务。

- 在
配置工具列表中,只勾选刚刚添加的 MCP 服务,用于测试。

- 尝试进行对话,Dify 中配置的"翻译专家"被成功调用。

AI 的未来,不在于拥有一个多么巨大的单一模型,而在于协作,MCP 正在迅速成为这种协作的标准语言。这篇博客通过两个简单的案例,介绍了 MCP 在 Dify 中的用法,后续不妨尝试一些更有趣的玩法:
- 连接物理世界:写一个 MCP Server 控制家里的智能家居(Home Assistant)。想象一下,在 Dify 的对话框里输入"我得睡觉了",AI 自动帮你关灯、拉窗帘、定闹钟。
- 连接私有数据:使用
mcp-server-sqlite或mcp-server-postgres,让 Dify 直接拥有查询你本地业务数据库的能力,生成报表。 - 打造个人超级助理:在 Dify 里编排好你专属的"周报生成器"、"代码审查器",然后在 VS Code 里随时呼叫它们,让 AI 真正融入你的工作流。