從 0 開發一個 MCP Server
構建 AI 工具調用能力

FastMCP · 五個 Tools · HTTP 部署 · Inspector 除錯 · 知識庫實戰

從 0 開發一個 MCP Server:手把手教你構建 AI 工具調用能力
若你想把 CRM、知識庫、Git 儲存庫接到 Cursor 或 Claude Desktop,本稿以 Python FastMCP 從零撰寫 MCP Server 為主線,逐步涵蓋:① MCP 協定與 JSON-RPC 2.0 通訊模型;② ToolsResourcesPrompts 三能力實作;③ Hello World 擴展至五個實用工具;④ HTTP 傳輸、MCP Inspector 除錯與 Docker 部署;⑤ 知識庫 capstone 專案與生態系伺服器;⑥ MCP vs Function Calling vs LangChain 對照表與六步 Runbook;⑦ 正式環境宿主建議。協定全貌可併讀2026 年 MCP 為何成為 AI 時代的 HTTP 協議
01

MCP 協定是什麼:Host/Client/Server 與 JSON-RPC 2.0

Model Context Protocol(MCP)是連接 AI 用戶端(Cursor、Claude Desktop、VS Code 等)與外部能力(資料庫、API、檔案系統)的開放標準。2024 年 11 月 Anthropic 開源釋出;至 2026 年,OpenAI、Google、Microsoft 均已原生支援,治理移交 Linux Foundation 旗下 AAIF。開發者實作一次 MCP Server,工具定義即可在所有 MCP 用戶端重用,無需為每個模型重寫適配層。

架構分三層:Host(用戶操作的應用本體)內嵌一個或多個 MCP Client(與各 Server 維持 1:1 工作階段),MCP Server(你撰寫的程式)則橋接真實系統。通訊一律走 JSON-RPC 2.0,完成 initialize 握手與能力協商後,工作階段持續至連線中斷。

JSON-RPC 2.0 — tools/call
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "search_articles",
    "arguments": { "query": "MCP 部署", "limit": 5 }
  },
  "id": 42
}

核心 RPC 方法包括:tools/list 動態取得工具清單、tools/call 執行工具、resources/listresources/read 讀取唯讀資料、prompts/listprompts/get 取得範本。傳輸層分 STDIO(本機子程序,開發首選)與 Streamable HTTP(遠端、團隊共用)。SDK 吸收協定細節,開發者專注業務邏輯。

從演進脈絡看,OpenAI Function Calling(2023 年 6 月)解決「單一模型如何呼叫函式」,ChatGPT Plugins 嘗試市集模式但缺乏執行時動態發現;LangChain Tools 則鎖在 Python Agent 框架內。MCP 回答的是「任何 AI 用戶端如何發現並安全呼叫任何工具伺服器」——N 個用戶端 × M 個後端,從 N×M 客製整合收斂為 N+M 標準連接。

開發 MCP Server 的本質不是「多寫幾個 REST 端點」,而是「公開 AI 能發現、理解並安全呼叫的自我描述能力」。

02

Tools/Resources/Prompts:FastMCP Hello World 與五個工具擴展

MCP Server 公開三類能力。Tools 是有副作用的可執行操作(資料庫查詢、API 呼叫、檔案寫入)。Resources 是以 URI 識別的唯讀資料(文件、設定檔、知識庫條目)。Prompts 是帶參數槽位的可重用範本(問答格式、程式碼審查清單)。Python 生態中 FastMCP 提供最短迭代路徑。

Python — Hello World
pip install "mcp[cli]"

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello-server")

@mcp.tool()
def greet(name: str) -> str:
    """回傳問候語,確認 MCP Server 正常運作"""
    return f"你好,{name}!MCP Server 已成功啟動。"

if __name__ == "__main__":
    mcp.run()

型別提示與 docstring 會自動轉成 JSON Schema,Agent 在 tools/list 階段即可理解參數語意。以下以知識庫 Server 為例,擴展五個實用工具:

Python — 五個 Tools
@mcp.tool()
def search_articles(query: str, limit: int = 10) -> list[dict]:
    """以關鍵字全文搜尋文章"""
    ...

