news 2026/9/14 13:49:34

三步搭出零配置MCP网关:FastAPI分布式部署实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
三步搭出零配置MCP网关:FastAPI分布式部署实战

三步搭出零配置MCP网关:FastAPI分布式部署实战

【免费下载链接】fastapi_mcpExpose your FastAPI endpoints as Model Context Protocol (MCP) tools, with Auth!项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi_mcp

3 个 FastAPI 服务,0 行胶水代码:FastAPI-MCP 会把每个端点自动转成 MCP 工具,把整套服务暴露成零配置的 MCP 网关,接管微服务通信的最后一公里。下面从装包到独立网关本地跑通,全程照着做即可。

5分钟跑通第一个MCP网关

先确认环境:Python 3.8 以上,FastAPI 0.100.0 以上。装包一条命令:

uv add fastapi-mcp # 或 pip install fastapi-mcp

然后是完整的最小可运行示例:

from fastapi import FastAPI from fastapi_mcp import FastApiMCP app = FastAPI(title="商品服务") @app.get("/items/{item_id}") async def read_item(item_id: int, q: str | None = None): return {"item_id": item_id, "q": q} mcp = FastApiMCP(app) # 读完 OpenAPI,端点逐个变成 MCP 工具 mcp.mount_http() # 挂到默认路径 /mcp if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)

启动后用 MCP Inspector 验证:另开终端执行npx @modelcontextprotocol/inspector,地址填http://127.0.0.1:8000/mcp,Tools 面板点 List Tools,能看到read_item就说明链路通了。

从写完FastApiMCP(app)那一刻起,所有接口都已是 MCP 工具,你一行包装代码都不用写。

MCP网关在系统里的位置:三种部署模式对比

部署模式做法适合场景
单进程内嵌mount_http()不传参,网关与业务同进程单服务、快速验证
独立网关FastApiMCP(业务app)mount_http(mcp_app),挂到新建的空应用上聚合多个业务服务,业务 HTTP 接口不再直接对外
多实例 + 负载均衡独立网关起多份,前面挂负载均衡器生产环境高可用

独立模式有两个值得注意的细节。第一,默认情况下网关进程内通过 ASGI 直接调用业务应用的路由,不走网络往返,所以"分开部署"指的是分开两个 FastAPI 应用、分开两份配置,而不是必须拆成两台机器。第二,业务应用的原始 HTTP 接口不会随网关一起暴露出去,外部只能经 MCP 协议访问。完整写法见 独立部署示例。

需要真正跨机器调用远端服务时,给FastApiMCP传一个设置了base_urlhttpx.AsyncClient,调用就会走真实网络。

SSE还是HTTP:一张表选明白

对比项mount_http()mount_sse()
协议规范MCP Streamable HTTP(最新)SSE(旧版)
默认挂载路径/mcp/sse
会话管理支持可选会话,连接处理更健壮长连接事件流
适合客户端新版客户端,或mcp-remote桥接只支持 SSE 的旧客户端

新项目直接选 HTTP;只有需要兼容旧客户端时才上 SSE。

挂载路径也可以自定义,挂到APIRouter上时mount_path会接在 router 的 prefix 后面:

from fastapi import APIRouter router = APIRouter(prefix="/api/v1") mcp.mount_http(router, mount_path="/my-mcp") # 最终路径 /api/v1/my-mcp app.include_router(router)

客户端怎么接:两套JSON配置

主流 MCP 客户端(Claude Desktop、Cursor、Windsurf 等)用同一套mcpServers格式,只改 URL。HTTP 传输:

{ "mcpServers": { "fastapi-mcp": { "url": "http://localhost:8000/mcp" } } }

SSE 传输把 URL 换成/sse

{ "mcpServers": { "fastapi-mcp": { "url": "http://localhost:8000/sse" } } }

客户端只支持 stdio、或需要走 OAuth 流程时,用npx mcp-remote做桥接,具体写法见 快速入门 里的 mcp-remote 一节。

