協定原理 · Tools / Resources / Prompts · 除錯部署 · 個人知識庫實戰
具備一定 Python 或 TypeScript 基礎的後端 / AI 開發者常遇到同一困境:Claude、GPT 再聰明,也無法直接查你的資料庫、呼叫內部 API、讀寫本機檔案——因為模型缺乏存取外部工具的標準化通道。Model Context Protocol(MCP)正是 Anthropic 開源的開放協定,讓 AI Client(Cursor、Claude Desktop)與你自己寫的 Server 透過 JSON-RPC 對話。讀完本文,你將能獨立開發並部署一個可上線的 MCP Server,涵蓋:協定架構 → 環境搭建 → Hello World → Tools / Resources / Prompts 三大能力 → HTTP 遠端傳輸 → 除錯測試 → Docker 部署 → 個人知識庫實戰專案 → 2026 生態展望。
大模型再強,訓練資料也有截止日,無法憑空知道你的 CRM 客戶、昨晚的日誌或內網 API 的即時狀態。業界演進路徑清晰:Function Calling → Plugins → MCP。前兩者多為廠商私有格式,換模型就要重寫整合層;MCP 用開放協定把「AI 能發現哪些工具、如何呼叫」標準化,一次撰寫、多 Client 複用。
痛點:你希望 Claude / GPT 能查資料庫、呼叫 API、操作檔案,但各家格式不同。
場景:在 Cursor 裡讓 AI 讀你的 Markdown 筆記、在 Claude Desktop 裡查 GitHub Issue。
承諾:本文帶你從空目錄到可部署 Server,含完整程式碼與排障表。
Anthropic 於 2024 年 11 月發布 MCP,目標是標準化 AI 與外部工具的通訊,解決 N 個模型 × M 個工具 = N×M 客製適配的碎片問題。更多協定史觀可參閱站內MCP 與 HTTP 類比文。
MCP 採用 Client ↔ Server 模型:Client 在 AI 側(Claude Desktop、Cursor);Server 是你開發的能力提供方,透過 JSON-RPC 暴露三大核心能力:
Tools(工具):AI 可呼叫的函式——搜尋、計算、資料庫查詢。
Resources(資源):AI 可讀取的資料——檔案、URL、設定串流。
Prompts(提示詞範本):預先定義、可參數化的提示片段。
基於 JSON-RPC 2.0;傳輸層支援 stdio(本機子行程,Cursor / Claude Desktop 預設)與 HTTP + SSE / Streamable HTTP(遠端服務)。生命週期:初始化握手 → 能力協商(initialize)→ 請求/回應 → 關閉。
| 維度 | MCP | OpenAI Function Calling | LangChain Tools |
|---|---|---|---|
| 標準化 | 開放協定 | 廠商私有 | 框架綁定 |
| 傳輸 | stdio / HTTP | HTTP | HTTP |
| 跨模型 | 是 | 否 | 部分 |
| Resources / Prompts | 原生支援 | 不支援 | 不支援 |
| 生態 | 2026 年 10,000+ Server | 成熟 | 成熟 |
Python(官方 SDK mcp,FastMCP 裝飾器簡潔)推薦新手;TypeScript(@modelcontextprotocol/sdk)適合前端/全端。本文以 Python 為主,TS 做對照。
# Python python -m venv .venv && source .venv/bin/activate pip install mcp httpx pydantic # TypeScript(對照) npm init -y && npm install @modelcontextprotocol/sdk
my-mcp-server/ ├── server.py # 主入口 ├── tools/ # calculator.py, web_search.py ├── resources/ # file_reader.py ├── prompts/ # templates.py ├── tests/test_tools.py ├── pyproject.toml └── README.md
MCP Inspector:npx @modelcontextprotocol/inspector python server.py
Claude Desktop:編輯 claude_desktop_config.json 註冊 Server。
Cursor:Settings → MCP → 新增 command + args。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-first-server")
@mcp.tool()
def say_hello(name: str) -> str:
"""向指定的人打招呼"""
return f"Hello, {name}! 這是你的第一個 MCP 工具。"
if __name__ == "__main__":
mcp.run()執行 python server.py 後,用 Inspector 或 Cursor 設定中填入 {"command":"python","args":["/path/to/server.py"]},重新整理工具清單應看到 say_hello。
使用絕對路徑指向 server.py 與虛擬環境 Python。
修改程式碼後需重啟 MCP 連線或重開 Cursor 視窗。
在對話中明確請求呼叫工具,驗證 AI 上下文已註冊。
函式簽名即文件:參數型別、回傳型別、docstring 會暴露給模型做工具選擇。命名用 snake_case、動詞開頭(search_web、read_file)。錯誤宜回傳結構化 JSON 而非直接拋出例外,便於模型自我修正。
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="搜尋關鍵字")
max_results: int = Field(default=5, description="最多回傳結果數")
language: str = Field(default="zh", description="結果語言")
@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
"""執行網路搜尋,回傳相關結果清單"""
...| 工具 | 用途 | 注意點 |
|---|---|---|
| 計算機 | 數學運算式求值 | 用 ast.literal_eval 或安全解析函式庫,禁用 eval |
| 檔案讀寫 | 讀/寫本機檔案 | 白名單目錄、路徑正規化防路徑遍歷 |
| HTTP 請求 | 呼叫外部 API | 逾時、重試、回應大小上限 |
| 資料庫查詢 | 唯讀 SQL | 參數化查詢、禁止 DDL |
| 時間工具 | 目前時間、時區轉換 | 回傳 ISO 8601 便於模型解析 |
@mcp.tool()
async def fetch_url(url: str) -> str:
"""取得指定 URL 的內容"""
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.get(url)
return response.text網路 / IO 操作設定逾時(建議 15–30s)。
敏感操作做權限驗證(API Key、允許路徑)。
回傳 {"error": "...", "hint": "..."} 幫助模型重試。
Resource 與 Tool 的區別:Resource 是資料提供者(以唯讀為主),Tool 是動作執行者。透過 URI 定址:file://、http://、custom://。
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
"""回傳應用程式設定"""
return json.dumps({"version": "1.0", "env": "production"})
@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
"""根據使用者 ID 回傳使用者資料"""
return json.dumps(db.query_user(user_id))資源類型包括:文字(text/plain、application/json)、二進位(圖片、PDF)、串流(即時行情)。實戰可做檔案系統 Server:列出目錄、讀取檔案、可選訂閱檔案變更。
MCP Prompt 是預先定義的提示片段,支援動態參數注入,提升團隊提示詞一致性與可維護性。
from mcp.types import PromptMessage, TextContent
@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
"""程式碼審查提示詞範本"""
return [PromptMessage(
role="user",
content=TextContent(type="text", text=f"""請審查以下 {language} 程式碼:
1. 品質與可讀性 2. Bug 與安全隱患 3. 效能最佳化
```{language}
{code}
```""")
)]可定義含 user + assistant 多輪範本,用於面試模擬、除錯助手等場景。Client 呼叫 prompts/get 取得填充後的訊息鏈。
| 特性 | stdio | HTTP + SSE |
|---|---|---|
| 部署 | 本機行程 | 遠端伺服器 |
| 延遲 | 極低 | 依賴網路 |
| 多 Client | 不支援 | 支援 |
| 場景 | IDE 本機工具 | SaaS / 團隊共享 |
mcp = FastMCP("remote-server", transport="streamable-http")
if __name__ == "__main__":
mcp.run(host="0.0.0.0", port=8000)生產環境需加:Bearer Token / API Key 中介軟體、CORS 白名單、請求頻率限制。勿將未鑑權的 HTTP MCP 直接暴露公網。
啟動 Inspector 可圖形化測試 tools/list、tools/call、檢視 JSON-RPC 日誌、模擬錯誤場景。
@pytest.mark.asyncio
async def test_calculator_tool():
server_params = StdioServerParameters(command="python", args=["server.py"])
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool("calculate", {"expression": "2 + 2"})
assert result.content[0].text == "4"| 錯誤 | 原因 | 解決 |
|---|---|---|
| 工具未出現 | 設定路徑錯誤 | 檢查 config.json 絕對路徑 |
| JSON 序列化失敗 | 回傳型別不支援 | 轉 str 或 dict |
| 逾時斷線 | 工具執行慢 | 非同步 + 逾時控制 |
| 權限拒絕 | 檔案路徑受限 | 設定允許目錄 / VNC 點 TCC |
FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "server.py"]
Railway / Render:個人專案一鍵部署。
AWS Lambda / Cloud Run:Serverless,注意冷啟動與 stdio 限制。
自建 VPS + Nginx:反向代理 + TLS + 限流。
結構化請求日誌、Prometheus 工具呼叫指標、Sentry 錯誤告警、/health 健康檢查。宣告 MCP 協定版本,工具升級保持向後相容。
需求:讓 AI 搜尋本機 Markdown 筆記、語意檢索、建立/更新筆記。在 Cursor 中問:「我上週記錄了什麼關於 MCP 的筆記?」
| 元件 | 推薦 |
|---|---|
| 向量資料庫 | ChromaDB / Qdrant(本機) |
| 嵌入模型 | text-embedding-3-small |
| 檔案監聽 | watchfiles 增量索引 |
index_notes:掃描目錄建立向量索引。
semantic_search:按語意回傳相關片段。
write_note:建立或追加 Markdown。
Resource:notes://{path} 直接讀取單篇筆記。
效果:AI 呼叫 semantic_search 召回片段後綜合回答,比把整個筆記庫塞進上下文省 Token 且更準確。
mcp-server-filesystem — 檔案系統操作
mcp-server-github — GitHub 儲存庫
mcp-server-brave-search — 網路搜尋
mcp-server-postgres — 資料庫查詢
mcp-server-slack — Slack 訊息
2026 年 Cursor、Claude Desktop、OpenAI、Google Gemini、Microsoft 均已支援或完成 MCP 接入;MCP Marketplace 與企業級安全標準(OAuth 2.1、稽核)持續完善。官方文件:modelcontextprotocol.io;Python SDK:github.com/modelcontextprotocol/python-sdk。
選定 Host(Cursor / Claude Desktop)並確認 2026 版本原生支援 MCP。
本機 stdio 開發 Server,Inspector 驗證 tools/list。
註冊到 Cursor MCP 設定,用 Hello World 工具冒煙測試。
涉及瀏覽器、鑰匙圈、螢幕錄製的 Server,在 macOS 圖形工作階段完成 TCC 授權(純 SSH 無法點選)。
Docker 部署 HTTP 模式,加鑑權與監控後上線;與站內Agent Skill、瀏覽器 MCP文互連。
Python(mcp + FastMCP)上手最快;TypeScript(@modelcontextprotocol/sdk)適合已有 Node 棧的團隊。協定層等價。
IDE 本機開發優先 stdio;需多使用者共享、SaaS 交付選 HTTP + SSE / Streamable HTTP,並務必加鑑權。
Tools 執行動作(寫庫、發請求);Resources 提供唯讀資料(設定、檔案內容),透過 URI 範本定址。
瀏覽器 DevTools MCP、高權限檔案操作、鑰匙圈與螢幕錄製會觸發 macOS TCC 彈窗。純 SSH 無法點「始終允許」,需 VNC 圖形工作階段與 Host 同機驗收。
MCP 是 AI 工具化的標準協定——掌握從 Hello World 到生產部署的全鏈路,是 2026 年 AI 工程師的核心競爭力之一。你打算用 MCP 開發什麼工具?歡迎在實踐後複盤自己的 Server 設計。
隱性成本往往不在寫程式,而在執行環境:Windows 主力機 + 雲端 Mac 混跑 Cursor MCP 時,權限彈窗、Python 虛擬環境與 Inspector 日誌要在同一台機器的桌面工作階段裡交叉核對;自購 Mac mini 則要承擔睡眠、系統更新與折舊,8GB 記憶體在向量索引 + 多 Server 並行時也容易吃滿。
若你希望按小時驗證 MCP 工具鏈、又要在與 Cursor 同機的圖形介面裡完成 TCC 與 Inspector 驗收,可透過 VNCMac 租用遠端 Mac:下方主按鈕進入購買頁;需要對比套餐時先瀏覽首頁。