【大模型系列篇】大模型基建工程:基于 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

红绿重构:TDD 如何让我写出更好的 Python 代码

红绿重构:TDD 如何让我写出更好的 Python 代码

红绿重构:TDD 如何让我写出更好的 Python 代码 “先写测试,再写代码。” 第一次听到这句话时,我以为这是某种程序员的玄学。直到我在一个真实项目中被 bug 折磨了三天,才终于决定认真对待它。 一、TDD 是什么?为什么它能改变你的编码方式? 测试驱动开发(Test-Driven Development,TDD)并不是一种测试技术,而是一种设计哲学。 它的核心节奏只有三个步骤,被称为"红绿重构循环": 🔴 Red → 写一个会失败的测试 🟢 Green → 写最少的代码让测试通过 🔵 Refactor → 在测试保护下重构代码 听起来简单,但真正实践后你会发现,这个节奏从根本上改变了你思考问题的顺序——你不再先想"怎么实现",而是先想"这个函数应该如何被使用"。这个微小的视角转变,会让你写出接口更清晰、耦合更低、更容易维护的代码。 二、

By Ne0inhk
基于Python+PyGame实现的一款功能完整的数独游戏,支持多难度选择、实时验证、提示系统、成绩记录,并采用多线程优化加载体验。(文末附全部代码)

基于Python+PyGame实现的一款功能完整的数独游戏,支持多难度选择、实时验证、提示系统、成绩记录,并采用多线程优化加载体验。(文末附全部代码)

✨ 项目亮点 * ✅ 三种难度可选(初级30空/中级45空/高级60空) * ✅ 实时颜色提示(正确蓝色/错误红色) * ✅ 内置“提示”功能(显示答案2秒) * ✅ 成绩记录系统(分难度保存最快用时) * ✅ 流畅界面 + 加载进度优化 * ✅ 完整游戏交互(键盘+鼠标) 📌 一、功能概览 功能说明难度切换初级/中级/高级,对应不同空格数量实时验证输入后立即颜色反馈(蓝/红)提示系统按T键或按钮显示当前格答案(持续2秒)成绩记录自动保存各难度最佳用时,支持查看历史记录重置游戏可随时重置当前难度盘面帮助说明内置游戏规则与操作指南 🧩 二、核心技术实现 1. 游戏状态管理 python game_states = { "初级": {"matrix": ..., "blank_ij": ..., "start_

By Ne0inhk

python与Java差别

Python与Java核心差异深度解析:从语法到场景,一篇讲透如何选择 在编程语言生态中,Python和Java是两大支柱级存在,前者以“高效开发”著称,后者凭“稳定高性能”立足。无论是编程新手入门选型,还是开发者根据项目需求切换技术栈,二者的差异对比都是绕不开的话题。本文将从核心特性、应用场景、优劣势等维度展开,帮你系统理清二者的区别,精准匹配实际需求。 一、核心特性对比:一张表看懂关键差异 对比维度 Python Java  语言类型 解释型语言,动态类型(弱类型),执行时逐行解释代码 编译型语言(先编译为字节码),静态类型(强类型),编译后通过JVM执行  语法风格 极简灵活,采用缩进(4个空格或Tab)划分代码块,无需显式声明变量类型,一行代码可完成复杂逻辑 严谨规范,必须用大括号{}划分代码块,变量声明时需指定数据类型,语法结构更规整  执行速度 相对较慢,解释执行无预编译优化,

By Ne0inhk