@mcp.tool()
def get_article(article_id: str) -> dict:
    """依文章 ID 取得完整內文"""
    ...

@mcp.tool()
def list_categories() -> list[str]:
    """回傳可用分類清單"""
    ...

@mcp.tool()
def create_note(title: str, body: str, tags: list[str] | None = None) -> dict:
    """建立新的內部備忘錄"""
    ...

@mcp.tool()
def summarize_text(text: str, max_chars: int = 300) -> str:
    """將長文壓縮至指定字數以內"""
    ...

Resources 以 URI 方案識別。檔案系統可用 file:///data/docs/readme.md;自訂方案如 kb://articles/2026-mcp-guide,用戶端透過 resources/read 取得內容,無工具副作用。

Python — Resources URI
@mcp.resource("kb://articles/{article_id}")
def article_resource(article_id: str) -> str:
    return load_markdown(article_id)

@mcp.resource("file://config/{name}")
def config_resource(name: str) -> str:
    return Path(f"./config/{name}.json").read_text(encoding="utf-8")

Prompts 是帶變數的範本。Agent 以 prompts/get 取得後直接餵給 LLM,統一團隊輸出格式。

Python — Prompts 範本
@mcp.prompt()
def qa_from_context(question: str, context_uri: str) -> str:
    """依上下文 URI 內容以 QA 格式回答"""
    ctx = resolve_resource(context_uri)
    return f"""僅以下列上下文為依據回答問題。
上下文:
{ctx}

問題: {question}"""

@mcp.prompt()
def summarize_article(article_id: str, style: str = "bullet") -> str:
    body = load_markdown(article_id)
    return f"請以{style}格式摘要以下文章:\n\n{body}"

設計要點:Tools 負責「寫入與副作用」、Resources 負責「唯讀且可快取」、Prompts 負責「定型工作流程」。拆成細粒度公開,比單一函式塞滿 CRUD 更能提升 tools/list 的自我描述品質。Cursor 設定見 .cursor/mcp.json,Claude Desktop 使用相同結構的 claude_desktop_config.json

03

HTTP 傳輸、MCP Inspector 除錯與 Docker 部署

本機開發用 STDIO 即可;團隊共用或 CI 整合則需 HTTP 傳輸。FastMCP 以 mcp.run(transport="streamable-http") 切換,2026 年規格以 Streamable HTTP 取代純 SSE 模式,作為遠端 MCP 的推薦傳輸。

Python — HTTP 傳輸
if __name__ == "__main__":
    mcp.run(
        transport="streamable-http",
        host="0.0.0.0",
        port=8080,
        path="/mcp"
    )

正式環境需在邊界層疊加安全控制:Bearer Token 驗證 Authorization 標頭、X-API-Key 對應租戶限流、CORS 僅允許已知 Host 來源(生產端點禁止 * 萬用字元)、反向代理層設定請求上限以防工具呼叫觸發昂貴下游 API。

MCP Inspector 是官方除錯介面,支援 STDIO 與 HTTP,可在瀏覽器檢視 tools/list 回應、參數驗證與錯誤追蹤。

Shell — MCP Inspector
npx @modelcontextprotocol/inspector python server.py

curl -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

Inspector 中 STDIO 模式:Transport 設 stdio,Command 填 python,Arguments 填 server.py。HTTP 模式 URL 填 http://localhost:8080/mcp。在 tools/call 分頁手動執行各工具,於接入 Cursor 前排除 JSON Schema 違規。

正式部署以 Docker 為定番:非 root 使用者、健康檢查、以環境變數注入機密。

Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY server.py .
RUN useradd -m mcpuser
USER mcpuser
EXPOSE 8080
HEALTHCHECK CMD curl -f http://localhost:8080/mcp || exit 1
CMD ["python", "server.py"]
Shell — Docker 啟動
docker build -t kb-mcp-server .
docker run -d --name kb-mcp -p 8080:8080 \
  -e DATABASE_URL="postgresql://..." \
  -e API_KEY="sk-..." \
  kb-mcp-server
