MCP
基本介紹
官方地址:
- https://modelcontextprotocol.io/introduction
“MCP 是一種開放協議,旨在標準化應用程序向大型語言模型(LLM)提供上下文的方式。可以把 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 提供了一種標準化的方式,讓你的設備能夠連接各種外設和配件一樣,MCP 也提供了一種標準化的方式,讓 AI 模型能夠連接不同的數據源和工具。”
● MCP 主機(MCP Hosts):像 Claude Desktop、IDE 或 AI 工具等程序,它們希望通過 MCP 訪問數據。
● MCP 客戶端(MCP Clients):維護與服務器 1:1 連接的協議客戶端。
● MCP 服務器(MCP Servers):輕量級程序,它們通過標準化的模型上下文協議(Model Context Protocol)公開特定的功能。
● 本地數據源(Local Data Sources):你的計算機上的文件、數據庫和服務,MCP 服務器可以安全地訪問這些數據。
● 遠程服務(Remote Services):通過互聯網可用的外部系統(例如 API),MCP 服務器可以與其連接。
https://www.anthropic.com/news/model-context-protocol
MCP
之前已經介紹過了,這里就不做復雜介紹了。
重點要提一下,MCP的 Server 和 Client 有兩種交互方式:
● 標準輸入輸出(stdio)通信:在本地環境中,MCP 客戶端通常將服務器程序作為子進程啟動,雙方通過標準輸入(stdin)和標準輸出(stdout)進行數據交換,采用 JSON-RPC 2.0 格式的消息進行通信。
● 服務器發送事件(SSE)通信:在遠程環境中,MCP 客戶端與服務器通過 HTTP 協議進行通信,利用 SSE 實現服務器向客戶端的實時數據推送,同樣使用 JSON-RPC 2.0 格式的消息進行交互。
平常通過標準的輸入輸出通信,但是可能有些環境本地是沒有的,就算有我們也需要自己實現。
所以如果有別人封裝好的 SSE 的 Server,我們就可以直接調用了。
FastAPI
FastAPI 是一個用于構建 API 的現代化、高性能的 Python Web 框架。
https://fastapi.tiangolo.com/
該項目的特性:
● 高性能:得益于 Starlette 和 Pydantic 的支持,FastAPI 的性能可與 NodeJS 和 Go 相媲美,是最快的 Python Web 框架之一。
● 高效編碼:通過自動生成交互式 API 文檔、數據驗證和序列化等功能,開發效率可提高約 200% 至 300%。
● 減少錯誤:利用標準的 Python 類型提示,減少約 40% 的人為錯誤,并提供出色的編輯器支持,如自動補全和類型檢查,降低調試時間。
● 自動生成文檔:FastAPI 自動為您的 API 生成交互式文檔,支持 Swagger UI 和 ReDoc,方便測試和使用。
FastAPI-MCP
將 FastAPI + MCP 組合起來,可以快速實現 SSE:
- https://github.com/tadata-org/fastapi_mcp
兩這結合后:
● 直接集成:直接將 MCP 服務器掛載到您的 FastAPI 應用中。
● 無需配置:只需指向您的 FastAPI 應用即可運行,無需額外配置。
● 自動發現并轉換:自動發現所有 FastAPI 的端點,并將其轉換為 MCP 工具。
● 保留模式:保留您的請求模型和響應模型的模式。
● 保留文檔:保留所有端點的文檔,與 Swagger 中的保持一致。
● 擴展功能:除了自動生成的工具外,還可添加自定義的 MCP 工具。
安裝配置
默認你已經配置好了 uv,如果沒有用pip也可以。
uv init fastapimcp
cd fastapimcpuv venv
source .venv/bin/activateuv add fastapi-mcp
對應的結果如下所示:
測試服務端
回顧之前
我們上次在 MCP 中寫了一個 Client 和 Server,這里進行改寫。
放一段上次的 Server 代碼,幫助你回憶,這里的代碼我們不動:
編寫代碼
我們修改 main.py,寫入如下的內容:
from fastapi import FastAPI
from fastapi_mcp import add_mcp_serverapp = FastAPI()mcp_server = add_mcp_server(app,# 路徑mount_path="/now",# 名字name="wzk-icu API MCP",
)# 編寫一個獲取時間戳的服務
@mcp_server.tool()
async def get_server_time() -> str:"""獲取服務器當前時間"""from datetime import datetimereturn datetime.now().isoformat()if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)
如下所示:
啟動測試
# 當前在 fastapimcp 目錄下
python main.py
效果如下:
我們直接訪問:
http://127.0.0.1:8000/now
可以看到標準的訪問格式: