Dify 自架實戰 · 架構補充

把 Dify app 開成 MCP server:讓別的 AI 當你的工具用

MCP 有兩端:你的 agent 去「呼叫」別人(使用方),以及把你的東西「開放」給別的 AI 呼叫(提供方)。這頁把「提供方」用 UI 做出來的真實架構畫清楚:這版怎麼靠外掛開成 MCP server、為什麼只有 Chat/Workflow 能開(Agent 不行)、跨機器被別的 AI 呼叫的完整閉環,以及它跑的是哪一版 MCP 協定。全部照真實自架 + 跨機器實測(Dify 1.14)整理,範例為虛構訂單 demo。

🗺️ 你當「提供方」:別的 AI → 你的 Dify → 你的系統

flowchart LR
  C(("🤖 別的 AI
Claude / Cursor / 另一台")):::c C ==>|"MCP"| EP["🔌 Dify MCP 端點
/e/…/mcp"]:::ep EP ==> APP["🖥️ 你的 Chatflow app"]:::app APP ==> SYS[("🗄️ 你的系統
RAG · API · DB")]:::sys APP -.->|"可開"| OK["✅ Chat / Workflow"]:::good APP -.->|"開不了"| NO["❌ Agent(不支援 blocking)"]:::bad classDef c fill:#dbeafe,stroke:#2563eb,color:#17335e classDef ep fill:#fee2e2,stroke:#dc2626,color:#7f1d1d classDef app fill:#ede9fe,stroke:#7c3aed,color:#4c1d95 classDef sys fill:#dcfce7,stroke:#16a34a,color:#14532d classDef good fill:#dcfce7,stroke:#16a34a,color:#14532d classDef bad fill:#fdecea,stroke:#c0392b,color:#7f1d1d

別的 AI 當 client,連你的 MCP 端點 → 其實是在跑你的 Dify app → app 背後接你的系統。對它來說,你整個 app 濃縮成一個「問就有答」的工具。

🧩 UI 做法:這版沒原生按鈕 → 裝外掛

實測:這版 Dify 的「發佈」下拉、app「概覽」頁,任何型別都沒有 MCP 發佈開關。官方文件說 v1.6.0+ 有原生功能,但這個 build 沒放進可見位置。UI 正解是裝外掛:

步驟做什麼
1外掛 → 探索 Marketplace → 搜 mcp-server(「make dify's workflow as a MCP server」)→ 安裝
2外掛 → 點該外掛 → 端點(Endpoints)→ 新增端點
3填四格(見下)→ 存 → 得到 /e/<id>/mcp(+ /sse)

⚙️ 端點四欄位 + Input Schema 格式

欄位填什麼
App要對外開放的 app
App Type只有 Chat / Workflow(Agent 不行)
App Input Schema一整個 MCP 工具定義 JSON(name / description / inputSchema),不是只填參數
Auth Bearer Token當密碼(MCP 網址 = API key)
{
  "name": "query_order",
  "description": "查詢訂單狀態,回傳原文",
  "inputSchema": {
    "type": "object",
    "properties": { "query": { "type": "string", "description": "使用者問題" } },
    "required": ["query"]
  }
}

🚫 為什麼 Agent 開不了(只有 Chat / Workflow)

硬選 Agent 會回:Agent Chat App does not support blocking mode。Agent 是多步 ReAct、只能串流回應;而外掛用 blocking(等一個完整答案)呼叫,對不上。結論:想對外開 MCP,就把邏輯做成 Chatflow——它能掛工具、接知識庫、忠實呈現,又支援 blocking。

✅ 跨機器閉環:別的 AI 真的呼叫到

flowchart LR
  A(("🤖 另一台的 AI
MCP client")):::a A ==>|"initialize → tools/list → tools/call"| M["🔌 你的 Dify MCP 端點"]:::m M ==> CF["🖥️ Dify Chatflow
忠實呈現"]:::cf CF ==> S[("🗄️ 你的系統")]:::s S ==>|"真資料 原路回傳"| A classDef a fill:#dbeafe,stroke:#2563eb,color:#17335e classDef m fill:#fee2e2,stroke:#dc2626,color:#7f1d1d classDef cf fill:#ede9fe,stroke:#7c3aed,color:#4c1d95 classDef s fill:#dcfce7,stroke:#16a34a,color:#14532d

顯示 localhost 只是 Dify base URL 沒設;把主機換成公開網域就對外通。實測:另一台機器的 AI 用 MCP client 走完 initialize → tools/list → tools/call,跑起你的 Chatflow、拿到系統真資料。

🏷️ 它跑的是哪一版 MCP 協定?

版本(日期號)定位
2024-11-05🚀 launch 最初版 ← 這台 Dify 談的就是這版(最舊)
2025-03-26加 OAuth 等
2025-06-18結構化輸出 / elicitation
2025-11-25目前正式最新
2026-07-28RC(launch 以來最大改版:stateless 核心)

tools/list / tools/call 向後相容,基本串接照跑;新版功能(結構化輸出、OAuth、stateless)這台還沒有 → 要新特性得等升級,或用跟得較前的 MCP server(n8n / FastMCP)。

資安鐵律:MCP 端點網址內含認證,等於 API key——別放進任何公開內容;真實/敏感資料場景,token 要用強隨機字串、用完把端點停用。
一句話心法:真正的互通,是把你的系統變成「別的 AI 也能呼叫的一塊積木」。在 Dify 裡用外掛就能把 Chatflow 開成 MCP server;做成 Chatflow(不要 Agent)、換公開網域、設好 token、用完關掉。

📚 回課綱總表 →