【大模型系列篇】大模型基建工程:基于 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 实现弹性伸缩部署,可以快速应对大模型调用量的突发增长,是构建下一代智能系统的理想选择。

### 如何配置MCP服务器及其最佳实践 配置MCP(Multi-Client Protocol)服务器涉及多个方面,包括理解其基本架构、设置环境以及优化性能。以下是关于如何配置MCP服务器的一些关键点: #### MCP服务器的基础概念 MCP协议允许客户端与服务器之间通过特定的消息传递机制进行通信。它分为客户端和服务器端两部分,在实际应用中可以先专注于服务器端的搭建[^2]。 #### 配置MCP服务器的关键步骤 1. **选择合适的传输方式** - MCP支持多种数据传输方法,比如`stdio`或`SSE (Server-Sent Events)`。如果计划使用`stdio`作为主要传输手段,则需确保客户端能够解析标准输入/输出流中的消息;而采用`SSE`则需要提供有效的URL地址供客户端访问[^3]。 2. **设定连接参数** - 对于基于`stdio`的服务来说,主要是指定启动程序所需的命令行选项。 - 如果是网络服务形式(`SSE`),那么应该明确指出用于接收请求的具体HTTP路径或者WebSocket链接。 3. **集成到现有系统** - 开发者可以选择直接构建自己的MCP实现方案,也可以利用已有的开源项目快速上手。例如某些平台上已经存在可立即部署使用的预建MCP服务器实例。 4. **测试与调试** - 完成初步配置之后,务必进行全面的功能验证以确认所有预期行为均正常运作。可以通过模拟不同类型的用户交互场景来进行压力测试并调整资源分配策略[^1]。 5. **安全性考量** - 考虑到网络安全的重要性,在开放外部接口之前应实施必要的身份认证措施防止未授权访问。同时也要注意保护敏感信息不被泄露给未经授权的一方。 6. **文档记录维护** - 清晰详尽的技术文档有助于后续团队成员的理解和支持工作。定期更新指南说明任何改动之处以便长期管理更加便捷高效。 ```bash # 示例:简单的MCP Server初始化脚本(伪代码) #!/bin/bash # 设置基础变量 SERVER_NAME="My_MCP_Server" PORT=8080 echo "Starting $SERVER_NAME on port $PORT..." # 启动服务逻辑... ./mcp_server --port=$PORT & PID=$! trap 'kill $PID' EXIT wait $PID ``` 以上内容概括了从零开始建立一个功能性完备的MCP server所需要遵循的主要指导原则和技术要点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值