FastAPI-MCP 零配置网关:三步接入
【免费下载链接】fastapi_mcpExpose your FastAPI endpoints as Model Context Protocol (MCP) tools, with Auth!项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi_mcp
你手里有 users、orders、inventory 三个 FastAPI 服务,现在要让 AI Agent 直接查询和调用它们。fastapi-mcp就是干这件事的:它把 FastAPI 转 MCP,一行工具描述代码都不用写,相当于给你的现有 API 套了一层零配置 MCP 网关。这篇按这条部署链路走一遍,从第一个工具跑通,到生产上的细节。
手写 MCP Server 和一行代码的区别
MCP(Model Context Protocol)是大模型调用外部工具的开放协议:服务端暴露一份工具清单,客户端(Cursor、Claude Desktop 这类)按 schema 发现并调用它们。
如果手写 Server,你要做三件事:逐个端点写描述、手写参数 schema、单独搭认证。fastapi-mcp 把这些都跳过了:
| 维度 | 手写 MCP Server | fastapi-mcp |
|---|---|---|
| 工具生成 | 逐个端点手写 | 自动扫描 FastAPI 应用 |
| 参数 schema | 手写 inputSchema | 直接复用 Pydantic 模型 |
| 文档与描述 | 手敲 | 保留 Swagger 原有描述 |
| 鉴权 | 自己搭 | 复用 FastAPIDepends() |
核心就一行:FastApiMCP(app)。
装包并跑通第一个工具
安装依赖(也支持 pip:pip install fastapi-mcp),细节见安装指南:
uv add fastapi-mcp紧接着在已有app实例的文件里追加三行,挂上 HTTP 传输:
from fastapi_mcp import FastApiMCP mcp = FastApiMCP(app) mcp.mount_http()用uvicorn yourapp:app --port 8000启动后,MCP 服务就在http://localhost:8000/mcp监听。客户端连上去,你应该能看到自己的业务端点被列成工具,参数描述和 Swagger 里一致。
Q:上线后再加新端点,工具会不会缺失?A:挂载那一刻生成的是工具快照,新增端点后要调
mcp.setup_server()重新扫描,说明见刷新文档。
传输的两种挂法
FastAPI-MCP 提供两种挂载,对应 MCP 两代规范:
mcp.mount_http() # 默认路径 /mcp,新版 Streamable HTTP 规范 mcp.mount_sse() # 默认路径 /sse,旧规范,兼容老客户端新项目推荐 HTTP,因为 SSE 依赖长连接推送,断线重连时客户端要重新建连,服务端的会话状态管理也更弱;HTTP 传输行为更接近无状态请求,配合负载均衡更好处理。
想挂到子路径就传一个APIRouter:
router = APIRouter(prefix="/api/v1") mcp.mount_http(router, mount_path="/my-mcp") app.include_router(router)最终地址变成http://localhost:8000/api/v1/my-mcp。完整路由示例见 examples/06_custom_mcp_router_example.py,两种传输的规范差异见传输文档。
同进程集成,还是拆独立网关
最省事的做法是集成:MCP 和业务 API 共用一个进程,鉴权依赖与发布流水线都复用。三个服务这种场景下,如果 Agent 只需要一个入口,就拆出独立网关:
from fastapi import FastAPI mcp = FastApiMCP(items_api) # 业务应用只作为工具来源 mcp_app = FastAPI() mcp.mount_http(mcp_app) # 挂到另一个应用上两个进程分别起:
uvicorn main:items_api --port 8001 # 业务服务 uvicorn main:mcp_app --port 8000 # MCP 网关启动后 8001 是业务 API,8000 是 MCP 网关:
独立形式的收益:网关可以脱离业务服务独立扩缩容、重启;网关进程本身不再暴露业务 API,Agent 只能走 MCP 这一层。完整可运行版本在 examples/04_separate_server_example.py,更多部署形态见部署文档。
客户端 JSON 怎么填,鉴权头怎么传
主流客户端的配置格式基本一致:
{ "mcpServers": { "fastapi-mcp": { "url": "http://mcp-gateway:8000/mcp" } } }SSE 版把 url 换成/sse即可,其余不动。
端点上有Depends()鉴权时,客户端得带上令牌。多数客户端不原生支持认证流程,常见做法是用npx mcp-remote做桥接,加--header参数把令牌透传过去;也可以在FastApiMCP里传入AuthConfig,让网关层直接拒掉未授权的请求。令牌透传写法看认证示例,完整 OAuth 2 流程见认证文档。
生产环境容易踩的坑
- 加了端点记得
setup_server():工具是快照生成的,漏了重扫,Agent 看不到新工具。 - 负载均衡与会话:HTTP 传输更适合多实例部署,启用会话时按会话标识头把同一会话路由到同一实例;SSE 长连接容易被 LB 的空闲超时掐断,生产上能避就避。
- 协议层:HTTPS 交给反向代理终结,网关前面配限流,防止被恶意刷。
Q:客户端只支持旧版 SSE 规范怎么办?A:
mount_http换成mount_sse,其余配置不变。Q:多个后端服务需要服务发现吗?A:目前静态配置,网关启动时写死后端地址即可;不同版本放到不同 URL 前缀下,各挂一个独立网关。
下一步就一件事:挑一个在跑的 FastAPI 项目执行uv add fastapi-mcp,在app旁边加上mcp = FastApiMCP(app)和mcp.mount_http(),把客户端指到http://localhost:8000/mcp验证工具列表。
【免费下载链接】fastapi_mcpExpose your FastAPI endpoints as Model Context Protocol (MCP) tools, with Auth!项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi_mcp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考