MCP Server 開發實戰:從零打造 AI Agent 工具整合系統
你有沒有想過,為什麼有些 AI Agent 可以讀取你的檔案、查詢資料庫、甚至幫你發送訊息,而有些卻只能對話?關鍵就在於MCP(Model Context Protocol)——Anthropic 推出的開源標準,被稱為「AI 的 USB-C」。
身為一個從去年就開始玩 MCP 的 AI 工程師,我必須說這東西真的改變了我開發 AI 應用的方式。今天就來手把手教你怎麼從零開始建置自己的 MCP Server。
什麼是 MCP?為什麼你需要它
MCP 全名 Model Context Protocol,是一個讓 AI 模型能安全地與外部工具和資料來源互動的標準協議。簡單來說,它就是 AI Agent 的「手腳」——沒有 MCP,AI 只能用嘴巴說;有了 MCP,AI 可以實際動手做事。
MCP 的架構由四個核心元件組成:
- MCP Client:像是 Claude Desktop、Claude Code 或你自己寫的應用程式
- MCP Server:暴露工具(Tools)的服務端,用 JSON-RPC 2.0 通訊
- Tool Adapter:實際執行邏輯的輕量包裝
- Policy Layer:管理權限、頻率限制和日誌
如果你對 RAG 文件切割策略已經有了解的話,MCP 可以想成是把那些處理好的知識「接上」AI 的管道。
環境準備:你需要什麼
開始之前,確認你有以下環境:
# Node.js 18+ 或 Python 3.10+
node --version # v20.x 以上推薦
python --version # 3.10+
# 安裝 MCP SDK
npm install @modelcontextprotocol/sdk
# 或 Python
pip install mcp我個人偏好用 TypeScript 來寫 MCP Server,型別檢查在這種協議層開發特別有用。但 Python 的 FastMCP 框架也很香,看你習慣哪個。
Step 1:建立基本的 MCP Server
先來寫一個最簡單的 MCP Server,提供一個「查詢天氣」的工具:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({
name: "weather-server",
version: "1.0.0",
});
server.tool(
"get_weather",
"查詢指定城市的天氣資訊",
{ city: { type: "string", description: "城市名稱" } },
async ({ city }) => {
const weather = await fetchWeather(city);
return {
content: [{ type: "text", text: JSON.stringify(weather) }]
};
}
);
const transport = new StdioServerTransport();
await server.connect(transport);這段程式碼做了三件事:建立 Server 實例、註冊一個工具、然後透過 stdio 傳輸層啟動。就這麼簡單。
Step 2:加入資料庫查詢能力
光查天氣太無聊了。讓我們加入更實用的功能——查詢 PostgreSQL 資料庫:
import { Pool } from "pg";
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
server.tool(
"query_database",
"執行唯讀的 SQL 查詢",
{ sql: { type: "string", description: "SELECT 開頭的 SQL 查詢語句" } },
async ({ sql }) => {
if (!sql.trim().toUpperCase().startsWith("SELECT")) {
return { content: [{ type: "text", text: "錯誤:只允許 SELECT 查詢" }], isError: true };
}
const result = await pool.query(sql);
return { content: [{ type: "text", text: JSON.stringify(result.rows, null, 2) }] };
}
);注意安全性!這裡我們做了最基本的檢查——只允許 SELECT 查詢。在生產環境中,你還需要加上參數化查詢、查詢白名單等更嚴格的防護。
Step 3:Resource 與 Prompt 的運用
MCP 不只有 Tools,還有 Resources 和 Prompts 兩個重要概念:
- Resources:讓 AI 能讀取的靜態或動態資料來源
- Prompts:預設的提示模板,讓使用者更容易觸發特定工作流
server.resource(
"project-docs",
"file:///docs/**",
async (uri) => {
const content = await readFile(uri.path);
return {
contents: [{ uri: uri.toString(), mimeType: "text/markdown", text: content }]
};
}
);
server.prompt(
"code-review",
"幫忙做 Code Review",
[{ name: "file", description: "要 review 的檔案路徑" }],
async ({ file }) => ({
messages: [{ role: "user", content: { type: "text", text: `請幫我 review 以下檔案:${file}` } }]
})
);Step 4:部署與連接 Claude
寫好 Server 後,要讓 Claude Desktop 能連上它。在設定檔中加入你的 MCP Server 路徑和環境變數,重啟後 Claude 就能自動偵測可用的工具,並在需要時呼叫它們。
MCP vs Function Calling:該選哪個?
你可能會問:MCP 跟 OpenAI 的 Function Calling 有什麼不同?
| 比較項目 | MCP | Function Calling |
|---|---|---|
| 標準化 | 開源標準,跨模型通用 | 各家 API 格式不同 |
| 執行位置 | 本地或遠端 Server | 需要自己實作呼叫邏輯 |
| 安全性 | 內建權限管理 | 需自己處理 |
| 生態系 | 30+ 工具已支援 | 依賴各平台 |
簡單說,Function Calling 是「告訴 AI 可以呼叫什麼函式」,MCP 是「建立一個標準化的工具生態系」。兩者不衝突,甚至可以一起用。
實戰案例:自動化 SEO 工作流
來分享一個我自己在用的案例。我建了一個 MCP Server,讓 Claude 可以查詢資料庫中的文章數據、分析哪些關鍵字還沒有覆蓋、自動生成文章大綱、發布到 CMS 系統。整個流程從手動操作 2 小時縮短到 AI 自動完成只要 10 分鐘。這就是 MCP 的威力。
如果你對 LangChain Agent 工具呼叫有興趣的話,MCP 可以說是更標準化、更易用的替代方案。而如果你想深入了解 LangChain vs LlamaIndex 的比較,MCP 提供了一個統一的工具層,讓你不必被框架綁死。
常見踩坑與解決方案
1. stdio 傳輸中文亂碼
確保你的 Node.js 環境使用 UTF-8 編碼。可以在啟動時設定環境變數 LANG=en_US.UTF-8。
2. 工具回傳太慢被 timeout
MCP Client 通常有 30 秒的預設 timeout。如果你的工具需要更長時間,考慮改用 SSE(Server-Sent Events)傳輸層,支援串流回傳。
3. 權限管理不夠細緻
在 Policy Layer 中設定工具級別的權限。比如資料庫工具只允許讀取,檔案工具限制在特定目錄內。
結語
MCP 還在快速演進中,2026 年初已經有超過 30 個工具支援這個標準。從 GitHub、Google Drive 到 Slack,幾乎你日常用的工具都可以透過 MCP 接入 AI。我的建議是:先從一個簡單的 MCP Server 開始,解決你自己的一個痛點。
如果你對 AI Agent 的整體架構感興趣,推薦也看看RAG 應用開發完整指南和Prompt Engineering 進階技巧,搭配 MCP 使用威力更強。
繼續閱讀
AI Agent 記憶系統設計:從短期到長期記憶的完整實作指南
想讓你的 AI Agent 記住之前的對話、學會累積經驗?這篇從零開始教你設計完整的記憶系統。
相關文章
你可能也喜歡
探索其他領域的精選好文