MCP 服务器与 FastAPI 的集成

什么是 MCP? AI 与 API 的通信

MCP(模型上下文协议) 作为一个标准化的通信层, 使 AI 代理(如 Claude 或 GPT, 即 MCP 客户端)能够理解并交互外部 API(MCP 服务器). 它为 API 提供了一种结构化的方式来描述其:

  • 功能(工具)
  • 输入模式
  • 执行方法

核心而言, MCP 将你的代码转换为 AI 代理(如 Claude)可无缝交互的自描述接口------消除了手动集成 API 或浏览复杂 API 文档的必要性.

  • 你可为自有应用创建 MCP 配置, 使其易于其他开发者集成, 或
  • 你可使用其他开发者创建的公开配置文件连接外部工具. 例如, Razorpay 已发布其 MCP 服务器, 使开发者能以极低成本快速将 LLM 应用与 Razorpay 的 API 集成.

本文将重点探讨第一个要点.

服务中的 MCP 服务器

在你的服务中集成 MCP 服务器可将其以 MCP 格式暴露, 使 AI 代理能够智能地发现并利用这些服务. 具体实现方式取决于你现有的服务架构.

选项 1: 将 MCP 与现有 FastAPI 应用程序集成

fastapi-mcp 库简化了将 FastAPI 应用程序的路由暴露为 MCP 工具的过程. 它会根据你的 FastAPI 路由定义自动生成必要的 MCP 模式, 并挂载一个专用的 /mcp 端点, AI 代理可通过该端点查询以了解你的 API 功能.

示例应用程序服务器:

复制代码
pip install fastapi-mcp
python 复制代码
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

app = FastAPI()

@app.get("/bmi", operation_id="calculate_bmi", summary="this tool is used to calculate bmi based on weigth and height"))
def calculate_bmi(weight_kg: float, height_m: float):
    return {"bmi": weight_kg / (height_m ** 2)}

mcp = FastApiMCP(app, name="BMI MCP", description="Simple application to calculate BMI")
mcp.mount()

示例 MCP 配置(用于消费你服务器的环境):

json 复制代码
{
  "mcpServers": {
    "bmi_mcp_server": {
      "command": "mcp-proxy",
      "args": ["http://127.0.0.1:8000/mcp"]
    }
  }
}

我在本博客的后文中对此进行了详细讨论.

选项 2: 将 MCP 与你的 Python 项目集成

mcp 库提供了一种更直接的方式, 可在 Python 脚本中定义 MCP 工具. 它提供了如 @mcp.tool() 等装饰器, 可轻松将函数标记为可调用工具, 抽象掉 MCP 规范的底层细节.

示例 Python 项目:

复制代码
pip install mcp
python 复制代码
#my_script.py
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("My MCP Server")

@mcp.tool()
def add(x: int, y: int) -> int:
    return x + y

if __name__ == "__main__":
    mcp.run()

示例 MCP 配置(用于消费你服务器的环境):

json 复制代码
{
  "mcpServers": {
    "my-python-mcp-server": {
      "command": "uv",
      "args": [
        "run",
        "--with",
        "mcp[cli]",
        "mcp",
        "run",
        "my_script.py"
      ],
      "description": "Runs the Python MCP server using the 'mcp' CLI provided by the 'mcp' library, executed with the 'uv' runner."
    }
  }
}

这里有一个快速的 YouTube 视频, 可以帮助你设置这个.

选项 3: 将 MCP 与 Docker 容器集成

使用 Docker 可以将你的应用程序, MCP 服务器及其依赖项打包到一个便携且隔离的环境中. 你的 MCP 服务器在 Docker 容器中运行并暴露端口.

示例 Razorpay 的 MCP 配置:

json 复制代码
{
    "mcpServers": {
        "razorpay-mcp-server": {
            "command": "docker",
            "args": [
                "run",
                "--rm",
                "-i",
                "-e",
                "RAZORPAY_KEY_ID",
                "-e",
                "RAZORPAY_KEY_SECRET",
                "razorpay-mcp-server:latest"
            ],
            "env": {
                "RAZORPAY_KEY_ID": "your_razorpay_key_id",
                "RAZORPAY_KEY_SECRET": "your_razorpay_key_secret"
            }
        }
    }
}

理解 MCP 配置

MCP 配置文件(通常为 JSON 格式)相当于 MCP 客户端(如 Claude Desktop Agent)的操作手册, 用于描述如何启动并与你的 MCP 服务器进行通信.

连接到 MCP 服务器(消费者): 赋能 AI 使用你的工具

为了让 AI 代理和开发工具能够使用你暴露的工具, 它们需要知道如何启动并与你的 MCP 服务器进行通信. 这就是 MCP 配置文件的作用, 它提供了必要的详细信息, 如执行命令和 API 端点.

常见的 MCP 客户端:

  1. Claude Desktop Agent : 通过将 MCP 服务器的配置添加到 claude_desktop_config.json 文件中来配置你的 MCP 服务器. Claude 将读取这些配置并使描述的工具可供交互.
  2. 开发 IDE(Cursor, VS Code): 这些 IDE 可以配置为在本地运行 MCP 服务器, 使你能够直接在开发环境中测试和交互你的工具.

端到端: 在 Claude 桌面代理上创建 MCP 服务器以支持加法工具 API

让我们通过一个完整示例, 演示如何创建一个简单的 FastAPI 应用程序, 将其 add 功能作为 MCP 工具暴露出来, 并将其连接到 Claude 桌面代理.

步骤 1: 设置 FastAPI MCP 服务器

  1. 创建项目目录: 打开终端并为项目创建新目录:
bash 复制代码
mkdir sample-mcp-server
cd sample-mcp-server
  1. 创建虚拟环境: 建议使用虚拟环境来管理项目依赖项.
