【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器

【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器

今天我们将使用FastAPI来构建 MCP 服务器,Anthropic 推出的这个MCP 协议,目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。FastAPI 基于 Starlette 和 Uvicorn,采用异步编程模型,可轻松处理高并发请求,尤其适合 MCP 场景下大模型与外部系统的实时交互需求,其性能接近 Node.js 和 Go,在数据库查询、文件操作等 I/O 密集型任务中表现卓越。

开始今天的正题前,我们来回顾下相关的知识内容:

高性能Python Web服务部署架构解析》、《使用Python开发MCP Server及Inspector工具调试》、《构建智能体MCP客户端:完成大模型与MCP服务端能力集成与最小闭环验证

 

FastAPI基础知识

安装依赖

pip install uvicorn, fastapi

FastAPI服务代码示例 

from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"data": "Hello MCP!"}

uvicorn启动server 

uvicorn server:app --reload

接下来,我们将基于FastAPI来开发MCP服务器

 

FastAPI开发MCP Server

FastAPI-MCP 一个零配置工具,用于自动将FastAPI端点暴露为模型上下文协议(MCP)工具。其特点在于简洁性和高效性,以下是一些主要特点:

  • 直接集成:不需要复杂的设置,直接集成到FastAPI应用中。
  • 自动转换:无需手动编写代码,自动将FastAPI端点转换为MCP工具。
  • 灵活性:支持自定义MCP工具,与自动生成的工具一同使用。
  • 性能:基于Python 3.10+和FastAPI,保证了高性能的API服务。
  • 文档友好:保持了原有的API文档,方便开发者使用和理解。

安装依赖

pip install fastapi-mcp

MCP服务代码示例

from fastapi import FastAPI from fastapi_mcp import add_mcp_server from typing import Any import httpx # 常量 NWS_API_BASE = "https://api.weather.gov" USER_AGENT = "weather-app/1.0" app = FastAPI() mcp_server = add_mcp_server( app, # FastAPI 应用 mount_path="/mcp", # MCP 服务器挂载的位置 name="Weather MCP Server", # MCP 服务器的名字 describe_all_responses=True, # 默认是 False。就像打开一个百宝箱,把所有可能的响应模式都包含在工具描述里,而不只是成功的响应。 describe_full_response_schema=True # 默认是 False。把完整的 JSON 模式包含在工具描述里,而不只是一个对大语言模型友好的响应示例。 ) async def make_nws_request(url: str) -> dict[str, Any] | None: """向 NWS API 发起请求,并进行错误处理。""" headers = { "User-Agent": USER_AGENT, "Accept": "application/geo+json" } async with httpx.AsyncClient() as client: try: response = await client.get(url, headers=headers, timeout=30.0) response.raise_for_status() return response.json() except Exception: return None @mcp_server.tool() async def get_forecast(latitude: float, longitude: float) -> str: """获取地点的天气预报。 参数: latitude: 地点的纬度 longitude: 地点的经度 """ points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}" points_data = await make_nws_request(points_url) if not points_data: return "Unable to fetch forecast data for this location." forecast_url = points_data["properties"]["forecast"] forecast_data = await make_nws_request(forecast_url) if not forecast_data: return "Unable to fetch detailed forecast." periods = forecast_data["properties"]["periods"] forecasts = [] for period in periods[:5]: forecast = f""" {period['name']}: Temperature: {period['temperature']}°{period['temperatureUnit']} Wind: {period['windSpeed']} {period['windDirection']} Forecast: {period['detailedForecast']} """ forecasts.append(forecast) return "\n---\n".join(forecasts)

启动 mcp server

uvicorn server:app --host 0.0.0.0 --port 8001 --reload

 启动 mcp inspector 调试

CLIENT_PORT=8081 SERVER_PORT=8082 npx -y @modelcontextprotocol/inspector

当集成了 MCP 的 FastAPI 应用运行起来后,可以用任何支持 SSE 的 MCP 客户端连接它。我们这里还是使用 mcp inspector 进行调试,通过 SSE 连接 Weather MCP 服务器。

SSE是一种单向通信的模式,所以它需要配合HTTP Post来实现客户端与服务端的双向通信。严格的说,这是一种HTTP Post(客户端->服务端) + HTTP SSE(服务端->客户端)的伪双工通信模式,区别于WebSocket双向通信

 

如果MCP客户端不支持SSE,可以使用mcp-proxy连接MCP服务器。本质上是本地通过stdio连接到mcp-proxy,再由mcp-proxy通过SSE连接到MCP Server上。

mcp-proxy 支持两种模式,stdio to SSE SSE to stdio

安装 mcp-proxy

uv tool install mcp-proxy

配置 claude_desktop_config.json 

