你的位置:意昂体育 > 新闻动态 >

Python 程序员必看!FastAPI-MCP 神器上手指南

2025-08-28 新闻动态 63

作为天天和 API 打交道的 Python 开发者,最近挖到一个宝藏开源项目——FastAPI MCP!简直是懒人福音,今天手把手教你用它提升开发效率 10 倍 ✨

✨ 功能亮点速览

为什么说它是神器?这几个功能直接戳中痛点!

🔒 内置认证系统:无需手动写 JWT/Token,开箱即用的安全防护

⚙️ 零配置启动:一行代码挂载,省去复杂配置步骤

📌 保留模式:自动保留 FastAPI 原生特性,学习成本几乎为 0

📚 自动生成文档:自带 Swagger UI 和 ReDoc,API 调试超方便

🔄 动态热更新:新增接口无需重启服务,实时同步到工具列表

📝 3 步快速上手

1️⃣ 安装依赖

pip install fastapi fastapi-mcp uvicorn

# 或使用更快的 uv 包管理器

uv add fastapi fastapi-mcp uvicorn

(记得用 Python 3.8+ 环境哦~)

2️⃣ 基础代码示例

新建 main.py,复制这段极简代码:

from fastapi import FastAPI

from fastapi_mcp import FastApiMCP

# 创建 FastAPI 实例

app = FastAPI(title="My MCP API")

# 挂载 MCP 服务器(核心步骤!)

mcp = FastApiMCP(

app,

name="My First MCP Server",

description="A demo server for FastAPI-MCP",

base_url="http://localhost:8000" # 强烈建议显式指定基础URL

)

mcp.mount() # 默认挂载到 /mcp 路径

# 定义一个测试路由

@app.get("/", operation_id="read_root") # 显式指定 operation_id 便于 AI 识别

def read_root():

return {"message": "Hello FastAPI MCP! 🎉"}

# 启动服务器

if __name__ == "__main__":

import uvicorn

uvicorn.run("main:app", reload=True)

3️⃣ 启动服务

python main.py

访问 http://localhost:8000/docs,就能看到自动生成的 Swagger 文档啦!🚀

访问 http://localhost:8000/mcp,可查看 MCP 服务状态页

🔐 认证系统详解

基础 Token 认证

from fastapi import Header, HTTPException

from fastapi_mcp import FastApiMCP, AuthConfig

# 自定义认证依赖

async def verify_token(authorization: str = Header(None)):

valid_tokens = {"SECRET_TOKEN_123"} # 实际项目中从环境变量读取

if authorization not in valid_tokens:

raise HTTPException(status_code=403, detail="Invalid token")

return True

# 配置带认证的 MCP 服务器

mcp = FastApiMCP(

app,

auth_config=AuthConfig(

dependencies=[verify_token] # 注入认证依赖

)

)

OAuth2 集成(以 Auth0 为例)

# 安装额外依赖

# pip install python-jose[cryptography] python-multipart

from fastapi.security import OAuth2PasswordBearer

from jose import JWTError, jwt

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def verify_oauth_token(token: str = Depends(oauth2_scheme)):

try:

payload = jwt.decode(

token,

SECRET_KEY,

algorithms=[ALGORITHM],

audience=API_AUDIENCE,

issuer=ISSUER

)

return payload

except JWTError:

raise HTTPException(status_code=401, detail="Invalid credentials")

⚙️ 高级配置指南

接口筛选与管理

通过 operation_id 或标签精确控制暴露的接口:

# 仅暴露指定 operation_id 的接口

mcp = FastApiMCP(

app,

include_operations=["get_user", "create_item"] # 白名单模式

)

# 按标签筛选接口

mcp = FastApiMCP(

app,

include_tags=["public", "users"] # 仅包含带这些标签的接口

)

自定义工具名称与描述

@app.get("/users/{user_id}",

operation_id="get_user_info", # 工具名称将使用此 ID

description="获取用户详细信息,支持通过 ID 查询特定用户")

async def read_user(user_id: int):

return {"user_id": user_id, "name": "John Doe"}

独立部署模式

如需将 MCP 服务独立部署(不与 HTTP 服务共用端口):

# main.py

if __name__ == "__main__":

# 仅启动 MCP 服务,不提供 HTTP 接口

mcp.run(mode="standalone", port=9000)

💼 实际项目案例

案例 1:谷歌图片搜索 MCP 服务

from fastapi import HTTPException

from pydantic import BaseModel

import requests

# 定义请求模型

class ImageSearchRequest(BaseModel):

keyword: str

num: int = 5

# 谷歌图片搜索接口

@app.post("/search/images", operation_id="search_google_images")

async def search_images(req: ImageSearchRequest):\n # 实际项目中替换为真实 API 调用

return {\n "images": [\n {"url": f"https://example.com/{req.keyword}_{i}.jpg", "title": f"{req.keyword} image {i}"} \n for i in range(req.num)\n ]\n }

启动后在 Cherry Studio 等 MCP 客户端中配置 http://localhost:8000/mcp,即可让 AI 直接调用图片搜索功能!

案例 2:数据库查询工具集成

from sqlalchemy.orm import Session

from fastapi import Depends

# 数据库依赖

def get_db():

db = SessionLocal()

try:

yield db

finally:

db.close()

# 暴露数据库查询工具

@app.get("/db/query", operation_id="query_database")

async def query_db(sql: str, db: Session = Depends(get_db)):

try:

result = db.execute(sql).fetchall()

return {"columns": result.keys(), "data": result}

except Exception as e:

raise HTTPException(status_code=400, detail=str(e))

⚡ 性能优化技巧

1. 使用异步依赖提升并发

from fastapi import Depends

import httpx

# 异步 HTTP 客户端依赖

async def get_async_client():

async with httpx.AsyncClient() as client:

yield client

@app.get("/external_data", operation_id="fetch_external_data")

async def fetch_data(client: httpx.AsyncClient = Depends(get_async_client)):

response = await client.get("https://api.example.com/data")

return response.json()

2. 结果缓存减少重复计算

from functools import lru_cache

@lru_cache(maxsize=128)

def expensive_calculation(param: int):

# 模拟耗时计算

return param * 42

@app.get("/calculate", operation_id="calculate_value")

async def calculate(param: int):

return {"result": expensive_calculation(param)}

❗ 常见问题与解决方案

问题 1:初始化未完成时收到请求

错误提示:RuntimeError: Received request before initialization was complete

解决方法:升级依赖并添加初始化完成检查

pip install -U fastapi-mcp

问题 2:工具名称过长导致 400 错误

原因:自动生成的 operation_id 可能超过 64 字符限制

解决方法:显式指定简洁的 operation_id(如上文案例所示)

问题 3:客户端无法发现新增接口

解决方法:调用刷新方法更新工具列表

# 新增接口后执行

mcp.setup_server() # 动态更新服务目录

🚀 使用感受分享

作为用过十几个 FastAPI 扩展的开发者,表示 MCP 最打动我的是 「零侵入性」——既保留了 FastAPI 的简洁优雅✨,又补充了企业级开发必备功能🔒。特别是动态热更新和灵活的权限控制,让我们团队的 AI 工具化改造效率提升了 300%!

适合从小项目快速迭代到生产环境,强烈推荐给追求效率的你!

注:此字段内容整理自 FastAPI-MCP GitHub 项目文档(https://github.com/taorg/fastapi_mcp)

话题标签