- MCP 是什麼
- Dify 作為 Client:調用外部 MCP 工具
- 搭建 MCP 天氣服務端
- 在 Dify 中接入“天氣感知”能力
- Dify 作為 Server:被外部應用調用
- 搭建“翻譯專家”工作流
- 啓用 MCP 服務
- 在外部 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 庫。
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)
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 服務。在指令中設置提示詞。查詢設置為用户輸入。
# Role 你是一位專業且貼心的出行規劃專家。你擅長分析實時氣象數據,提供包含穿衣、交通、安全及活動建議在內的全方位出行方案。 # Constraints 1. 語氣專業、友好且富有親和力。 2. 必須基於 MCP 工具返回的真實數據進行建議,嚴禁編造天氣數值。 3. 輸出應條理清晰,多使用列清單,避免大段文字。 # Goals 4. 數據調用:主動調用獲取天氣的 MCP 工具,獲取用户指定目標的實時天氣。 5. 多維分析:不僅報告氣温,更要分析該天氣對出行的具體影響。 6. 精準建議:給出極具參考價值的穿衣指南、交通方式推薦以及針對性提醒(如帶傘、塗防曬霜或調整户外行程)。
以上配置完成後,先在右側進行預覽測試。例如“我明天要去北京,查一下天氣和穿衣建議。”觀察結果發現,Dify 成功獲取了北京的天氣,並根據天氣給出了具體的出行建議。
Dify 作為 Server:被外部應用調用
有時,當你在 Dify 中配置了一個複雜的工作流(Workflow),想要在外部的 AI 應用中進行調用,這時就需要反轉視角,將 Dify 作為一個 MCP 服務。在開始案例之前,先添加一個“翻譯專家”工作流,作為要被調用的 MCP 服務。
搭建“翻譯專家”工作流
- 在 Dify 首頁點擊
創建空白應用,選擇工作流,命名為翻譯專家,開始節點選擇用户輸入。
- 點擊
用户輸入節點,添加輸入變量chinese,即要翻譯的中文。
- 添加一個
LLM節點,並設置提示詞。
# 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 真正融入你的工作流。