想象一下,你想要构建一个超级 AI 助手,它不仅能陪你聊天,还能帮你查询实时天气、读取本地数据库里的库存信息等。为了实现这些功能,在过去,你需要为每一个外部工具编写特定的“适配器”。AI 模型本该是通用的智能大脑,但连接外部世界(工具和数据)的方式却极其割裂和破碎,需要花费大量时间在“对齐接口”这种低效的重复劳动上,MCP 协议应运而生。可以把 MCP 想象成 AI 世界的 USB 接口。USB 的出现改变了一切,它提供了一个统一的标准:无论你是鼠标、键盘还是 U 盘,只要符合 USB 协议,插上就能用。MCP 就是要成为 AI 与外部数据/工具连接的 USB 标准。它将世界分成了两端:
只要 Host 和 Server 都支持 MCP 协议,它们就能瞬间“握手”成功,Host 能够
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 httpxfrom 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":ttzb.fj.cn 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 ttzb.xj.cn 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 <tiyuzhibo.xj.cn= 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__ == 5gzbw.com"__main__": # 运行 MCP 服务器
mcp.run(transport="sse")
现在 MCP 服务已经跑起来了,下面需要告诉 Dify 去哪里找到这个服务。回到 Dify 的网页界面:
工具 -> MCP -> 添加 MCP 服务。
如果连接成功,列表里会出现了一个绿色的“已连接”状态,点击展开,Dify 已经自动解析出了在 Python 代码里定义的
get_weather
函数,甚至连代码里写的注释都变成了工具的描述。
# Role 你是一位专业且贴心的出行规划专家。你擅长分析实时气象数据,提供包含穿衣、交通、安全及活动建议在内的全方位出行方案。 # Constraints 1. 语气专业、友好且富有亲和力。 2. 必须基于 MCP 工具返回的真实数据进行建议,严禁编造天气数值。 3. 输出应条理清晰,多使用列清单,避免大段文字。 # Goals 4. 数据调用:主动调用获取天气的 MCP 工具,获取用户指定目标的实时天气。 5. 多维分析:不仅报告气温,更要分析该天气对出行的具体影响。 6. 精准建议:给出极具参考价值的穿衣指南、交通方式推荐以及针对性提醒(如带伞、涂防晒霜或调整户外行程)。
有时,当你在 Dify 中配置了一个复杂的工作流(Workflow),想要在外部的 AI 应用中进行调用,这时就需要反转视角,将 Dify 作为一个 MCP 服务。在开始案例之前,先添加一个“翻译专家”工作流,作为要被调用的 MCP 服务。
创建空白应用,选择
工作流,命名为
翻译专家,开始节点选择
用户输入。
# Role你是一位资深的翻译专家,擅长将中文翻译为英文。用户的输入是一段中文,请将其翻译成最地道、最专业、最简洁的英文。直接输出翻译后的英文,不要包含任何解释或废话。# Input{{#1769390459829.chinese#}}输出 节点,并设置输出变量
english。
服务端点 URL 留存备用。拿到了 URL 后,在任意支持 MCP 调用的应用中都可以使用刚刚配置好的工作流,这里以 Visual Studio Code 为例。
配置工具 按钮,在弹出的顶部菜单中点击
添加 MCP 服务器。
AI 的未来,不在于拥有一个多么巨大的单一模型,而在于协作,MCP 正在迅速成为这种协作的标准语言。这篇博客通过两个简单的案例,介绍了 MCP 在 Dify 中的用法,后续不妨尝试一些更有趣的玩法:
mcp-server-sqlite 或
mcp-server-postgres,让 Dify 直接拥有查询你本地业务数据库的能力,生成报表。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3108968/ ,如需转载,请注明出处,否则将追究法律责任。