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

Dify 在 MCP 的生态中,它既可以是“插U盘的主机”,也可以是“被别人插的U盘”。
在这一部分,想让 Dify 的 AI 助手拥有“感知”当下天气的能力,而不是在那胡诌过去的训练数据。即将 Dify 作为一个“主机”,让它去连接一个 MCP Server。
首先,需要一个能够“说” MCP 协议的服务端。这里用到了 Python 的 mcp 库。
pip install mcp httpx
创建一个 Python 文件 weather_server.py 实现天气查询的 MCP 服务,不需要手写复杂的协议握手代码,只需要用几个简单的装饰器即可。使用免费的 Open-Meteo API 进行天气查询。
import httpx
from mcp.server.fastmcp import FastMCP
# 初始化 FastMCP 服务器
mcp = FastMCP("Weather Service", host="0.0.0.0", port=8000)
asyncdef _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"}
asyncwith httpx.AsyncClient() as client:
response = await client.get(url, params=params)
data = response.json()
ifnot data.get("results"):
returnNone
location = data["results"][0]
return {
"name": location["name"],
"latitude": location["latitude"],
"longitude": location["longitude"],
"timezone": location.get("timezone", "UTC")
}
@mcp.tool()
asyncdef get_weather(city_name: str) -> str:
"""
获取指定城市的当前天气情况。
输入城市名称(如 'Beijing', 'San Francisco', '上海'),返回温度、风速等信息。
"""
# 1. 首先获取经纬度
location = await _get_lat_long(city_name)
ifnot location:
returnf"错误:未找到城市 '{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"]
}
asyncwith 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 = "有雾"
elif51 <= weather_code <= 67: weather_desc = "有雨"
elif71 <= 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")
现在 MCP 服务已经跑起来了,下面需要告诉 Dify 去哪里找到这个服务。回到 Dify 的网页界面:
工具 -> MCP -> 添加 MCP 服务。


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

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

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

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

配置要使用的 模型,并在 工具列表 中新增刚刚添加的 MCP 服务。在 指令 中设置提示词。查询 设置为用户输入。

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

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

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

添加一个 LLM 节点,并设置提示词。

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

设置。


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

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


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


AI 的未来,不在于拥有一个多么巨大的单一模型,而在于协作,MCP 正在迅速成为这种协作的标准语言。这篇博客通过两个简单的案例,介绍了 MCP 在 Dify 中的用法,后续不妨尝试一些更有趣的玩法:
mcp-server-sqlite 或 mcp-server-postgres,让 Dify 直接拥有查询你本地业务数据库的能力,生成报表。