之前曾經分享過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