博客 / 詳情

返回

張高興的大模型開發實戰:(八)在 Dify 中使用 MCP 協議

目錄
  • 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 提供了什麼工具,需要什麼參數,而無需人工再去編寫複雜的接口定義。

1

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 的網頁界面:

  1. 點擊頂部菜單欄的 工具 -> MCP -> 添加 MCP 服務
    2
  2. 在彈出的窗口中填寫配置:
    服務端點 URL:http://host.docker.internal:8000/sse
    名稱:Weather Service
    服務器標識符:weather-service
    3

如果連接成功,列表裏會出現了一個綠色的“已連接”狀態,點擊展開,Dify 已經自動解析出了在 Python 代碼裏定義的 get_weather 函數,甚至連代碼裏寫的註釋都變成了工具的描述。

4

最後,來驗證一下效果。

  1. 創建一個新的 Chatflow 應用 出行小助手
    5
  2. 刪除原有的 LLM 節點,添加一個 Agent 節點。
    6
  3. 設置 AGENT 策略,如果下拉列表為空,可以在插件市場進行下載。
    7
  4. 配置要使用的 模型,並在 工具列表 中新增剛剛添加的 MCP 服務。在 指令 中設置提示詞。查詢 設置為用户輸入。
    8
    # Role
    你是一位專業且貼心的出行規劃專家。你擅長分析實時氣象數據,提供包含穿衣、交通、安全及活動建議在內的全方位出行方案。
    
    # Constraints
    1. 語氣專業、友好且富有親和力。
    2. 必須基於 MCP 工具返回的真實數據進行建議,嚴禁編造天氣數值。
    3. 輸出應條理清晰,多使用列清單,避免大段文字。
    
    # Goals
    4. 數據調用:主動調用獲取天氣的 MCP 工具,獲取用户指定目標的實時天氣。
    5. 多維分析:不僅報告氣温,更要分析該天氣對出行的具體影響。
    6. 精準建議:給出極具參考價值的穿衣指南、交通方式推薦以及針對性提醒(如帶傘、塗防曬霜或調整户外行程)。
    

以上配置完成後,先在右側進行預覽測試。例如“我明天要去北京,查一下天氣和穿衣建議。”觀察結果發現,Dify 成功獲取了北京的天氣,並根據天氣給出了具體的出行建議。

9

Dify 作為 Server:被外部應用調用

有時,當你在 Dify 中配置了一個複雜的工作流(Workflow),想要在外部的 AI 應用中進行調用,這時就需要反轉視角,將 Dify 作為一個 MCP 服務。在開始案例之前,先添加一個“翻譯專家”工作流,作為要被調用的 MCP 服務。

搭建“翻譯專家”工作流

  1. 在 Dify 首頁點擊 創建空白應用,選擇 工作流,命名為 翻譯專家,開始節點選擇 用户輸入
    10
  2. 點擊 用户輸入 節點,添加輸入變量 chinese,即要翻譯的中文。
    11
  3. 添加一個 LLM 節點,並設置提示詞。
    12
    # Role
    你是一位資深的翻譯專家,擅長將中文翻譯為英文。用户的輸入是一段中文,請將其翻譯成最地道、最專業、最簡潔的英文。直接輸出翻譯後的英文,不要包含任何解釋或廢話。
    
    # Input
    {{#1769390459829.chinese#}}
    
  4. 添加一個 輸出 節點,並設置輸出變量 english
    13

啓用 MCP 服務

  1. 進入工作流,點擊左側列表的 設置
    14
  2. 啓用 MCP 服務,並添加描述。
    15
  3. 複製 服務端點 URL 留存備用。

在外部 AI 應用中調用

拿到了 URL 後,在任意支持 MCP 調用的應用中都可以使用剛剛配置好的工作流,這裏以 Visual Studio Code 為例。

  1. 點擊聊天框中的 配置工具 按鈕,在彈出的頂部菜單中點擊 添加 MCP 服務器
    16
  2. 選擇 HTTP,輸入剛剛複製的 URL,並設置唯一的 服務器 ID
    17
  3. 配置完成後,可以看到 Visual Studio Code 輸出的日誌,提示已經連接到 MCP 服務。
    18
  4. 配置工具 列表中,只勾選剛剛添加的 MCP 服務,用於測試。
    19
  5. 嘗試進行對話,Dify 中配置的“翻譯專家”被成功調用。
    20

AI 的未來,不在於擁有一個多麼巨大的單一模型,而在於協作,MCP 正在迅速成為這種協作的標準語言。這篇博客通過兩個簡單的案例,介紹了 MCP 在 Dify 中的用法,後續不妨嘗試一些更有趣的玩法:

  • 連接物理世界:寫一個 MCP Server 控制家裏的智能家居(Home Assistant)。想象一下,在 Dify 的對話框裏輸入“我得睡覺了”,AI 自動幫你關燈、拉窗簾、定鬧鐘。
  • 連接私有數據:使用 mcp-server-sqlitemcp-server-postgres,讓 Dify 直接擁有查詢你本地業務數據庫的能力,生成報表。
  • 打造個人超級助理:在 Dify 裏編排好你專屬的“週報生成器”、“代碼審查器”,然後在 VS Code 裏隨時呼叫它們,讓 AI 真正融入你的工作流。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.