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

C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解

C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解

✨ 孤廖:个人主页 🎯 个人专栏:《C++:从代码到机器》 🎯 个人专栏:《Linux系统探幽:从入门到内核》 🎯 个人专栏:《算法磨剑:用C++思考的艺术》 折而不挠,中不为下 文章目录 * 前言 * 正文 * 1. 非类型模板参数 * 2. 模板的特化 * 2.1 概念 * 2.2 函数模板特化 * 2.3 类模板特化 * 2.3.1 全特化 * 2.3.2 偏特化 * 2.3.3 类模板特化应用示例 * 3 模板分离编译 * 3.1 什么是分离编译 * 3.2 模板的分离编译

By Ne0inhk
【 C++ 入门】Cyber骇客的 流式文本序列处理器 —— 【 string 类】万字大文带你从0学好C++的string类!

【 C++ 入门】Cyber骇客的 流式文本序列处理器 —— 【 string 类】万字大文带你从0学好C++的string类!

⚡ CYBER_PROFILE ⚡ /// SYSTEM READY /// [WARNING]: DETECTING HIGH ENERGY 🌊 🌉 🌊 心手合一 · 水到渠成 >>> ACCESS TERMINAL <<<[ 🦾 作者主页 ][ 🔥 C语言核心 ][ 💾 编程百度 ][ 📡 代码仓库 ] --------------------------------------- Running Process: 100% | Latency: 0ms 索引与导读 * 一、为什么学习 string类 ? * 二、C++ 标准库中的 string 类 * 2.1)auto和范围for * 2.2)string类的常用接口 * 🚩1)string类的常用构造 * 🚩2)string类对象的容量操作 * ❗注意事项 * 1)size(

By Ne0inhk
《C++ 递归、搜索与回溯》第1题:汉诺塔问题

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 《Git深度解析》:版本管理实战全解 🌟心向往之行必能至 🎥Cx330🌸的简介: 前言: 聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力 目录 前言: 递归,搜索与回溯算法前置知识 1. 汉诺塔 算法原理(递归): 思路: 算法流程: 解法代码(C++): 博主手记(字体还请见谅哈): 结尾: 递归,搜索与回溯算法前置知识 1. 汉诺塔 题目链接: 面试题 08.

By Ne0inhk
C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板 💡 学习目标:掌握模板进阶技术的核心用法,理解模板特化的深层应用、类型萃取的实现原理,以及可变参数模板的灵活使用,提升泛型编程的实战能力。 💡 学习重点:模板特化的进阶场景、类型萃取工具的设计与应用、可变参数模板的展开技巧、折叠表达式的使用方法。 一、模板特化进阶:处理复杂类型场景 💡 模板特化不只是针对单一类型的定制,还能处理指针、引用、数组等复杂类型,实现更精细的类型适配逻辑。 1.1 指针类型的模板特化 通用模板默认处理普通类型,我们可以为指针类型单独编写特化版本,实现指针专属的逻辑。 #include<iostream>#include<string>usingnamespace std;// 通用模板:处理普通类型template<typenameT>classTypeProcessor{public:staticvoidprocess(T data){ cout

By Ne0inhk