MCP网关生产部署检查清单

  • 启用 OAuth 认证:构造AuthConfig传入FastApiMCP,字段含义见 认证文档;网关默认会把authorization头转发给业务接口,token 透传写法参考 Token 透传示例
  • 前置 HTTPS 终结:把 TLS 交给网关前面的反向代理,网关实例之间走内网
  • 配置请求限流:在负载均衡器或反向代理层按来源限流,挡住异常放大
  • 接入指标与日志:Prometheus 采集网关指标,日志格式复用examples/shared/setup.py里的setup_logging()
  • 处理会话粘连:HTTP 传输按会话管理连接,多实例部署时给负载均衡器开启粘滞路由

容易踩的坑:4个常见误区

  1. 误区:mount 之后再补端点,以为会自动注册。工具列表在FastApiMCP(...)构造时一次性生成,之后不会跟着路由表更新。正解:把端点定义全部放在构造调用之前;确需后补的,调用mcp.setup_server()重建,见 工具重注册示例。
  2. 误区:以为网关能自动发现远端微服务。它只读取你传入的那个应用,默认还是进程内调用。正解:跨机器时在构造参数里注入带base_urlhttpx.AsyncClient
  3. 误区:客户端 URL 与挂载路径不一致。HTTP 默认/mcp、SSE 默认/sse,走APIRouter时 prefix 也是路径的一部分。正解:客户端url填完整最终路径,与网关日志里打印的监听路径逐字对齐。
  4. 误区:慢接口照跑不误。内置 HTTP 客户端超时偏短,长耗时接口会被掐断。正解:注入自定义客户端调超时,见 超时配置示例。

继续深入

  • 快速入门:从零到客户端连通的完整流程,含 mcp-remote 用法
  • 认证配置:AuthConfig字段与 OAuth 代理的完整说明
  • 部署指南:更多生产部署场景
  • 贡献指南:想给项目提代码,从这里找入口

如果网关已经接上客户端,下一步建议读 工具命名规范,给多个服务统一一套工具命名;卡住的问题先翻 FAQ。

【免费下载链接】fastapi_mcpExpose your FastAPI endpoints as Model Context Protocol (MCP) tools, with Auth!项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi_mcp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 13:47:41

网安人口中的蜜罐是指什么?

目录 1、什么是蜜罐? 2、蜜罐的几种工作方式 3、沙箱和蜜罐的区别 4、公网蜜罐与内网蜜罐侧重点的区别 5、使用蜜罐的好处 一个接入互联网的网站,只要能和外部产生通信,就有被黑客攻击的可能——就像飞机在控制无法关停发动机一样。但是…

作者头像 李华
网站建设 2026/9/14 13:45:47

PHP-Parser 在 enterNode 中替换节点为什么会无限递归?怎么避免

PHP-Parser 在 enterNode 中替换节点为什么会无限递归?怎么避免 【免费下载链接】PHP-Parser A PHP parser written in PHP 项目地址: https://gitcode.com/GitHub_Trending/ph/PHP-Parser 在基于 nikic/php-parser(下文简称 PHP-Parser&#xff…

作者头像 李华
网站建设 2026/9/14 13:45:14

OpenClaw imageModel配置与优化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 13:44:38

SpringBoot+Spring Security实现竞赛系统认证与权限控制

简介:一份面向高校毕业设计及课程设计场景的“大学生竞赛管理系统”完整项目源码,基于 SpringBoot Spring Security Jwt 构建后端接口,配合 Vue.js Element UI axios MyBatis Plus 实现了清晰的前后端分离。项目聚焦大学生竞赛的报名、管…

作者头像 李华
网站建设 2026/9/14 13:44:32

信创环境下SNMP协议栈选型:开源、免费SDK与国产自研怎么选?

先聊个挺典型的交付场景。单位要上信创改造,网络运维平台要从原来的底层环境整套往国产化迁移,操作系统换成麒麟V10,数据库换达梦,芯片平台是飞腾或者鲲鹏。平台要纳管上千台交换机、路由器、服务器,采集CPU、内存、接…

作者头像 李华
网站建设 2026/9/14 13:43:12

LTE CA认证测试实战:CE与FCC路径解析及整改指南

上个月在实验室做一台多模终端的FCC预测试,单载波模式下B2、B4、B7各项指标都干干净净,结果一打开上行CA(载波聚合)配置,带外杂散直接飚高了快10dB,几乎把整个验证计划打乱。这个场景在LTE CA认证测试里太常…

作者头像 李华