如何使用 FastAPI 构建 MCP 服务器

哎呀,各位算法界的小伙伴们!今天咱们要聊聊一个超酷的话题——MCP 协议!你可能已经听说了,Anthropic 推出了这个新玩意儿,目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。不过别担心,为你的 Python 应用程序搭建一个这样的服务器并不复杂,甚至可以说简单到让你怀疑人生!

为什么需要它?

  • 允许 AI 代理与您的应用程序集成
    想象一下,AI 就像你的私人助理,而 MCP 就是它和你家大门之间的钥匙。

  • 将复杂性从人类开发者转移到 AI 代理
    让 AI 去操心那些繁琐的逻辑吧,咱就负责躺平享受成果。

  • 简化将 AI 连接到众多工具和数据源的过程
    不管你是想连数据库还是接 API,MCP 都能帮你搞定。

如果 MCP 成为下一个行业标准(已经火起来了,看起来可能性非常之大),那你只能选择跟上潮流。毕竟,别人家的 AI 都在忙着自动集成,你总不能还手动敲代码吧?更何况,等你看到实现它所需的代码量时,你会觉得自己简直是个天才!


如何做?

创建具有所需功能的 FastAPI 服务器

(如果你已经有了一个,请直接跳过此步骤)

FastAPI 的入门教程肯定比我的讲解更专业,但我会尽量用接地气的方式给你讲清楚:

安装依赖项:
pip install uvicorn, fastapi
创建一个 FastAPI 服务器:
from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "MCP 超级酷"}  # 返回一条消息,告诉世界 MCP 很棒

对于应用的每个功能,编写一个“路径操作”——也就是分配给特定路径的函数(比如这里的根函数位于路径 / 下),执行 HTTP 操作(GET、POST、PUT、DELETE…)。然后用 uvicorn 运行你的应用:

uvicorn main:app --reload

搞定!你的 FastAPI 应用现在可以在 http://127.0.0.1:8000 上访问啦。接下来,让我们把它升级成一个真正的 MCP 服务器!

插图


从 FastAPI 到 MCP 服务器

安装开源工具 fastapi-mcp:

pip install fastapi-mcp ## 这行代码价值一个亿

特性

  • 直接集成 - 将 MCP 服务器直接挂载到您的 FastAPI 应用中
  • 零配置要求 - 只需将其指向您的 FastAPI 应用即可正常运行
  • 自动发现所有 FastAPI 端点并转换为 MCP 工具
  • 保留请求模型和响应模型的架构
  • 保留所有端点的文档,就像在 Swagger 中一样
  • 可扩展性 - 在自动生成的工具之外添加自定义 MCP 工具

基础用法

添加到你的 FastAPI 代码:

from fastapi import FastAPI
from fastapi_mcp import add_mcp_server# 您的 FastAPI 应用
app = FastAPI()# 把 MCP 服务器挂载到你的应用上,就像给舞台装上聚光灯
add_mcp_server(app,                 # 您的 FastAPI 应用mount_path="/mcp",   # 在哪里挂载 MCP 服务器name="我的 API MCP",   # MCP 服务器的名称
)

高级玩法

FastAPI - MCP 还有很多隐藏技能,能让你随心所欲地定制和控制 MCP 服务器的创建和配置,就像玩一场超级酷炫的游戏:

from fastapi import FastAPI
from fastapi_mcp import add_mcp_serverapp = FastAPI()mcp_server = add_mcp_server(app,                                    # 你的 FastAPI 应用mount_path="/mcp",                      # MCP 服务器挂载的位置name="My API MCP",                      # MCP 服务器的名字describe_all_responses=True,            # 默认是 False。就像打开一个百宝箱,把所有可能的响应模式都包含在工具描述里,而不只是成功的响应。describe_full_response_schema=True      # 默认是 False。把完整的 JSON 模式包含在工具描述里,而不只是一个对大语言模型友好的响应示例。
)# 你还可以像变魔术一样,在现有 API 的基础上添加自定义工具。
@mcp_server.tool()
async def get_server_time() -> str:"""获取当前服务器时间。就像从时间老人那里偷来一点时间信息"""from datetime import datetimereturn datetime.now().isoformat()

就这样!MCP 服务器自动生成并可在 http://127.0.0.1:8000/mcp 上访问。这是一个可以在 Cursor(或者任何支持 SSE 的 AI 代理,据说 Cline 对 MCP 的支持也快来了)中配置的地址。


使用 MCP

通过 SSE 连接 MCP 服务器

