FastAPI-MCP:几行代码搞定 API 到大模型的桥接,小白也能轻松上手

FastAPI-MCP 是一个开源框架,能将现有 FastAPI 接口自动转换为 MCP 工具服务,无需重写代码。它支持零配置、保留原有认证和文档、灵活部署,并通过 ASGI 接口高效通信。开发者可通过几行代码让大模型直接调用已有 API,降低 AI 与传统系统集成门槛,支持选择性暴露接口、独立部署等功能,是 FastAPI 开发者赋能大模型的理想工具。

若你之前已经开发部署了大量 FastAPI 接口服务,打算让 LLM 调用这些已有的 API 服务来查询数据,执行任务。通常,需要将已有的 API 服务改写为支持 MCP 协议的服务:手写大量的“胶水代码”,定义工具(Tool)。工作繁琐,且容易出错。

如何快速将已有的 API 服务转换成 MCP 服务呢?

本文介绍一个开源项目:https://github.com/tadata-org/fastapi_mcp,几行代码就把现有 FastAPI 接口升级为支持 MCP 协议的工具服务,并保留原有的鉴权、数据校验和文档,极大降低了传统 API 与 AI 工作流之间的集成门槛,支持独立部署、SSE 流式传输、实时文档同步等功能。

一、什么是 FastAPI-MCP

  • GitHub: https://github.com/tadata-org/fastapi_mcp
  • 官方文档: https://fastapi-mcp.tadata.com/

FastAPI-MCP 是一个能将现有的 FastAPI 接口(Endpoints)自动转换并暴露为模型上下文协议(Model Context Protocol)工具服务的框架。

这意味着,不需要为 LLM 重写任何 API 调用逻辑。FastAPI-MCP 会自动读取 FastAPI 应用的路由、Pydantic 模型、甚至是接口文档,然后生成完全符合 MCP 规范的工具集,让 LLM 可以直接理解和调用。

FastAPI-MCP 特性

  • 自带认证:直接复用 FastAPI 中已有的安全依赖(Depends())。无论是 HTTPBearer 令牌认证还是复杂的 OAuth2 流程,都无需为 LLM 重复开发,安全性无缝继承。
  • 零/极简配置:大多数情况下,需要两行代码就能完成所有设置,真正做到“即插即用”。
  • 保留结构与文档:精确地将 Pydantic 模型和接口文档(docstrings)翻译成 LLM 能理解的工具输入/输出结构(Schema)和描述,保证了调用时的准确性。
  • 灵活部署:可以将 MCP 服务直接挂载到现有的 FastAPI 应用上,也可以将其作为独立服务分开部署。
  • 高效通信:通过 ASGI 接口直接与 FastAPI 应用通信,避免了从 MCP 服务到 API 服务的额外 HTTP 调用,延迟更低,效率更高。

二、安装步骤

安装 fastapi-mcp 包,使用 uv 工具或 pip 进行安装。

使用 uv (推荐):

uv add fastapi-mcp

使用 pip:

pip install fastapi-mcp

三、代码示例

1、基础用法

假设已经有了一个标准的 FastAPI 应用 app。现在,想让它所有的 API 都能被 LLM 调用。

  • FastApiMCP(app):自动完成了所有 API 的扫描和转换
  • mcp.mount_http():创建了一个新的接口(默认为 /mcp),这个接口就是 LLM 和应用沟通的桥梁。
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP

# 已有的 FastAPI app
app = FastAPI()

# 1. 从你的 FastAPI app 创建一个 MCP 实例
mcp = FastApiMCP(app)
# 2. 将 MCP 服务挂载到你的 app 上
mcp.mount_http()

# 启动服务
if __name__ == "__main__":
import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

2、无缝集成现有认证

假设应用中有一个需要授权才能访问的接口。已有的FastAPI 应用代码如下:

from fastapi import Depends, FastAPI
from fastapi.security import HTTPBearer

app = FastAPI()
token_auth_scheme = HTTPBearer()