bash 复制代码
python -m venv venv
source venv/bin/activate  # On macOS/Linux
# venv\Scripts\activate  # On Windows
  1. 安装依赖项 : 安装所需库: FastAPI , fastapi-mcp , uvicorn (用于运行 FastAPI 的 ASGI 服务器), pandas (示例中使用), mcp_proxypython-dotenv . mcp-proxy 通过 SSE 传输将请求代理到远程 MCP 服务器. 例如, mcp-proxy 包裹你的真实服务器, 将 Claude 的 SSE 基于请求转换为 FastAPI 应用程序可理解的常规 HTTP 请求------反之亦然.

    pip install fastapi fastapi-mcp uvicorn pandas mcp_proxy python-dotenv

  2. 创建 main.py 文件 : 在你的 sample-mcp-server 目录中创建一个名为 main.py 的文件, 并将以下代码粘贴到其中:

python 复制代码
from fastapi import FastAPI
from pydantic import BaseModel
from fastapi_mcp import FastApiMCP
import pandas as pd
from dotenv import load_dotenv
import os

load_dotenv()
app = FastAPI()

@app.get("/add", operation_id="add_two_numbers")
async def add(a: int, b: int):
    """Add two numbers and return the sum."""
    summ = pd.DataFrame({"a": [a], "b": [b], "sum": [a+b]})
    result = int(summ.loc[0, "sum"])
    return {"sum": result}

mcp = FastApiMCP(
    app,
    name="Addition MCP",
    description="Simple API exposing adding operation",
)

mcp.mount()
  1. 运行 FastAPI MCP 服务器 : 在 sample-mcp-server 目录中打开终端并运行服务器:
c 复制代码
uvicorn main:app --reload --host 127.0.0.1 --port 8000 --log-level debug

你应看到服务器启动, 通常在 http://127.0.0.1:8000

步骤 2: 配置 Claude 桌面代理以连接到你的 MCP 服务器

  1. 定位 Claude 桌面配置文件 : claude_desktop_config.json 的位置可能因操作系统和 Claude 桌面代理版本而略有不同. MacOS 位置包括: ~Library/Application Support/Claude/claude_desktop_config.json

注意: 如果你没有安装 Claude 桌面应用程序, 你需要先安装它.

  1. 使用文本编辑器打开此文件. 如果 mcpServers 键不存在, 你需要添加它.

  2. 将你的 MCP 服务器配置添加到 claude_desktop_config.json : 修改 claude_desktop_config.json 文件以包含你的服务器详细信息. 确保命令, 参数和工作目录正确指向 mcp-proxy 可执行文件和你的项目目录.

sql 复制代码
{
  "mcpServers": {
    "addition-tool-mcp": {
      "command": "/Users/{user_name}/sample-mcp-server/venv/bin/mcp-proxy",
      "args": ["http://127.0.0.1:8000/mcp"],
      "cwd": "/Users/{user_name}/sample-mcp-server", 
      "env": {} #add if any
    }
  }
}
  1. 重新启动 Claude 桌面代理 : 关闭并重新打开 Claude 桌面代理应用程序. 你应该能够在以下位置看到正在运行的 MCP 服务器: Claude 设置 > 开发者

步骤 3: 在 Claude 中与你的 MCP 工具交互

  1. 打开 Claude: 启动 Claude 桌面代理.
  2. 与 Claude 互动: 你现在可以让 Claude 执行"添加两个数字"操作. 尝试以下提示:
  • "添加 5 和 10"
  • "23 和 42 的和是多少"
  1. Claude 应识别你的addition-tool-mcp工具, 根据 fastapi-mcp 提供的 MCP 描述理解其功能, 并通过 mcp-proxy 调用你 FastAPI 应用程序的 /add 端点. 你应在 Claude 的响应中看到加法结果.

总结一下

将 MCP 与 FastAPI 集成, 为构建可被 AI 代理无缝利用的智能应用程序开辟了令人兴奋的可能性. 随着 MCP 生态系统的持续发展, 掌握这一集成将成为开发者构建下一代 AI 驱动解决方案的关键技能.

好吧, 今天的内容就分享到这里啦!

一家之言, 欢迎拍砖!

Happy coding! Stay GOLDEN!

相关推荐
a1111111111ss2 分钟前
添加最新的LSKNet遥感目标检测网络主干
人工智能·目标检测·计算机视觉
relis15 分钟前
llama.cpp Flash Attention 论文与实现深度对比分析
人工智能·深度学习
盼小辉丶19 分钟前
Transformer实战(21)——文本表示(Text Representation)
人工智能·深度学习·自然语言处理·transformer
艾醒(AiXing-w)23 分钟前
大模型面试题剖析:模型微调中冷启动与热启动的概念、阶段与实例解析
人工智能·深度学习·算法·语言模型·自然语言处理
科技小E27 分钟前
流媒体视频技术在明厨亮灶场景中的深度应用
人工智能
geneculture36 分钟前
融智学院十大学部知识架构示范样板
人工智能·数据挖掘·信息科学·哲学与科学统一性·信息融智学
无风听海37 分钟前
神经网络之交叉熵与 Softmax 的梯度计算
人工智能·深度学习·神经网络
算家计算38 分钟前
AI树洞现象:是社交降级,还是我们都在失去温度?
人工智能
JJJJ_iii42 分钟前
【深度学习03】神经网络基本骨架、卷积、池化、非线性激活、线性层、搭建网络
网络·人工智能·pytorch·笔记·python·深度学习·神经网络
sensen_kiss1 小时前
INT301 Bio-computation 生物计算(神经网络)Pt.1 导论与Hebb学习规则
人工智能·神经网络·学习