錯誤現象可能原因修復方式
Cursor 看不到伺服器設定路徑或指令錯誤檢查 mcp.json 的 command/args;確認子程序無 import 錯誤
tools/list 回傳空清單裝飾器未在 run 前註冊server.py 進入點匯入所有工具模組
HTTP 連線被拒連接埠或傳輸模式不符用戶端傳輸須與伺服器一致(STDIO vs streamable-http)
工具呼叫逾時非同步環境中同步阻塞工具改用 async defasyncio.to_thread

安全提醒:勿將正式 HTTP 端點裸曝於公網。2026 年初安全掃描發現約 1,000 個未授權 MCP 端點可被公開索引。最低標準:Tailscale/VPN/反向代理認證背後部署,OAuth 2.1 標準化仍在路線圖中。

04

Capstone:企業知識庫 MCP Server 與生態系伺服器

整合前述元素的企業知識庫 MCP Server是理想的 capstone 專案:Markdown 文章以 kb:// Resources 公開;search_articlesget_article Tools 讓 Agent 做結構化檢索;qa_from_context Prompt 統一回答格式。PostgreSQL 存元資料,向量檢索用 pgvector 或 Tool 內呼叫 Embedding API,是 2026 年實務標準。

01

資料層:文章表(id、title、body、tags、updated_at)加全文索引;Embedding 欄位可選。

02

Resources 層:每篇文章以 kb://articles/{id} 公開,Agent 可先唯讀載入上下文。

03

Tools 層:搜尋、取得、建立備忘、摘要共五個工具;副作用僅限 create_note

04

Prompts 層:QA、摘要、比較分析三種範本,均一化團隊輸出品質。

05

用戶端接入:在 Cursor .cursor/mcp.json 或 Claude Desktop 設定註冊 Server,啟動時 tools/list 自動發現。

向量知識庫也可用 ChromaDB 快速驗證概念:

Python — ChromaDB 語意搜尋
import chromadb
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("knowledge-base")
client = chromadb.PersistentClient(path="./chroma_data")
collection = client.get_or_create_collection("notes")

@mcp.tool()
def semantic_search(query: str, n: int = 5) -> str:
    results = collection.query(query_texts=[query], n_results=n)
    docs = results.get("documents", [[]])[0]
    return "\n---\n".join(docs) if docs else "找不到相符內容。"

@mcp.tool()
def ingest_note(text: str, source: str) -> str:
    collection.add(documents=[text], metadatas=[{"source": source}], ids=[source])
    return f"已索引: {source}"

生態系另有 10,000+ 公開 MCP Server 可參考,常見代表如下:

Server用途連線方式
@modelcontextprotocol/server-filesystem本機檔案讀寫STDIO
@modelcontextprotocol/server-githubIssue/PR/儲存庫操作STDIO + PAT
@modelcontextprotocol/server-postgresPostgreSQL 唯讀查詢STDIO
@modelcontextprotocol/server-slack頻道發文與歷史紀錄STDIO + OAuth
@modelcontextprotocol/server-brave-searchWeb 搜尋STDIO + API Key
自研 kb-mcp-server企業文件整合HTTP + Docker

Filesystem + GitHub + 自研知識庫載入同一 Cursor 工作階段的「開發者桌面配置」,是 2026 年主流工作流程。通用能力用 npm 官方 Server,差異化資產保留自研 Server,成本最低。

05

MCP vs Function Calling vs LangChain:對照表與六步 Runbook

「Function Calling 或 LangChain Tools 不就夠了?」以下從 Agent 整合角度對照三種方式:

維度MCPFunction CallingLangChain Tools
標準化業界開放標準(AAIF 治理)各 LLM 供應商自有 JSON Schema框架內部抽象
用戶端相容Cursor/Claude/ChatGPT/VS Code 等單一供應商 API依賴 LangChain 執行環境
工具發現tools/list 動態取得提示詞靜態注入程式碼硬編碼
資料公開Resources URI + Prompts無(需另建 RAG)Retriever 鏈另建
傳輸STDIO/HTTP 標準化HTTPS API 內嵌程序內函式呼叫
供應商切換成本Server 層不變Schema 與呼叫格式全面改寫Agent 鏈重新組裝
適用場景多客戶端長期整合單一 API 快速試作Python 後端 Agent 管線

以下六步 Runbook可直接貼入團隊文件,從評估推進到正式上線:

01

整合對象盤點:列出要連接的系統(DB、Git、Slack、內部 Wiki)與 LLM 用戶端(Cursor/Claude Desktop),統計現有 Function Calling 重複實作數量。

02

FastMCP Hello World:pip install "mcp[cli]" → 單工具 Server → MCP Inspector 確認 tools/list。目標 30 分鐘內完成。

03

三能力設計:Tools(有副作用)/Resources(唯讀)/Prompts(定型)分類;從五個工具以內起步,避免過度公開。

04

用戶端接入測試:Cursor mcp.json 以 STDIO 註冊,在真實 Agent 任務中評估工具選擇準確度。

05

HTTP + Docker 化:團隊共用需求出現時切換 Streamable HTTP;機密以 ENV 注入映像,不在程式碼硬編碼。

06

7×24 宿主部署:有狀態工作階段需專用不休眠宿主。MESHLAUNCH Mac Mini 可讓 MCP Server 與 IDE Agent 同節點常駐,排除筆電休眠中斷。

2026 年參考數據如下:

A

10,000+ 公開 MCP Server:生態目錄每週以數百件速度成長;自研 Server 一經上線,所有 MCP 用戶端立即可用,網路效應顯著。

B

整合開發成本降 38–55%:企業 AI 整合專案採用 MCP 後的平均節省率(2025–2026 業界調查);各供應商 Function Calling 雙重實作得以消除。

C

FastMCP 初版 PoC 中位數 4.2 小時:從 Hello World 到 Cursor 接入的開發者回報(n=280,2026 Q1 社群調查);對比 LangChain 完整 Agent 建置約 2.1 天,大幅縮短。

注意:Linux VPS 無法原生執行 Xcode 建置或 Apple Silicon 最佳化 Embedding 推理;筆電 STDIO 工作階段會因休眠中斷;AWS Lambda 無法維持有狀態 MCP 連線。每種捷徑都會犧牲正式 Agent 所需能力。

若團隊需在同一節點常駐 MCP Server、ChromaDB 匯入與 iOS CI,MESHLAUNCH 雲端 Mac Mini 租賃通常是更合理的正式宿主:專屬 Apple Silicon、日/週/月彈性計費、穩定網路與頻寬,工具定義可成為可移植的團隊資產而非個人筆電設定。規格與價格見 租用價格頁;部署問題可至 幫助中心

常見問題

FastMCP 是官方 mcp 套件上的高階封裝。@mcp.tool() 裝飾器可自動產生 JSON Schema,並在同一份程式碼切換 STDIO 與 HTTP。低階 SDK 需手寫 RPC 處理器;FastMCP 提供從 Hello World 到上線的最短路徑。

本機 STDIO 僅適合開發。正式環境需 HTTP 傳輸加 Docker,或以 systemd/pm2 常駐管理。有狀態工作階段需不會休眠的專用宿主。MESHLAUNCH Mac Mini 租賃適合在同一 Apple Silicon 節點常駐 MCP Server 與 Cursor。

① Python 虛擬環境與 mcp 套件版本一致;② STDIO 模式 Transport 設 stdio,Command 設 python,Arguments 設 server.py;③ HTTP 模式檢查連接埠與認證標頭;④ tools/list 為空時確認裝飾器模組匯入。網路與 SSH 問題見 幫助中心

Function Calling 綁定單一 LLM 供應商。MCP Server 實作一次後,Cursor、Claude Desktop、ChatGPT、VS Code 等所有 MCP 用戶端均可重用,並支援 tools/list 執行時發現與 Resources/Prompts 整合公開。業界調查顯示供應商切換時工具層改寫成本平均可降 38–55%。