# 一个受保护的接口,必须提供有效的 Bearer Token
@app.get("/private")
asyncdefprivate(token: str = Depends(token_auth_scheme)):
return {"message": f"Your token is: {token.credentials}"}

现在,如何让 LLM 在调用这个工具时也带上认证信息?使用 FastAPI-MCP,几乎不需要做任何额外的事:

from fastapi_mcp import FastApiMCP, AuthConfig

# ... (前面的 app 和 token_auth_scheme 定义)

# 创建 MCP 服务时,将 FastAPI 中已有的 Depends(token_auth_scheme) 传递给 AuthConfig
# 通过 AuthConfig 告诉 FastApiMCP 需要哪些认证依赖
mcp = FastApiMCP(
    app,
    name="Protected MCP",
    auth_config=AuthConfig(
        dependencies=[Depends(token_auth_scheme)], # 把认证依赖传进去
    ),
)

# 挂载服务
mcp.mount_http()

当 MCP 客户端尝试调用这个受保护的工具但未提供 Authorization 头时,FastAPI-MCP 会正确地返回 401 Unauthorized,从而触发客户端启动标准的 OAuth 流程,引导用户完成登录并获取Token,然后用这个 Token 再次调用工具。整个过程完全符合现代安全实践,而几乎没写任何额外的认证代码!

3、选择性暴露的 API

我们可能不想把所有的 API 都暴露给 LLM。FastAPI-MCP 同样提供了非常灵活的过滤机制,可以通过 operation_id 或 tags 来精确控制。这种灵活性使得管理和维护面向 LLM 的工具集变得异常轻松和安全。

# 仅暴露 operation_id 为 "get_item" 和 "list_items" 的接口
include_operations_mcp = FastApiMCP(
    app,
    name="Item API MCP - Included Operations",
    include_operations=["get_item", "list_items"],
)

# 暴露除了带有 "search" 标签以外的所有接口
exclude_tags_mcp = FastApiMCP(
    app,
    name="Item API MCP - Excluded Tags",
    exclude_tags=["search"],
)

# 挂载不同的 MCP 服务到不同的路径
include_operations_mcp.mount_http(mount_path="/include-operations-mcp")
exclude_tags_mcp.mount_http(mount_path="/exclude-tags-mcp")

以上是 FastAPI-MCP 项目介绍。该项目对 FastAPI 开发者十分友好,可以将已有的 API 服务快速高效地转换为 MCP 工具服务,从而将现有的业务能力赋能给大模型。


如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 大模型行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方优快云官方认证二维码,免费领取【保证100%免费

