AI工具桥接服务

一个连接FastAPI和MCP服务器的桥接服务,用于高效安全地在网络中暴露AI工具功能。

  • by praveen1817
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 praveen1817/MCP-WEATHER_TOOL-DEMO

使用说明

🌉 MCP网桥架构——FastAPI+MCP服务器

一种生产风格的桥接架构,使用持久异步连接将FastAPI web层与MCP工具服务器连接起来。这种设计允许您在网络中高效安全地公开人工智能工具(如天气查找)。


✅ 这个项目展示了什么

  • MCP客户端/服务器工具通信
  • 基于FastAPI生命周期的持久连接
  • 使用AsyncExitStack进行异步上下文管理
  • 支持握手的MCP使用
  • 通过桥接层调用低延迟工具
  • 清洁API层与工具工人之间的隔离

🧠 架构概述

这个项目建造了一座桥。

  • 一边:MCP服务器——知道如何获取天气数据的工作人员
  • 另一方面:FastAPI服务器-公开友好的API的管理器
  • 中间:网桥层(MCPManager)——维护持久的MCP连接

您的应用程序不直接调用天气API,而是询问网桥,网桥询问MCP服务器,结果会返回。

客户端应用程序→ FastAPI桥→ 持久MCP客户端→ MCP服务器工具→ 天气API

这种架构允许您在多个应用程序和服务之间共享AI工具。


⚠️ 错误日志——连接难题和修复

最重要的学习来自调试MCP连接问题。

🧩 错误1--无握手错误

错误:

运行时错误:客户端未连接。首先使用“async with client:”上下文管理器。

为什么会发生:

MCP是有状态的。在允许工具调用之前,需要握手。

修复:

用途:

与客户端异步(…)

这确保了:

  • 连接打开
  • 握手完成
  • 工具变得可调用
  • 清理工作安全进行

🧩 错误2——握手延迟问题

问题:

每个/天气请求都创建了一个新的MCP连接+握手。

为什么重要:

  • 每次握手花费约100-300ms
  • 高流量→ 握手风暴
  • 服务器速度减慢

修复:

将连接移动到FastAPI生命周期中。

结果:

  • 启动时连接一次
  • 为所有请求重用连接
  • 关机时关闭一次

🧩 错误3-404未找到

错误:

httpx。HTTPStatusError:404找不到/sse

原因:

客户端路径与服务器路径不匹配。 预期客户/sse 服务器暴露/mcp

修复:

将客户端URL与MCP服务器路由精确对齐。


⚙️ 使用的先进概念

异步编程(Async/await)

Async允许服务器在等待工具/API响应时处理其他用户。

就像一个服务员为多张桌子服务,而不是在厨房等着。

等待tool_call()


AsyncExitStack——上下文背包

异步上下文管理器的可重用容器。

正常: 与客户端异步→ 封锁后立即关闭

异步退出堆栈:

  • 输入一次
  • 保持全球开放
  • 稍后手动关闭
  • 跨路线共享连接

FastAPI生命周期事件

控制启动和关闭行为。

用于管理MCP连接生命周期。

初创公司→ 连接到MCP
运行时→ 重复使用连接
关机→ 关闭连接


📁 最终代码结构

项目/ ├── 客户端.py ├── mcp_manager.py └── README.md


🧩 mcp_manager.py--连接中心

from contextlib import AsyncExitStack
from fastmcp import Client

class MCPManager:
    def __init__(self, url: str):
        self.url = url
        self.client = Client(self.url)
        self._stack = AsyncExitStack()

    async def connect(self):
        await self._stack.enter_async_context(self.client)
        print(f"✅ Persistent MCP Connection Active: {self.url}")

    async def disconnect(self):
        await self._stack.aclose()
        print("🔌 MCP Connection Closed.")

mcp_hub = MCPManager("http://127.0.0.1:8000/mcp")

🌐 client.py——快速API桥

from fastapi import FastAPI
from contextlib import asynccontextmanager
from mcp_manager import mcp_hub

@asynccontextmanager
async def lifespan(app: FastAPI):
    await mcp_hub.connect()
    yield
    await mcp_hub.disconnect()

app = FastAPI(lifespan=lifespan)

@app.post("/weather")
async def weather_route(city: str):
    return await mcp_hub.client.call_tool(
        "get_weather",
        {"city": city}
    )

🚀 快速入门(不到2分钟)

  1. 启动MCP服务器 python mcpserver.py

  2. 启动FastAPI桥 uvicorn客户端:应用程序--reload

  3. 呼叫天气端点 卷曲-X POST”http://127.0.0.1:8001/weather?city=London"


📊 初学者总结表

概念|简单含义|用例 Stdio |本地电缆|桌面工具应用程序 HTTP/SSE |远程链接|网络/云工具 上下文管理器|握手+清理| MCP需要 异步|非阻塞工作|工具/API调用 寿命|启动/关闭挂钩|持久连接


🎯 为什么这种模式很强大

  • 消除重复的MCP握手
  • 减少延迟
  • 支持高并发性
  • 清洁建筑分离
  • 工具服务器成为可重用的基础设施
  • 适用于AI代理和MCP生态系统

📌 许可证

麻省理工学院——免费用于学习和构建人工智能工具基础设施。