FastAPI REST API 與 MCP Server 比較:同一功能,兩種介面
FastAPI REST API 與 MCP Server 都能把 Python 功能提供給其他程式使用,但面向的使用者和互動方式不同。本文用同一個 echo_message 功能,分別建立 REST endpoint 與 MCP tool,說明如何選用、如何共用商業邏輯,以及兩者如何在同一個專案中合作。
一、先看核心差異:它們解決不同層次的問題
FastAPI 是用來建立 HTTP API 的 Python Web 框架;REST 是一種以資源、HTTP 方法與狀態碼組織 API 的設計風格。MCP 則是讓 AI 應用以標準方式探索和使用工具、資源及提示的協定。MCP 可以使用 Streamable HTTP 傳輸,因此它也會經由 HTTP 網路通訊;但 MCP 訊息與 REST endpoint 的請求格式和互動流程並不相同。
二、比較表
| 比較面向 | FastAPI REST API | MCP Server |
|---|---|---|
| 主要目的 | 讓網站、手機 App、IoT 後端或其他服務呼叫應用程式功能。 | 讓支援 MCP 的 AI host/Agent 以共同協定使用工具、資源和提示。 |
| 呼叫方式 | 呼叫端指定 URL、HTTP 方法和 JSON 請求內容,例如 POST /echo。 | Client 先探索工具,再以工具名稱和參數發出 MCP tools/call。 |
| 介面描述 | 常以 OpenAPI 描述路由、參數、回應和狀態碼。 | 工具以名稱、說明和輸入 schema 描述;也可提供 resources 和 prompts。 |
| 典型呼叫端 | 瀏覽器、前端、手機程式、一般 Python/JavaScript client、後端服務。 | 支援 MCP 的 Agent、AI 桌面應用、IDE 或自製 MCP Client。 |
| 是否需要 AI | 不需要。呼叫端按程式邏輯指定 API。 | MCP 本身不要求 server 內有模型;通常由 Agent/host 判斷要不要呼叫工具。 |
| 常見傳輸 | HTTP/HTTPS。 | stdio、Streamable HTTP 等標準傳輸。 |
| 適合情境 | 建立應用程式後端、資料 CRUD、前端服務、公開或內部 API。 | 讓 AI 工具使用者能探索並呼叫既有系統功能。 |
三、先寫共用的 Python 功能
無論呼叫端是 REST client 還是 MCP Client,建議把真正的業務邏輯放在共同模組,而不是各寫一份。這樣兩種介面都呼叫同一個函式,結果和規則才不會逐漸不一致。
# service.py
def echo_message(message: str) -> str:
"""回傳 server 收到的訊息。"""
return f"Server received: {message}"
service.py 不處理 HTTP,也不處理 MCP。它只負責應用程式本身的功能。REST 和 MCP 是兩個不同的入口,最後都委派給這個函式。
四、用 FastAPI 建立 REST API
# rest_server.py
from fastapi import FastAPI
from pydantic import BaseModel
from service import echo_message
app = FastAPI(title="Echo REST API")
class EchoRequest(BaseModel):
message: str
class EchoResponse(BaseModel):
reply: str
@app.post("/echo", response_model=EchoResponse)
def echo(request: EchoRequest) -> EchoResponse:
reply = echo_message(request.message)
return EchoResponse(reply=reply)
REST API 程式解說
FastAPI()建立 Web API 應用程式。EchoRequest描述 client 送來的 JSON 欄位;EchoResponse描述 server 回覆格式。FastAPI 會使用型別資訊驗證資料並產生 API 文件。@app.post("/echo")建立POST /echoendpoint。REST client 知道路徑和方法後即可呼叫。- endpoint 把訊息交給
echo_message(),再以 JSON 回傳。
安裝並啟動:
python -m pip install fastapi uvicorn
uvicorn rest_server:app --reload --host 127.0.0.1 --port 8000
可用命令列呼叫 REST API:
curl -X POST "http://127.0.0.1:8000/echo" `
-H "Content-Type: application/json" `
-d "{\"message\":\"Hello REST\"}"
預期回傳 JSON:
{"reply":"Server received: Hello REST"}
FastAPI 也會依 OpenAPI 規格產生互動式文件,預設可到 http://127.0.0.1:8000/docs 查看 endpoint 和測試請求。
五、用 MCP SDK 建立 MCP Server
# mcp_server.py
from mcp.server import MCPServer
from service import echo_message
mcp = MCPServer(
"Echo MCP Server",
instructions="提供 echo_message 工具,回傳收到的文字。",
)
@mcp.tool()
def echo_message_tool(message: str) -> str:
"""回傳 server 收到的訊息。"""
return echo_message(message)
if __name__ == "__main__":
mcp.run(
transport="streamable-http",
host="127.0.0.1",
port=8001,
)
MCP Server 程式解說
MCPServer(...)建立 MCP Server,並可提供用途說明。@mcp.tool()把 Python 函式註冊為 MCP 工具。工具名稱、說明和參數 schema 會提供給 MCP Client 探索。- 工具函式呼叫共用的
echo_message(),因此 REST 與 MCP 介面使用相同業務規則。 mcp.run(transport="streamable-http")以 Streamable HTTP 啟動服務。本例使用 8001 埠,endpoint 為http://127.0.0.1:8001/mcp。
安裝 MCP Python SDK v2 後啟動:
python -m pip install "mcp[cli]>=2,<3"
python mcp_server.py
MCP Client 連線後可先用 tools/list 取得工具清單,再以 tools/call 呼叫工具。MCP 的工具定義包含名稱、描述及輸入 schema;MCP Python SDK 支援 stdio、Streamable HTTP 等傳輸。citeturn15search1turn15search2turn15search4
六、同一個功能如何被兩種 client 使用?
| REST 呼叫 | MCP 呼叫 |
|---|---|
送出 POST /echo。 | 從工具清單找到 echo_message_tool。 |
在 JSON body 傳入 {"message":"Hello"}。 | 在工具 arguments 傳入 {"message":"Hello"}。 |
| 取得 HTTP status code 與 JSON response body。 | 取得 MCP tool result,可能包含文字或結構化內容。 |
| 通常由程式碼明確指定要呼叫哪個 URL。 | Agent 可讀取工具說明,依使用者任務選擇要呼叫哪個工具。 |
七、循序圖:REST 與 MCP 的呼叫流程
循序圖由上往下表示時間先後。左半部是一般程式直接呼叫 REST;右半部是 Agent 透過 MCP Client 探索工具、選擇工具,再由 MCP Server 執行。兩條流程最後都會呼叫同一個共用服務函式。
- REST 流程:Client 依 API 文件直接送出
POST /echo,FastAPI 驗證 JSON,執行 endpoint,再回傳 HTTP 狀態碼與 JSON。 - MCP 初始化:MCP Client 與 Server 建立連線並協商協定能力。實際傳輸可能是 stdio 或 Streamable HTTP。
- 探索工具:Client 使用
tools/list取得 MCP Server 公布的工具名稱、描述和輸入 schema,Agent 因此能判斷有哪些能力可用。 - 呼叫與回覆:Agent 選定工具後,Client 用
tools/call傳入工具名稱及參數;Server 執行工具並回傳 tool result,Agent 再把結果整理成給使用者的回答。
REST 的主要往返通常是「呼叫 endpoint、收到 HTTP response」;MCP 多了協定初始化與工具探索的階段。若 Client 已經知道固定要呼叫哪個 API,REST 直接明確;若 Agent 要根據任務從可用工具中選擇,MCP 的工具描述和探索流程就有幫助。
八、可以讓 REST 與 MCP 共存嗎?
可以。常見架構是把業務功能放在共用服務層,再分別提供 REST 與 MCP 入口:
Web/手機 App ──HTTP POST──> FastAPI /echo ─┐
├──> service.echo_message()
Agent ──MCP tools/call──────> MCP Server ────┘
這樣網站、手機 App、其他後端程式可以使用 REST API;AI Agent 則使用 MCP 工具。兩者共用驗證後的業務邏輯、資料庫存取和紀錄程式。初學時分別跑在不同埠號較容易觀察;系統成熟後,再依部署架構考慮掛載到同一個 ASGI 應用程式或透過反向代理管理。
九、何時選哪一種?
- 建立網站或手機 App 後端:先選 FastAPI REST API。它的 URL、HTTP 方法和 JSON 格式適合一般 client,OpenAPI 文件也方便測試與產生 client 程式碼。
- 把資料或功能提供給支援 MCP 的 Agent:建立 MCP Server,明確描述可用工具、參數與用途。
- 同時有一般 client 和 Agent:保留 REST 與 MCP 兩個入口,共用同一套 service layer。
- 純 REST API 要讓模型呼叫:也能用 Agent SDK 的 function tool 封裝 API 呼叫,不一定非要自己架 MCP;若希望多種 MCP host 以共同協定探索並使用工具,MCP 會較合適。
- 涉及敏感操作:REST 和 MCP 都要做身分驗證、授權、輸入檢查與紀錄。不要因為使用 MCP 就假設工具自動安全;只開放必要能力,修改或刪除等操作應加上核准機制。
十、結論
FastAPI REST API 和 MCP Server 不需要二選一。REST API 面向一般軟體 client,讓呼叫端依 URL 和 HTTP 方法呼叫服務;MCP Server 面向 AI host/Agent,讓 client 透過標準協定探索和呼叫工具。實務上,可把業務邏輯寫一次,再同時提供 REST 與 MCP 介面。選擇時先看呼叫端是一般應用程式還是 AI Agent,再決定要暴露哪一種介面。
沒有留言:
張貼留言