<think>好的,我需要为用户提供一个基于FASTAPI-MCP框架、使用aiomysql和uvicorn的Python MCP-Server示例,并且包含MySQL查询功能。首先,我需要整合这些组件,确保它们能够协同工作。 根据引用[3],FASTAPI-MCP框架通过add_mcp_server函数将MCP服务挂载到FastAPI应用中。用户需要配置MySQL连接,这里可以使用aiomysql库来实现异步数据库操作。引用[4]提到设置环境变量来配置数据库连接,所以应该使用dotenv来管理这些配置,比如MYSQL_HOST、MYSQL_USER等。 接下来,我需要编写一个工具函数,使用aiomysql连接数据库并执行查询。引用[2]中的示例展示了如何通过uvicorn启动服务,因此主文件可能需要使用uvicorn来运行FastAPI应用。同时,引用[3]中的代码示例演示了如何添加自定义工具函数,比如get_server_time,这里可以替换为执行SQL查询的函数。 需要注意的是,项目结构应该包括依赖安装,如aiomysql、uvicorn、python-dotenv等。引用[1]和[2]提到了创建虚拟环境和安装依赖的步骤,所以应该在示例中包含这些步骤,确保用户能够正确设置环境。 另外,配置文件的处理也很重要。使用dotenv从.env文件读取数据库配置,这样用户只需修改.env文件而无需改动代码。引用[4]中的环境变量设置可以作为参考,确保代码中正确加载这些变量。 最后,测试部分需要确保MCP服务能够接收自然语言查询,并将其转换为SQL语句执行。引用[5]提到MCP Client的配置,可能需要通过命令行参数或环境变量指定MCP服务器的地址,但用户当前的问题主要在于服务器端的实现,因此示例应侧重于服务端的代码。 总结步骤:1. 创建项目并安装依赖;2. 配置环境变量;3. 编写FastAPI应用并集成MCP服务器;4. 实现MySQL查询工具函数;5. 启动服务。同时,需要处理数据库连接的异步操作,确保使用aiomysql的正确语法,比如连接池的创建和查询的执行。</think>以下是一个基于FASTAPI-MCP框架整合aiomysql和uvicorn的MCP服务端示例,包含MySQL查询功能: ### 项目结构 ``` mysql-mcp-server/ ├── .env ├── main.py ├── database.py └── requirements.txt ``` ### 环境配置(.env) ```ini MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USER=root MYSQL_PASSWORD=yourpassword MYSQL_DATABASE=testdb MYSQL_POOL_MINSIZE=1 MYSQL_POOL_MAXSIZE=5 ``` ### 依赖安装(requirements.txt) ```text fastapi>=0.68.0 uvicorn>=0.15.0 aiomysql>=0.1.1 python-dotenv>=0.19.0 fastapi-mcp>=1.3.0 ``` ### 核心代码(main.py) ```python import os from fastapi import FastAPI from fastapi_mcp import add_mcp_server from dotenv import load_dotenv from database import create_pool, close_pool, query_database # 加载环境变量 load_dotenv() app = FastAPI(title="MySQL MCP Server") # 初始化MCP服务 mcp_server = add_mcp_server( app, mount_path="/mcp", name="MySQL Query Service", describe_all_responses=True ) @app.on_event("startup") async def startup_event(): await create_pool( host=os.getenv("MYSQL_HOST"), port=int(os.getenv("MYSQL_PORT")), user=os.getenv("MYSQL_USER"), password=os.getenv("MYSQL_PASSWORD"), db=os.getenv("MYSQL_DATABASE"), minsize=int(os.getenv("MYSQL_POOL_MINSIZE")), maxsize=int(os.getenv("MYSQL_POOL_MAXSIZE")) ) @app.on_event("shutdown") async def shutdown_event(): await close_pool() @mcp_server.tool() async def execute_sql_query( sql: str, params: dict = None ) -> list: """ 执行SQL查询并返回结果 参数: sql -- 需要执行的SQL语句,支持参数化查询 params -- 查询参数(可选) 示例: SELECT * FROM users WHERE age > :min_age """ return await query_database(sql, params) ``` ### 数据库模块(database.py) ```python from aiomysql import Pool, create_pool from typing import Optional _db_pool: Optional[Pool] = None async def create_pool(**kwargs): global _db_pool _db_pool = await create_pool( host=kwargs['host'], port=kwargs['port'], user=kwargs['user'], password=kwargs['password'], db=kwargs['db'], minsize=kwargs['minsize'], maxsize=kwargs['maxsize'], autocommit=True ) async def close_pool(): if _db_pool: _db_pool.close() await _db_pool.wait_closed() async def query_database(sql: str, params=None): async with _db_pool.acquire() as conn: async with conn.cursor() as cur: await cur.execute(sql, params or ()) result = await cur.fetchall() return { "columns": [x[0] for x in cur.description], "rows": [dict(zip(cur.description, row)) for row in result] } ``` ### 启动命令 ```bash uvicorn main:app --port 8000 --reload ``` 该实现包含以下关键技术点: 1. 使用`aiomysql`实现异步MySQL连接池管理[^2] 2. 通过`python-dotenv`管理数据库配置[^4] 3. 集成FastAPI-MCP框架提供工具服务端点[^3] 4. 支持参数化SQL查询防止注入攻击 5. 返回结构化的查询结果(包含列名和数据)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值