当你的集成了 MCP 的 FastAPI 应用运行起来后,你可以用任何支持 SSE 的 MCP 客户端连接它,比如 Cursor,就像用一把神奇的钥匙打开宝藏大门:

  1. 启动你的应用,就像启动一辆超级跑车。
  2. 在 Cursor -> 设置 -> MCP 里,把你的 MCP 服务器端点的 URL(比如 http://localhost:8000/mcp)作为 SSE 地址,就像给跑车设置目的地。
  3. Cursor 会像一个聪明的小侦探,自动发现所有可用的工具和资源。

通过 mcp - proxy stdio 连接 MCP 服务器

要是你的 MCP 客户端不支持 SSE,比如 Claude Desktop,也别担心,我们有办法:

  1. 启动你的应用,让它像个活力满满的小机器人一样跑起来。
  2. 安装 mcp - proxy,比如:uv tool install mcp-proxy,就像给小机器人装上一个新的配件。
  3. 在 Claude Desktop 的 MCP 配置文件 (claude_desktop_config.json) 里添加以下内容:
Windows 系统
{"mcpServers": {"my-api-mcp-proxy": {"command": "mcp-proxy","args": ["http://127.0.0.1:8000/mcp"]}}
}
MacOS 系统
{"mcpServers": {"my-api-mcp-proxy": {"command": "/Full/Path/To/Your/Executable/mcp-proxy","args": ["http://127.0.0.1:8000/mcp"]}}
}

在终端里运行 which mcp - proxy 就能找到 mcp - proxy 的路径,就像在迷宫里找到正确的路。


接下来是什么?

一旦设置完成,AI 代理现在可以通过标准化协议与你的应用程序交互了!你可以通过添加更多端点来扩展你的 MCP 服务器,暴露应用程序的不同功能。

记住,MCP 的目标是让集成变得简单——所以千万别搞得太复杂!从基本功能开始,根据需要逐步扩展。

使用 FastAPI 和 fastapi-mcp 库的好处在于,你保留了 FastAPI 的所有优势(比如自动文档和类型验证),同时通过最少的额外代码添加了 MCP 功能。

如果你尝试了,请告诉我,并别忘了给 fastapi-mcp仓库加星哦!🌟


好了,今天的任务完成啦!希望这篇幽默风趣的翻译能让你轻松掌握如何用 FastAPI 构建 MCP 服务器。要是你觉得有用,记得给我点个赞哈!否则……嗯,你的工作可能就像气球一样飞走咯,说不定连你的家人都得跟着紧张一下下呢!😄

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git】-- 处理 Git 提交到错误分支的问题

如果你不小心把本应提交到 test 分支的代码提交到了 master 分支(但尚未 push),可以按照以下步骤解决: 方法一(推荐):使用 git reset 和 git stash 首先,确保你在 master 分支&…

通用目标检测技术选型分析报告--截止2025年4月

前言 本文撰写了一份关于通用目标检测(General Object Detection)的技术选型分析报告,覆盖2000至2025年技术演进历程,重点纳入YOLO-World、RT-DETR、Grounding DINO等2024-2025年的最新模型。 报告将包括技术定义、行业现状、技…

链路追踪Skywalking

一、什么是Skywalking 分布式链路追踪的一种方式:Spring Cloud SleuthZipKin,这种方案目前也是有很多企业在用,但是作为程序员要的追逐一些新奇的技术,Skywalking作为后起之秀也是值得大家去学习的。 Skywalking是一个优秀的国产…

websocket获取客服端真实ip

在websocket建立连接时,获取访问客户端的真实ip 1. websocket建立连接过程 2. pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>3. 添加配置,握…

NSSCTF(MISC)—[justCTF 2020]pdf

相应的做题地址&#xff1a;https://www.nssctf.cn/problem/920 binwalk分离 解压文件2AE59A.zip mutool 得到一张图片 B5F31内容 B5FFD内容 转换成图片 justCTF{BytesAreNotRealWakeUpSheeple}

部分国产服务器CPU及内存性能测试情况

近日对部分国产服务器进行了CPU和内存的性能测试&#xff0c; 服务器包括华锟振宇、新华三和中兴三家&#xff0c;CPU包括鲲鹏、海光和Intel&#xff0c;初步测试结果如下&#xff1a; 服务器厂商四川华锟振宇新华三中兴中兴服务器HuaKun TG225 B1R4930 G5R5930 G2R5300 G4操作…

【无标题】Scala函数基础

函数和方法的区别 1&#xff09; 核心概念 &#xff08;1&#xff09; 为完成某一功能的程序语句的集合&#xff0c;称为函数。 &#xff08;2&#xff09; 类中的函数称之方法。 2&#xff09; 案例实操 &#xff08;1&#xff09; Scala 语言可以在任何的语法结构中声明…

uniapp -- 列表垂直方向拖拽drag组件

背景 需要在小程序中实现拖拽排序功能,所以就用到了m-drag拖拽组件,在开发的过程中,发现该组件在特殊的场景下会有些问题,并对其进行了拓展。 效果 组件代码 <template><!-- 创建一个垂直滚动视图,类名为m-drag --><scroll

conda安装python 遇到 pip is configured with locations that require TLS/SSL问题本质解决方案

以前写了一篇文章&#xff0c;不过不是专门为了解决这个问题的&#xff0c;但是不能访问pip install 不能安装来自https 协议的包问题几乎每次都出现&#xff0c;之前解决方案只是治标不治本 https://blog.csdn.net/wangsenling/article/details/130194456​​​​​​​https…

【初阶数据结构】队列

文章目录 目录 一、概念与结构 二、队列的实现 队列的定义 1.初始化 2.入队列 3.判断队列是否为空 4.出队列 5.取队头数据 6.取队尾数据 7.队列有效个数 8.销毁队列 三.完整源码 总结 一、概念与结构 概念&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除…

Apache Shiro 全面指南:从入门到高级应用

一、Shiro 概述与核心架构 1.1 什么是 Shiro&#xff1f; Apache Shiro 是一个强大且易用的 Java 安全框架&#xff0c;它提供了认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、加密&#xff08;Cryptography&#xff09;和会话管…

es 3期 第28节-深入掌握集群组建与集群设置

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…

Android学习总结之通信篇

一、Binder跨进程通信的底层实现细节&#xff08;挂科率35%&#xff09; 高频问题&#xff1a;“Binder如何实现一次跨进程方法调用&#xff1f;”   候选人常见错误&#xff1a;   仅回答“通过Binder驱动传输数据”&#xff0c;缺乏对内存映射和线程调度的描述混淆Binde…

数据结构C语言练习(两个栈实现队列)

一、引言 在数据结构的学习中&#xff0c;我们经常会遇到一些有趣的问题&#xff0c;比如如何用一种数据结构去实现另一种数据结构的功能。本文将深入探讨 “用栈实现队列” 这一经典问题&#xff0c;详细解析解题思路、代码实现以及每个函数的作用&#xff0c;帮助读者更好地…

前端如何导入谷歌字体库

#谷歌字体库内容丰富&#xff0c;涵盖上千种多语言支持的字体&#xff0c;学习导入谷歌字体库来增加网站的阅读性&#xff0c;是必不可少的一项技能# 1&#xff0c;前往谷歌字体网站 要会魔法&#xff0c;裸连很卡 2&#xff0c; 寻找心仪字体 Googles Fonts下面的filters可…

SnapdragonCamera骁龙相机源码解析

骁龙相机是高通开发的一个测试系统摄像头的demo&#xff0c;代码完善&#xff0c;功能强大。可以配合Camera驱动进行功能联调。 很多逻辑代码在CaptureModule.java里。 CaptureModule有8000多行&#xff0c;包罗万象。 涉及到界面显示要结合CaptureUI.java 一起来实现。 Ca…

多线程猜数问题

题目&#xff1a;线程 A 生成随机数&#xff0c;另外两个线程来猜数&#xff0c;线程 A 可以告诉猜的结果是大还是小&#xff0c;两个线程都猜对后&#xff0c;游戏结束&#xff0c;编写代码完成。 一、Semaphore 多个线程可以同时操作同一信号量&#xff0c;由此实现线程同步…

seq2seq

理解 transformer 中的 encoder decoder 详细的 transformer 教程见&#xff1a;【极速版 – 大模型入门到进阶】Transformer 文章目录 &#x1f30a; Encoder: 给一排向量输出另外一排向量&#x1f30a; Encoder vs. Decoder: multi-head attention vs. masked multi-head at…

Proxmox pct 部署ubuntu

pct 前言 PCT(Proxmox Container Tool)是 PVE 中用于管理 Linux 容器(LXC)的命令行工具。通过 PCT,用户可以执行各种容器管理任务,例如创建新的容器、启动和停止容器、更新容器、安装软件包、导出和导入容器等。PCT 提供了与 Web 界面相同的功能,但通过命令行进行操作,…

Google Play关键字优化:关键排名因素与实战策略

如果您准备发布应用程序或开始专注于关键字优化&#xff0c;您可能想知道如何向Google Play上的应用程序添加关键字。Google Play上的搜索量和排名与App Store不同&#xff0c;而且被索引排名的关键字也不同。在此文中&#xff0c;我们将确定Google Play上的关键排名因素&#…