在一小時內將內部 REST API 封裝為 MCP
何時使用: 你有一個公司 API 需要讓 Agent 呼叫,但不想從頭撰寫客戶端規格。
前置條件
- Python 3.10+ —
python --version - uv installed —
curl -LsSf https://astral.sh/uv/install.sh | sh
步驟
-
初始化專案建立一個名為 'acme-api-mcp' 的 FastMCP 伺服器專案,包含一個範例工具。使用 uv 管理相依套件。✓ 已複製→ 生成 pyproject.toml 與 server.py,其中包含可運作的 @mcp.tool 範例
-
封裝價值最高的 3 個端點我的內部 API 有 /orders/{id}、/customers/search、/invoices/{id}/pdf 這三個端點。請分別用 FastMCP 為每個端點撰寫工具,使用 httpx.AsyncClient,並從環境變數讀取 AUTH_TOKEN。✓ 已複製→ 3 個帶有型別提示與 docstring 的裝飾函式,docstring 即成為工具描述
-
使用 MCP Inspector 在本地測試執行
uv run mcp dev server.py啟動伺服器,打開 Inspector 並以實際的輸入測試每個工具。✓ 已複製→ 工具回傳預期的 JSON,無 stack trace
結果: 一個可運作的 MCP 伺服器,可直接連接 Claude Desktop 或任何 MCP 客戶端。
注意事項
- 因在 docstring 中輸出機密資訊,導致憑證外洩至工具描述中 — docstring 應描述行為,而非含有真實 token 的範例。透過
os.environ載入機密,且絕不在錯誤訊息中輸出它們 - 混用非同步與同步程式碼,導致 event loop 錯誤 — 選擇其中一種——若 HTTP 客戶端是非同步的,則整個工具都應為非同步;不要在工具內呼叫
asyncio.run