FastMCP 🚀
用 Python 快速构建 MCP 服务器
Model Context Protocol (MCP) 服务器是一种新型的标准化方式,可以为你的 LLM 提供上下文和工具。FastMCP 让构建 MCP 服务器变得简单直观。通过简洁的 Python 代码,你可以创建工具、暴露资源并定义提示:
# demo.py
from fastmcp import FastMCP
mcp = FastMCP("Demo 🚀")
@mcp.tool()
def add(a: int, b: int) -> int:
"""将两个数字相加"""
return a + b
就是这么简单!通过运行以下命令,将服务器安装到 Claude 中:
fastmcp install demo.py
FastMCP 会自动处理所有复杂的协议细节和服务器管理工作,让你专注于构建优秀的工具。它设计为高级且 Pythonic,大多数情况下,只需为函数添加装饰器即可。
核心特性:
- 快速:高级接口,代码更少,开发更快
- 简洁:使用最少的样板代码构建 MCP 服务器
- Pythonic:符合 Python 开发者习惯
- 完整:FastMCP 旨在全面实现 MCP 核心规范
🚨 🚧 🏗️ FastMCP 仍在积极开发中,MCP 规范本身也在不断演进。核心功能已可用,但某些高级功能仍在开发中。
📦 安装
我们强烈推荐使用 uv 安装 FastMCP,因为部署服务器时需要用到它:
uv pip install fastmcp
注意:在 macOS 上,你可能需要使用 Homebrew 安装 uv 才能让 Claude Desktop 应用检测到它:
brew install uv
如果仅使用 SDK 而不进行部署,可以使用 pip:
pip install fastmcp
⚡ 快速上手
创建一个简单的 MCP 服务器,暴露计算工具和数据资源:
# server.py
from fastmcp import FastMCP
# 创建 MCP 服务器
mcp = FastMCP("Demo")
# 添加加法工具
@mcp.tool()
def add(a: int, b: int) -> int:
"""将两个数字相加"""
return a + b
# 添加动态问候资源
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""生成个性化问候语"""
return f"Hello, {name}!"
运行以下命令,将服务器安装到 Claude Desktop,立即与其交互:
fastmcp install server.py
或使用 MCP Inspector 进行测试:
fastmcp dev server.py
🔥 MCP 是什么?
Model Context Protocol (MCP) 是一种标准协议,能够以安全、标准化的方式向 LLM 应用程序暴露数据和功能。你可以将其视为专为 LLM 交互设计的 Web API。
MCP 服务器可以:
- 通过 资源 (Resources) 暴露数据(类似于 REST API 的 GET 端点)
- 通过 工具 (Tools) 提供功能(类似于 POST 端点,可执行代码或产生副作用)
- 通过 提示 (Prompts) 定义交互模板(可复用的 LLM 提示模式)
- 更多功能即将推出!
尽管 MCP 官方提供了低级别的 Python SDK,但 FastMCP 提供了更高级、更 Pythonic 的接口,简化了开发。
🛠️ 核心概念
服务器
FastMCP 服务器是你与 MCP 协议交互的核心接口。它负责:
- 连接管理
- 协议合规
- 消息路由
示例:
from fastmcp import FastMCP
# 创建命名服务器
mcp = FastMCP("My App")
# 指定依赖项(用于部署)
mcp = FastMCP("My App", dependencies=["pandas", "numpy"])
资源
资源用于向 LLM 暴露数据,类似于 REST API 中的 GET 端点。资源应仅用于数据提供,不应执行复杂计算或产生副作用。
静态资源:
@mcp.resource("config://app")
def get_config() -> str:
"""返回静态配置数据"""
return "App 配置内容"
带参数的动态资源:
@mcp.resource("users://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
"""获取用户信息"""
return f"用户 {user_id} 的个人资料"
工具
工具允许 LLM 调用服务器执行操作,类似于 REST API 中的 POST 端点。它们通常用于计算或产生副作用。
简单计算:
@mcp.tool()
def calculate_bmi(weight_kg: float, height_m: float) -> float:
"""计算 BMI"""
return weight_kg / (height_m ** 2)
异步请求:
import httpx
@mcp.tool()
async def fetch_weather(city: str) -> str:
"""获取城市天气信息"""
async with httpx.AsyncClient() as client:
response = await client.get(f"https://api.weather.com/{city}")
return response.text
复杂数据结构:
from pydantic import BaseModel, Field
from typing import Annotated
class ShrimpTank(BaseModel):
class Shrimp(BaseModel):
name: Annotated[str, Field(max_length=10)]
shrimp: list[Shrimp]
@mcp.tool()
def name_shrimp(
tank: ShrimpTank,
extra_names: Annotated[list[str], Field(max_length=10)],
) -> list[str]:
"""列出水族箱中所有虾的名字"""
return [shrimp.name for shrimp in tank.shrimp] + extra_names
提示
提示是一种可复用模板,帮助 LLM 与服务器交互。类似于“最佳实践”封装到服务器中。
简单提示:
@mcp.prompt()
def review_code(code: str) -> str:
return f"请审查这段代码:\n\n{code}"
结构化消息:
from fastmcp.prompts.base import UserMessage, AssistantMessage
@mcp.prompt()
def debug_error(error: str) -> list[Message]:
return [
UserMessage("我遇到了这个错误:"),
UserMessage(error),
AssistantMessage("让我来帮你调试。你尝试过哪些方法?")
]
🚀 运行服务器
开发模式:
fastmcp dev server.py
Claude 集成:
fastmcp install server.py
直接运行:
python server.py
💡 示例
回声服务器
from fastmcp import FastMCP
mcp = FastMCP("Echo")
@mcp.resource("echo://{message}")
def echo_resource(message: str) -> str:
return f"资源回显:{message}"
@mcp.tool()
def echo_tool(message: str) -> str:
return f"工具回显:{message}"
SQLite 探索器
from fastmcp import FastMCP
import sqlite3
mcp = FastMCP("SQLite Explorer")
@mcp.resource("schema://main")
def get_schema() -> str:
conn = sqlite3.connect("database.db")
schema = conn.execute("SELECT sql FROM sqlite_master").fetchall()
return "\n".join(sql[0] for sql in schema if sql[0])
✅ 完成!如需更多示例或贡献代码,欢迎访问 FastMCP GitHub。