Skip to content
🔗 分享本题
查看我的学习进度 →

FastMCP开发生产级MCP Server图解

🧠 图解记忆: 框架让注册能力很快,生产质量取决于校验、权限、超时和可观测性。

💡 答案要点

FastMCP = 最流行的Python MCP Server开发框架

安装:

bash
pip install fastmcp

最小示例(20行代码):

展开 Python 代码示例(38 行)
python
# server.py
from fastmcp import FastMCP

# 创建MCP Server
mcp = FastMCP("我的第一个MCP服务器")

# 注册工具
@mcp.tool()
def get_weather(city: str) -> dict:
    """查询城市天气"""
    # 实际调用天气API
    weather_data = call_weather_api(city)
    return {
        "city": city,
        "temperature": weather_data["temp"],
        "condition": weather_data["condition"]
    }

@mcp.tool()
def calculate(order_amount: float, discount: float = 0.0) -> dict:
    """计算订单最终价格"""
    final_price = order_amount * (1 - discount)
    return {
        "original": order_amount,
        "discount": discount,
        "final": round(final_price, 2)
    }

# 注册资源
@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
    """读取用户资料"""
    profile = load_from_database(user_id)
    return json.dumps(profile)

# 启动服务器
if __name__ == "__main__":
    mcp.run()

工具定义详细参数:

python
@mcp.tool(
    name="search_products",           # 工具名(唯一标识)
    description="搜索商品列表",       # 描述(AI用于理解工具用途)
    annotations={                     # 额外元信息
        "readOnlyHint": True,         # 只读工具(不修改数据)
        "idempotentHint": True,       # 幂等工具(可安全重试)
    }
)
def search_products(
    keyword: str,                    # 必选参数
    category: str = "all",           # 可选参数(带默认值)
    min_price: float | None = None,  # 可选参数(可选类型)
    limit: int = 10                 # 可选参数(默认10)
) -> list[dict]:
    """搜索商品的完整实现"""
    query = build_search_query(keyword, category, min_price)
    results = database.execute(query).fetchmany(limit)
    return [{"id": r[0], "name": r[1], "price": r[2]} for r in results]

资源定义:

python
@mcp.resource(
    "orders://{order_id}",           # URI模板
    mime_type="application/json"      # MIME类型
)
def get_order(order_id: str) -> str:
    """获取订单详情"""
    order = db.query("SELECT * FROM orders WHERE id = ?", order_id)
    return json.dumps(order)

@mcp.resource(
    "config://app",                 # 静态资源
    name="AppConfig",                # 资源名
    description="应用配置信息"
)
def get_config() -> str:
    """返回应用配置"""
    return json.dumps(APP_CONFIG)

Prompts(提示模板):

python
@mcp.prompt(
    name="code_review",
    description="代码审查模板"
)
def code_review_prompt(
    language: str,
    code: str,
    focus: str = "security"
) -> str:
    """生成代码审查Prompt"""
    return f"""请审查以下{language}代码,重点关注{focus}问题:

```{language}
{code}

审查要求:

  1. 找出潜在Bug
  2. 提出改进建议
  3. 给出安全评估(如果是安全审查)"""

**运行和测试:**

```bash
# 方式1:命令行运行
python server.py

# 方式2:stdio模式(供Claude Code使用)
python server.py --stdio

# 方式3:测试模式
fastmcp dev server.py  # 热重载开发模式

Claude Code中配置:

json
// .claude/mcp.json
{
  "mcpServers": {
    "my-weather-server": {
      "command": "python",
      "args": ["/path/to/server.py", "--stdio"],
      "env": {
        "API_KEY": "your-api-key"
      }
    }
  }
}

面试话术:

"我用FastMCP开发过企业内部MCP Server,核心就是三步:1)@mcp.tool()装饰器注册工具;2)@mcp.resource()装饰器注册资源;3)@mcp.prompt()装饰器注册Prompt模板。20行代码能跑一个可用Server,但生产环境要注意错误处理、日志记录、超时控制这些。Claude Code里配置mcp.json就能直接用,数据全程不离开本地,安全性很好。"

📚 参考:FastMCP(Python MCP Server 框架) · MCP Python SDK(官方)