2026年10月26日 星期一

FastAPI REST API 與 MCP Server 比較:同一功能,兩種介面

Python 網路程式設計|REST API × MCP

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 endpoint→Python 功能
AI Agent/MCP host→MCP Client→MCP Server tool→Python 功能
一句話記憶:REST API 通常由呼叫端指定要呼叫哪個 URL 和 HTTP 方法;MCP Server 會描述可用的工具,讓 MCP Client/Agent 能先探索工具,再以工具名稱與參數呼叫。FastAPI 會依 API 定義產生 OpenAPI schema 和互動文件;MCP SDK 則負責 MCP 工具、資源、提示與協定傳輸。FastAPI 官方文件|MCP Python SDK 官方文件

二、比較表

比較面向FastAPI REST APIMCP 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 程式解說

  1. FastAPI() 建立 Web API 應用程式。
  2. EchoRequest 描述 client 送來的 JSON 欄位;EchoResponse 描述 server 回覆格式。FastAPI 會使用型別資訊驗證資料並產生 API 文件。
  3. @app.post("/echo") 建立 POST /echo endpoint。REST client 知道路徑和方法後即可呼叫。
  4. 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 程式解說

  1. MCPServer(...) 建立 MCP Server,並可提供用途說明。
  2. @mcp.tool() 把 Python 函式註冊為 MCP 工具。工具名稱、說明和參數 schema 會提供給 MCP Client 探索。
  3. 工具函式呼叫共用的 echo_message(),因此 REST 與 MCP 介面使用相同業務規則。
  4. 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 等傳輸。citeturn15search1turn15search2turn15search4

六、同一個功能如何被兩種 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 可讀取工具說明,依使用者任務選擇要呼叫哪個工具。
重要觀念:MCP Server 不是「內建 AI 的 Server」。它提供可被呼叫的工具;Agent 或 MCP host 負責理解任務、選擇工具,再呼叫 MCP Server。若一般程式已清楚知道要做什麼,直接呼叫 REST API 通常更簡單。

七、循序圖:REST 與 MCP 的呼叫流程

循序圖由上往下表示時間先後。左半部是一般程式直接呼叫 REST;右半部是 Agent 透過 MCP Client 探索工具、選擇工具,再由 MCP Server 執行。兩條流程最後都會呼叫同一個共用服務函式。

  1. REST 流程:Client 依 API 文件直接送出 POST /echo,FastAPI 驗證 JSON,執行 endpoint,再回傳 HTTP 狀態碼與 JSON。
  2. MCP 初始化:MCP Client 與 Server 建立連線並協商協定能力。實際傳輸可能是 stdio 或 Streamable HTTP。
  3. 探索工具:Client 使用 tools/list 取得 MCP Server 公布的工具名稱、描述和輸入 schema,Agent 因此能判斷有哪些能力可用。
  4. 呼叫與回覆: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,再決定要暴露哪一種介面。

沒有留言:

張貼留言