Model Context Protocol (MCP) 這個協議簡單説就是給大語言模型接入外部數據和工具提供了一套標準化方案。MCP 統一了模型和各種數據源、工具服務之間的交互方式。
FastMCP 是目前用 Python 構建 MCP 服務器最順手的框架,把底層那些複雜的協議實現全都封裝好了,開發者只需要關注業務邏輯就行。
這篇文章會講清楚 MCP 的基本概念,FastMCP 的工作原理,以及怎麼從零開始寫一個能跑的 MCP 服務器。
MCP 協議解析
MCP 本質上是個標準協議,讓語言模型能安全、一致地和外部系統對話。和傳統 API 不太一樣的是MCP 是專門為大語言模型設計的。
一個 MCP 服務器主要提供三類能力:
把數據暴露成資源(resources),功能上類似 REST API 的 GET 請求。提供可執行的工具(tools),對標 POST 類的操作接口。定義提示模板(prompts),用來規範模型和數據、用户的交互方式。
如果你有開發經驗可以理解為MCP的每一個“能力”其實就是一個 可遠程調用的函數(tool)。只要你能和 MCP Server 建立通信(通常通過 WebSocket、Stdio 或 HTTP RPC),你就可以像調用 REST API 一樣調用 MCP 的函數。只不過MCP 的「函數」並不是像 Python RPC 那樣“自動調用”,它還需要定義 Schema(輸入輸出結構)+ 元信息(描述),告訴大語言模型 怎麼用、什麼時候用、怎麼傳參數。
為什麼選 FastMCP
官方 SDK 當然也能實現 MCP 服務器,但 FastMCP 提供的東西更多。可以説是一個生產級框架,內置了企業身份認證、客户端庫、測試工具,還能自動生成 API 文檔。
FastMCP 可以很方便地和 Google、GitHub、Azure 這些平台集成,支持部署到雲端或者私有化環境。更重要的是開發體驗相當友好,幾行代碼就能跑起來一個完整服務。
動手搭建第一個服務器
先裝好 FastMCP,推薦用 uv 這個工具,依賴管理比 pip 效率高:
uv pip install fastmcp
每個 MCP 服務器都從
FastMCP
類開始初始化。這個類管理着工具、資源和提示模板。我們先寫個最簡單的加法服務器。
新建
server.py
文件:
from fastmcp import FastMCP
mcp = FastMCP("Demo Server 🚀")
@mcp.tool
def add(a: int, b: int) -> int:
"""Add two numbers and return the result"""
return a + b
if __name__ == "__main__":
mcp.run()
就這麼多代碼,一個功能完整的 MCP 服務器就寫好了。客户端調用
add
工具時,服務器會執行加法運算並返回結果。
本地運行很簡單
fastmcp run server.py
這個命令會啓動 MCP 服務器。如果要做 Web 部署,可以用 HTTP 或 SSE 傳輸:
mcp.run(transport="http", host="127.0.0.1", port=8000, path="/mcp")
服務跑起來以後,客户端就能遠程調用工具了。
擴展更多工具
FastMCP 的工具就是普通 Python 函數加個
@mcp.tool
裝飾器。想加多少加多少,比如再來個乘法:
@mcp.tool
def multiply(a: float, b: float) ->float:
"""Multiply two numbers"""
returna*b
重啓服務器後客户端就能同時用
add
和
multiply
了。
FastMCP 會根據函數簽名和 docstring 自動生成 schema,客户端可以直接理解你的 API 結構。
添加資源接口
資源在 MCP 裏代表只讀數據,可以是靜態的也可以帶參數動態生成。比如暴露個版本號或者用户資料:
@mcp.resource("config://version")
def get_version():
return "1.0.0"
@mcp.resource("user://{user_id}/profile")
def get_profile(user_id: int):
return {"name": f"User {user_id}", "status": "active"}
第一個資源返回固定版本號,第二個根據傳入的 user_id 動態返回用户信息。
Context 上下文使用
FastMCP 允許在工具、資源或提示裏通過
ctx: Context
參數訪問會話上下文。這個上下文提供了日誌、LLM 採樣、進度追蹤、資源訪問等能力。
看個實際例子:
from fastmcp import Context
@mcp.tool
async def summarize(uri: str, ctx: Context):
await ctx.info(f"Reading resource from {uri}")
data = await ctx.read_resource(uri)
summary = await ctx.sample(f"Summarize this: {data.content[:500]}")
return summary.text
上面代碼先記錄一條日誌然後讀取資源內容,最後讓客户端的 LLM 生成摘要。有了 Context工具的交互性和智能程度會高很多。
客户端連接方式
服務器跑起來後,用
fastmcp.Client
就能連接。支持 STDIO、HTTP、SSE 等方式,測試時甚至可以跑內存模式。
from fastmcp import Client
import asyncio
async def main():
async with Client("server.py") as client:
tools = await client.list_tools()
print("Available tools:", tools)
result = await client.call_tool("add", {"a": 5, "b": 7})
print("Result:", result.content[0].text)
asyncio.run(main())
還可以用標準 MCP 配置文件連多個服務器,構建複雜的多服務交互系統。
身份認證配置
生產環境肯定要考慮安全問題。FastMCP 內置支持 Google、GitHub、Azure、Auth0、WorkOS 這些企業級認證服務商。啓用 OAuth 認證只需要幾行配置:
from fastmcp.server.auth.providers.google import GoogleProvider
from fastmcp import FastMCP
auth = GoogleProvider(client_id="...", client_secret="...", base_url="https://myserver.com")
mcp = FastMCP("Secure Server", auth=auth)
這樣就只有通過認證的用户能訪問服務了。客户端側用 OAuth 流程連接:
async with Client("https://secure-server.com/mcp", auth="oauth") as client:
result = await client.call_tool("protected_tool")
Token 管理、刷新、錯誤處理這些 FastMCP 都自動搞定了,我們不用寫複雜的代碼,只考慮實現我們的工具功能就可以了
部署方案
FastMCP 服務器部署很靈活。測試階段
fastmcp run
命令足夠用。生產環境可以部署到 FastMCP Cloud,它提供現成的 HTTPS 端點和認證服務。
如果想自己託管的話,也可以用 HTTP 或 SSE 傳輸從自己的服務器提供服務:
mcp.run(transport="http", host="0.0.0.0", port=8080)
部署完就能和語言模型、Web 客户端或者自動化工作流對接了。
接入 LLM 應用
服務器部署好之後,下一步是把它接到大語言模型上。這樣 LLM 就能安全地調用服務器函數、讀取資源、在對話中執行各種操作。
首先要定義 MCP 配置文件,列出可用的服務器、連接方式、認證需求這些信息。配置完成後 LLM 能自動發現 MCP 工具並按需調用。
假設服務器暴露了
add
或
summarize
工具,模型就能像調用內置功能一樣使用它們。聊天場景下,用户説"總結下最新那篇文章",LLM 會自動調
summarize
工具,處理完結果再回復。
如果用 OpenAI Assistants API 或者 LangChain 這類框架開發應用,可以把 MCP 服務器註冊成外部工具。LLM 通過 MCP 客户端庫和它交互。
from fastmcp import Client
from openai import OpenAI
import asyncio
async def main():
# Connect to your MCP server
async with Client("http://localhost:8000/mcp") as client:
# Call an MCP tool directly
result = await client.call_tool("add", {"a": 10, "b": 5})
print("MCP Result:", result.content[0].text)
# Use the result inside an LLM prompt
llm = OpenAI(api_key="YOUR_KEY")
response = llm.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are an AI assistant using MCP tools."},
{"role": "user", "content": f"The sum of 10 and 5 is {result.content[0].text}. Explain how MCP helps with this integration."}
]
)
print(response.choices[0].message.content)
asyncio.run(main())
這樣LLM 的推理能力和服務器邏輯可以無縫結合。它用 MCP 客户端獲取數據或執行計算,然後把輸出融入對話或工作流。
這個思路能讓 AI 系統超越靜態提示的限制。把 LLM 連到真實數據庫、API、自動化工具上,它就變成了能讀寫、能執行的主動 agent。
總結
FastMCP 讓 AI 和真實世界的數據、API、工具對接變得相當簡單。幾行 Python 代碼就能搭起來功能完整的 MCP 服務器,對接語言模型、自動化工作流,安全地處理實際業務邏輯。
無論是做原型驗證還是構建企業級系統,FastMCP 都提供了一條從想法到落地的快速路徑。裝上試試,起個服務跑跑,看看 MCP 能給 AI 集成帶來什麼新玩法。
https://avoid.overfit.cn/post/381e204d3caf43edb11439d93c377cf0
作者:Manish Shivanandhan