從 0 開發一個 MCP Server:手把手教你構建 AI 工具調用能力

協定原理 · FastMCP 實戰 · Tools/Resources/Prompts · HTTP 遠端部署 · 知識庫專案

從 0 開發一個 MCP Server:手把手教你構建 AI 工具調用能力

為什麼 AI 模型「不夠聰明」?因為它無法存取外部工具與即時資料。若你希望 Claude/GPT 能查資料庫、調 API、讀寫檔案,MCP(Model Context Protocol) 正是標準化答案。本文面向有 Python 或 TypeScript 基礎的後端 / AI 開發者:從協定原理環境搭建,涵蓋 Tools、Resources、Prompts 註冊、MCP Inspector 除錯、HTTP+SSE 遠端部署與個人知識庫實戰專案,讀完後你將能獨立開發並部署生產可用的 MCP Server。

01

什麼是 MCP?先搞懂協定再寫程式碼

大模型工具調用能力經歷了 Function Calling → Plugins → MCP 的演進。Anthropic 設計 MCP 的核心動機,是用開放協定標準化 AI 與外部工具的通訊——讓「寫一次 Server、多 Client 複用」成為現實。

MCP 協定架構:Client ↔ Server ↔ 三大能力

MCP Client(Claude Desktop、Cursor、自訂客戶端)與 MCP Server(你開發的部分)透過 JSON-RPC 2.0 通訊。Server 向下對接三類核心能力:Tools(可呼叫函式,如搜尋、計算、資料庫查詢)、Resources(可讀取資源,如檔案、URL、資料流)、Prompts(預定義提示詞範本)。

傳輸方式分兩種:stdio(本地子程序,延遲極低)與 HTTP + SSE(遠端伺服器,支援多客戶端)。生命週期為:初始化握手 → 能力協商 → 請求/回應 → 關閉。

  1. 01

    模型缺乏即時資料:訓練截止導致無法回答「今天股價」或「最新工單狀態」,必須接外部 API。

  2. 02

    各廠商工具格式不統一:ChatGPT Plugins、OpenAI Function Calling、Claude Tool Use 各自為政,換模型要重寫整合層。

  3. 03

    IDE 無法複用工具資產:Cursor、VS Code、Claude Desktop 各有一套接入方式,團隊沉澱的工具無法跨產品遷移。

  4. 04

    Agent 框架綁定:LangChain Tools 無法直接給 CrewAI 用,編排資產鎖死在框架而非團隊。

  5. 05

    N×M 維護成本:N 個模型 × M 個外部系統 = 指數級客製化整合,MCP 將其收斂為「一次 Server、處處可用」。

對比維度MCPOpenAI Function CallingLangChain Tools
標準化程度開放協定標準廠商私有框架綁定
傳輸方式stdio / HTTPHTTPHTTP
跨模型支援部分
Resources / Prompts原生支援不支援不支援
生態工具快速成長(10000+ Server)成熟成熟

讀完本節再動手寫程式碼:MCP 不是又一個 SDK,而是 AI 工具化的標準協定——掌握它,是 2026 年 AI 工程師的核心競爭力。

02

開發環境準備:語言選型與專案結構

Python(官方 SDK mcp + FastMCP)推薦新手;TypeScript@modelcontextprotocol/sdk)適合前端 / 全端。本文以 Python 為主,TypeScript 做對照說明。

bash · 環境搭建
python -m venv .venv
source .venv/bin/activate
pip install mcp

npm init -y
npm install @modelcontextprotocol/sdk

推薦專案結構:

text · 目錄結構
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(官方 UI,npx @modelcontextprotocol/inspector)、Claude Desktop 本地聯調(claude_desktop_config.json)、Cursor MCP 設定(Settings → MCP Servers)。官方文件見 modelcontextprotocol.io

03

第一個 MCP Server:Hello World 與 Cursor 接入

以下六步 Runbook 幫你在 30 分鐘內跑通第一個可被 AI 呼叫的工具。

python · server.py
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()
  1. 01

    建立虛擬環境並安裝 mcp:pip install mcp,確認 Python ≥ 3.10。

  2. 02

    撰寫 server.py:@mcp.tool() 裝飾器註冊 say_hello,docstring 即工具描述。

  3. 03

    Inspector 除錯:npx @modelcontextprotocol/inspector python server.py,在 UI 中測試 tools/list 與 tools/call。

  4. 04

    Cursor 設定:在 MCP 設定中添加 {"command":"python","args":["/path/to/server.py"]},重啟後確認工具出現在 Agent 上下文。

  5. 05

    Claude Desktop 設定:編輯 ~/Library/Application Support/Claude/claude_desktop_config.json,格式與 Cursor 相同。

  6. 06

    驗證呼叫:在 Cursor 中輸入「用 say_hello 向 VpsMesh 打招呼」,確認 Agent 自動選擇工具並回傳結果。

提示:函式簽名即文件——參數類型、回傳類型、docstring 會直接暴露給 LLM,決定 Agent 能否正確選用你的工具。

04

Tools 開發:讓 AI 呼叫你的五個實用工具

工具是 MCP Server 的核心。命名規範建議動詞開頭(search_webquery_database);複雜參數用 Pydantic 建模:

python · Pydantic 輸入
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]:
    """執行網路搜尋,回傳相關結果清單"""
    ...

五個實戰工具清單

  • 計算器:安全求值數學運算式,禁止 eval 裸呼叫。
  • 檔案讀寫:限定 allowlist 目錄,讀/寫本地 Markdown 或設定。
  • HTTP 請求:封裝 GET/POST,統一逾時與重試。
  • 資料庫查詢:唯讀 SQL + 參數化防注入。
  • 時間工具:目前時間、時區轉換、工作日計算。
python · 非同步工具
import httpx

@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

錯誤處理最佳實務:對可預期失敗回傳結構化錯誤資訊(含 error_codemessage);網路 IO 必須設逾時;寫入操作前做權限校驗與稽核記錄。

05

Resources 與 Prompts:資料供給與提示詞範本

Resources:AI 可讀取的動態內容

Resource 與 Tool 的區別:Resource 是資料提供者(唯讀),Tool 是動作執行者。透過 URI 尋址:file://http://custom://

python · 靜態與動態資源
@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:
    user = db.query_user(user_id)
    return json.dumps(user)

資源類型涵蓋文字(text/plainapplication/json)、二進位(圖片、PDF)與串流即時資料。檔案系統資源伺服器可實作:列出目錄、讀取檔案、監聽變化(資源訂閱)。

Prompts:可複用的提示詞範本

MCP Prompt 是預定義片段,支援動態參數注入,提升一致性與可維護性。可定義包含 userassistant 的多輪範本,適用於程式碼審查、面試模擬、除錯助手等場景。

python · 程式碼審查 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} 程式碼進行審查,重點關注品質、Bug 與效能。\n```{language}\n{code}\n```"
            )
        )
    ]
06

HTTP 遠端傳輸、除錯測試與常見錯誤

特性stdioHTTP + SSE
部署方式本地程序遠端伺服器
延遲極低相依網路與頻寬
多客戶端不支援支援
適用場景本地工具SaaS / 團隊共享
python · streamable-http
mcp = FastMCP("remote-server", transport="streamable-http")

if __name__ == "__main__":
    mcp.run(host="0.0.0.0", port=8000)

遠端部署安全要點:Bearer Token 驗證、API Key 校驗中介軟體、CORS 設定、請求頻率限制。生產環境禁止把金鑰寫進 tool schema。

MCP Inspector 與單元測試

Inspector 可測試 Tools 呼叫、查看 JSON-RPC 記錄、模擬錯誤場景。單元測試用官方 Client SDK 啟動 stdio 子程序:

python · pytest
@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"
錯誤原因解決方案
工具未出現在 AI 中設定路徑錯誤檢查 config.json 中 command/args 絕對路徑
JSON 序列化失敗回傳類型不支援轉為 str 或 dict
逾時斷開工具執行太慢改 async + 設 timeout
權限拒絕檔案路徑受限設定允許存取的目錄 allowlist
07

生產部署、知識庫實戰與 MCP 生態

Docker 容器化與雲服務

dockerfile
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 / Google Cloud Run(Serverless)、自建 VPS(Nginx 反向代理)。監控用結構化記錄、Prometheus 指標、Sentry 告警與健康檢查介面。版本管理須宣告 MCP 協定版本,升級工具時保持向後相容。

實戰專案:個人知識庫 MCP Server

需求:讓 AI 搜尋本地 Markdown 筆記、語意檢索、建立與更新筆記。技術選型:ChromaDB / Qdrant 向量庫、text-embedding-3-small 嵌入、watchfiles 監聽檔案變化。核心實作:筆記索引工具、語意搜尋工具、筆記寫入工具、檔案資源服務。效果:在 Cursor 中問「我上週記錄了什麼關於 MCP 的筆記?」,Agent 呼叫搜尋工具回傳相關片段。

優質 MCP Server 與 2026 生態趨勢

  • mcp-server-filesystem:檔案系統操作
  • mcp-server-github:GitHub 倉庫操作
  • mcp-server-brave-search:網路搜尋
  • mcp-server-postgres:資料庫查詢
  • mcp-server-slack:Slack 訊息

2026 年主流 AI 客戶端(Cursor、Claude Desktop、VS Code、OpenAI、Gemini)均已支援 MCP;MCP Marketplace 與企業級安全標準快速發展。下一步:深入學習協定規範、發布公開 Server、探索 MCP + Agent 組合、貢獻開源生態。配套資源:Python SDKTypeScript SDKMCP Inspector

可引用硬核資料

  • 協定底層:JSON-RPC 2.0,傳輸層 STDIO 或 HTTP+SSE,工具發現走 tools/list 執行時期拉取。
  • 生態規模:截至 2026 年,MCP 生態已有 10,000+ Server,網路效應與 HTTP 早期類似。
  • 整合成本:統一 MCP 介面後,企業 AI 整合開發成本降幅 38–55%(產業調研區間)。
  • 廠商背書:2026 年 Q1–Q2,OpenAI、Google、Microsoft 全面入局,治理權移交 AAIF

筆電適合 MCP POC,卻在闔蓋休眠、缺少 macOS 原生工具鏈與長期程序守護上削弱 7×24 體驗;純 Linux VPS 能跑 HTTP+SSE,卻難承載 Keychain、Xcode 等 macOS 相依的 MCP 工具。對要把多個 MCP Server 當「常駐基礎設施」、讓 Agent 跨週累積工具呼叫複利的技術團隊,VpsMesh Mac Mini M4 雲端租用把 uptime、遠端 KVM 與可預期月租打包成生產級 OpEx。方案見 Mac Mini M4 租用價格,部署問題見 幫助中心,線上下單見 訂購頁

常見問題

讀者最常問的三個問題

Python 官方 SDK mcp 配合 FastMCP 上手最快,適合後端與 AI 工程師。TypeScript SDK @modelcontextprotocol/sdk 適合前端與全端。二者協定層完全相容,邏輯可對照遷移。若團隊主力是 Node 全端,選 TS;若以資料 / ML 為主,選 Python。

Tools 是動作執行者——AI 呼叫後會改變外部狀態或觸發計算(搜尋、寫檔案、發請求)。Resources 是資料提供者——透過 URI 唯讀取得內容,如 config://app-settingsuser://{id}/profile。簡單記憶:讀資料用 Resource,做動作用 Tool。

HTTP+SSE 模式可部署在 Railway、Cloud Run 或 Linux VPS。若 MCP 工具鏈相依 macOS 原生能力、Keychain 或你希望 Cursor Agent 與多個 Server 7×24 不被闔蓋打斷Mac Mini M4 月租更省心。建議先租 1 個月驗證 tools/call 曲線,方案見 Mac Mini M4 租用價格,下單見 訂購頁,文檔見 幫助中心