{ "mcpServers": { "weather-api-mcp-proxy": { "command": "mcp-proxy", "args": ["http://127.0.0.1:8001/mcp"] } } }

FastAPI-MCP 目前还有很多功能不完善,我们将持续关注进展。在《大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇》中我们手搓了一个自动挂载的功能,并基于现有fastapi base_url 将 api 挂载至 mcp_server。

大模型基建工程总结

FastAPI 构建 MCP 服务器的核心价值在于:通过类型安全的异步接口,将企业现有能力快速转化为大模型可调用的标准化服务。这种架构既保留了 FastAPI 的高效开发体验,又通过 MCP 协议实现了与前沿 AI 技术的无缝对接,同时结合 Docker 和 Kubernetes 实现弹性伸缩部署,可以快速应对大模型调用量的突发增长,是构建下一代智能系统的理想选择。

Read more

Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】

Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】

文章目录 * 一、前言 * 二、问题场景 * 三、开发环境配置(Vite) * 四、生产环境配置(Nginx) * 4.1 初始错误配置 * 4.2 正确配置方案 * 4.3 配置解析 * 4.4高级配置选项 * 五、常见问题排查 * 六、开发环境 vs 生产环境对比 * 七、总结 一、前言 在前后端分离架构中,前端访问后端资源(尤其是图片、文件等静态资源)的反向代理配置是一个常见且容易踩坑的问题。最近在开发一个 Vue3 + .NET8 的项目时,我就遇到了开发环境配置正常,但部署到生产环境后图片无法访问的问题。本文将详细记录这个问题的解决过程,并给出开发环境和生产环境的完整代理配置方案。 二、问题场景 * 前端:Vue3 项目,

By Ne0inhk
不用服务器也能让本地 Websocket 跑遍全网?cpolar帮我搞定了

不用服务器也能让本地 Websocket 跑遍全网?cpolar帮我搞定了

文章目录 * 前言 * 1. Java 服务端demo环境 * 2. 在pom文件引入第三包封装的netty框架maven坐标 * 3. 创建服务端,以接口模式调用,方便外部调用 * 4. 启动服务,出现以下信息表示启动成功,暴露端口默认9999 * 5. 创建隧道映射内网端口 * 6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号 * 7. 以基于go的socket客户端为例,通过公网连接java socket服务端 * 8. 通过git下载websocket框架 * 9. 创建客户端, 注意:Host值为上面复制的隧道公网地址!! * 10. 接着启动服务,与服务端连接,出现服务端返回的字样表示连接成功 * 11. 客户端在控制台输入信息,回车 * 12. 服务端出现客户端发送的信息 * 13. 服务端控制台输入消息,回车 * 14. 客户端收到服务端回复的消息,连接成功 * **总之,cpolar 让本地

By Ne0inhk
【Linux网络系列】:网络+网络编程(UDPsocket+TCPsocket)

【Linux网络系列】:网络+网络编程(UDPsocket+TCPsocket)

🔥 本文专栏:Linux网络 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 我们常苦苦寻找那个“正确”的选择,但或许,比选择更重要的是:鼓起勇气,让自己成为那个“使选择变正确”的人。 引入 在结束了Linux系统部分的学习之后,我们主要掌握了Linux的基本指令、进程与信号、进程间通信、线程等内容。通过这部分内容我们可以发现,它们主要围绕同一台设备上的一个或者多个进程展开。然而在当前的互联网时代,每一台计算机或设备都不是孤立存在的。正如人类具有社会属性,无法完全与世隔绝,当我们步入社会,必然需要与他人接触、建立联系、形成社交网络一样,计算机也需要与其他计算机进行通信,即数据交换。因此,计算机也不是一座“社交孤岛”。 由于计算机之间的通信涉及不同设备,要实现这种跨设备通信,就离不开我们今天要讨论的主题—— 网络 。在本篇博客中,我将从两个方面展开:首先带领大家认识 网络 ,并补充必要的 网络 基础知识;在具备一定基础后,我们将进一步学习 网络编程的相关内容。从本文开始,

By Ne0inhk
I.MX6U 开发板网络环境搭建----(电脑 WiFi 上网,开发板和电脑直连)--虚拟机双网口实现-- Ubuntu20.04

I.MX6U 开发板网络环境搭建----(电脑 WiFi 上网,开发板和电脑直连)--虚拟机双网口实现-- Ubuntu20.04

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门:linux专栏 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言 一、使用场景 二、VMware 设置 三、Ubuntu 设置 3.1设置ens37网络(即NAT 模式的网络适配器) 3.2、测试ubuntu上网功能 3.3、测试ubuntu和Windows互传功能 3.4设置桥接模式的网络适配器 1 的 IP 信息 3.5关闭防火墙 四、windows设置 五、开发板设置并ping测试 5.

By Ne0inhk