AI & ML DevOps Python

搞懂 MCP:AI 與外部世界的橋樑

搞懂 MCP:AI 與外部世界的橋樑

之前曾經分享過MCP(Model Context Protocol),一套標準的對話協議。它讓 AI 模型(LLM)能用同樣的方式,跟外部的各種工具和數據源講話。以前,如果要讓 AI 接 Google Drive,你得寫一套接 Google Drive 的程式;要接 Notion,又得寫另一套。現在有了 MCP,只要大家都遵守這套 protocol,AI 就可以很輕鬆地接上各種東西。

這篇文章我們不講太複雜的理論,直接切入重點,讓你快速了解 MCP 是怎麼運作的,而且還會教你怎麼動手做一個!

核心架構:Host vs. Client vs. Server

要搞懂 MCP,首先要分清楚它裡面的三個核心角色:Host、Client 和 Server。

1. Host (主體應用程式)

Host 是誰?

簡單來說,Host 就是你直接跟它對話的那個應用程式。它是 AI 的「介面」。

它是做什麼的?

Host 負責顯示 AI 的回覆、接收你的輸入。最重要的是,它負責決定「什麼時候」需要叫外部工具來幫忙,並把這個指令交給內部的 Client。

例子:

  • Claude Desktop
  • Cursor (知名的 AI IDE)
  • VS Code (搭配 Copilot)
  • 你自己寫的 Python 腳本(如果它能跑 LLM 並呼叫工具)

2. Client (客戶端實例)

Client 是誰?

Client 是內嵌在 Host 內部的一個模組。你可以把它想成是 Host 裡面的「通訊官」。

它是做什麼的?

Client 負責「握手」和「傳話」。當 Host 需要用到某個工具(比如:讀取 Google Drive 檔案),Client 就會負責連線到對應的 MCP Server,把指令傳過去,並且把 Server 的回覆傳回給 Host。Host 可以同時開啟好幾個 Client 去連不同的 Server。

3. Server (伺服器)

Server 是誰?

Server 是真正提供工具或數據的人。它就像是 AI 的「工具箱」或「圖書館」。

它是做什麼的?

Server 裡面會定義好幾種功能(MCP 的標準說法是 Resources、Prompts 和 Tools)。當它收到 Client 的指令,它就會去執行對應的動作(例如:去抓 Google Drive 的檔案、跑一塊 Python 程式碼、搜尋網路),然後把結果回傳。

例子:

  • Hugging Face MCP Server (搜尋模型、論文)
  • Google Drive MCP Server (存取檔案)
  • Jupyter MCP Server (讓 AI 可以在你的 Jupyter 環境跑 code)
  • 你自己用 FastMCP 寫的客製化 Server

通道比一比:STDIO vs. SSE

Host 內部的 Client 要怎麼跟 Server 講話呢?這就需要用到傳輸通道 (Transport)。目前最常用的兩種標準通道分別是 STDIO 和 SSE,它們的適用場景完全不同。

1. STDIO (Standard Input/Output)

這是最直觀、也最常規的連線方式,通常用於**「 Host 和 Server 都在同一個電腦上跑」**的場景。

  • 怎麼做到的?

Host(比如 Claude Desktop)會啟動 Server 的執行檔(或 Docker 容器)作為一個子程序 (Subprocess)。Host 透過它的標準輸入 (stdin) 把 JSON 指令傳過去,並從 Server 的標準輸出 (stdout) 讀取回應。
* 優點:

  • 無須網路設定:不需要 IP、不需要 Port,連線超簡單。
  • 效能極佳:本地行程溝通,延遲幾乎可以忽略。
  • 生命週期同步:Host 一關閉,Server 進程也會跟著自動關閉,不會有残留的進程。
  • 缺點:

  • 只能連線到自己電腦上的 Server。

2. SSE (Server-Sent Events)

如果你想連線到遠端的 Server(例如架在雲端或 NAS 上的 Server),就要用到 SSE。

  • 怎麼做到的?

這是基於 HTTP 的標準 Web 技術。Client (Host) 會先跟 Server 握手,然後 Server 會開啟一個持久的 HTTP 串流(stream)。Server 可以透過這個串流,主動把更新的數據或結果推送到 Client。
* 優點:

  • 支援遠端連線:Server 可以架在任何有網路的地方。
  • 多人連線:一個 Server 可以同時服務很多個 Client。
  • 缺點:

  • 設定複雜,要處理網路、防火牆、Port 轉發和安全認證 (Auth)。

快速對比

實戰演練

講這麼多,不如直接動手做。下面提供兩個簡單的實作範例。

1. FastMCP:自建並 Docker 化 MCP Server

這是一個使用 Python 的 FastMCP 庫建立客製化 Server 的範例,並且把它包裝成 Docker。我們利用了 Docker 的 -i (interactive) 參數,讓這個容器內的 Server 可以透過 STDIO 跟 Host 溝通。

步驟 A:寫一個簡單的 my_server.py

from fastmcp import FastMCP

# 建立一個 FastMCP 實例
mcp = FastMCP("My Cool Server")

# 定義一個簡單的工具:加法
@mcp.tool()
async def add_numbers(a: int, b: int) -> int:
    """Add two numbers together."""
    return a + b

if __name__ == "__main__":
    # 以 stdio 模式啟動 Server
    mcp.run(transport="stdio")

步驟 B:寫一個 Dockerfile

FROM python:3.11-slim

# 設定工作目錄
WORKDIR /app

# 安裝 FastMCP 庫
RUN pip install --no-cache-dir fastmcp

# 將程式碼複製進容器
COPY my_server.py .

# 預設啟動指令
ENTRYPOINT ["python", "my_server.py"]

步驟 C:建構並啟動容器 (Host 端)

在你的 Host 端(終端機)裡,建構 Docker 映像檔:

docker build -t my-mcp-server .

最後,在你的 MCP 配置文件(例如 claude_desktop_config.json)中設定:

"mcpServers": {
  "my-docker-server": {
    "command": "docker",
    "args": ["run", "-i", "--rm", "my-mcp-server:latest"]
  }
}

這時候,Claude 就會幫你啟動這個容器,並透過 stdio 連接它。

2. Jupyter STDIO:讓 AI 控制你的本地 Jupyter 環境

如果你希望像 Claude Desktop 這樣的 Host 能直接操作你電腦上的 Jupyter 進行數據分析,你可以使用 jupyter-mcp-server

步驟 A:安裝套件

在終端機執行:

# 如果你安裝在 Python 環境
pip install jupyter-mcp-server

# 或者,如果你有 uv,可以直接執行
uvx --install jupyter-mcp-server

步驟 B:在 Host 設定檔中設定 (使用 STDIO)

直接在你的 MCP 配置文件(例如 claude_desktop_config.json)中設定:

"mcpServers": {
  "my-jupyter": {
    "command": "jupyter-mcp-server",
    "args": []
  }
}

搞懂了 Host、Client、Server 和通道的差異,你現在應該對 MCP 的運作有更清楚的認識了。不論是直接使用現成的 Server,還是動手自建,MCP 都為 AI 代理的發展開啟了無限可能。快去試試看吧!

Comments

Loading comments…

Leave a Comment