FastMCP v2:构建MCP服务器和客户端的Python利器
FastMCP v2:构建MCP服务器和客户端的Python利器
引言
在人工智能与大语言模型(LLMs)的应用场景中,如何高效地构建服务器和客户端以实现数据交互与功能调用是关键问题。Model Context Protocol (MCP) 为此提供了一种标准,而FastMCP v2则是基于Python实现的用于构建MCP服务器和客户端的强大工具。它在原有版本基础上进行了显著扩展,引入了丰富的高级特性,让开发者能够更轻松地创建和管理MCP应用程序。
什么是FastMCP v2
FastMCP v2是FastMCP 1.0的继任者,是一个专注于简化MCP服务器和客户端开发的Python库。它通过简洁的Python接口和丰富的功能特性,帮助开发者快速实现工具、资源、提示等组件的注册与管理,同时支持服务器代理、组合以及与OpenAPI/FastAPI集成等高级功能。
主要特点
- 简洁的Python接口:使用装饰器和简单的函数调用,让开发者可以用最少的代码完成复杂的MCP服务器和客户端开发。
- 功能丰富:支持工具、资源、模板、提示、上下文等核心概念,满足各种应用场景需求。
- 高级特性:包括服务器代理、服务器组合、OpenAPI/FastAPI集成等,方便与现有系统集成。
安装
可以通过以下命令使用pip安装FastMCP:
pip install fastmcp
核心功能及用途
1. 工具(Tools)
工具是FastMCP中用于执行特定任务的可调用函数,类似于HTTP的 POST
/PUT
请求。在实际应用中,工具可以用于数据处理、模型调用、文件操作等各种任务。
工具注册
可以通过 @mcp.tool()
装饰器将一个函数注册为工具。例如:
from fastmcp import FastMCPmcp = FastMCP("Demo 🚀")@mcp.tool()
def add(a: int, b: int) -> int:"""Add two numbers"""return a + b
在这个例子中,add
函数被注册为一个工具,用于将两个整数相加。工具的文档字符串会被用作工具的描述,方便其他开发者理解工具的用途。
工具调用
在客户端可以通过 Client
类调用注册的工具。示例如下:
from fastmcp.client.client import Client
from mcp.types import TextContentasync def test_call_tool():async with Client(mcp) as client:result = await client.call_tool("add", {"a": 1, "b": 2})assert len(result) == 1assert isinstance(result[0], TextContent)assert result[0].text == "3"
2. 资源与模板(Resources & Templates)
资源类似于HTTP的 GET
请求,用于加载信息到上下文。模板则是用于动态生成资源的一种机制。资源可以是文件内容、数据库查询结果等。
资源注册
可以通过 @mcp.resource()
装饰器将一个函数注册为资源。例如:
from fastmcp import FastMCP
from pathlib import Pathmcp = FastMCP("Demo 🚀")
test_dir = Path(__file__).parent@mcp.resource("file://test_dir/config.json")
def read_config_json() -> str:"""Read the config.json file"""try:return (test_dir / "config.json").read_text()except FileNotFoundError:return "File not found"
这个例子中,read_config_json
函数被注册为一个资源,用于读取 config.json
文件的内容。
资源读取
在客户端可以通过 Client
类读取注册的资源。示例如下:
from fastmcp.client.client import Client
from mcp.types import TextResourceContentsasync def test_read_resource():async with Client(mcp) as client:result = await client.read_resource("file://test_dir/config.json")assert len(result) == 1assert isinstance(result[0], TextResourceContents)
3. 提示(Prompts)
提示是可重用的模板,用于定义与LLM的交互模式。在与大语言模型交互时,提示可以帮助引导模型生成更符合预期的结果。
提示注册
可以通过 @mcp.prompt()
装饰器将一个函数注册为提示。例如:
from fastmcp import FastMCPmcp = FastMCP("Demo 🚀")@mcp.prompt()
def explain_sql(query: str) -> str:return f"Explaining SQL query:\n{query}"
这里,explain_sql
函数被注册为一个提示,用于解释SQL查询。
提示使用
在客户端可以通过 Client
类获取注册的提示。示例如下:
from fastmcp.client.client import Clientasync def test_get_prompt():async with Client(mcp) as client:result = await client.get_prompt("explain_sql", {"query": "SELECT * FROM users"})assert len(result.messages) == 1
4. 上下文(Context)
上下文提供了在工具执行过程中共享信息的机制。可以通过 get_context()
函数获取当前上下文。例如,在工具执行过程中记录日志:
from fastmcp import FastMCP
from fastmcp.server.context import get_contextmcp = FastMCP("Demo 🚀")@mcp.tool()
async def some_tool():context = get_context()await context.info("Tool execution started")# 工具逻辑await context.info("Tool execution finished")return "Tool result"
5. MCP客户端
FastMCP v2提供了强大的客户端功能,用于与MCP服务器进行交互。客户端可以调用服务器上注册的工具、读取资源、获取提示等。
客户端使用示例
from fastmcp.client.client import Client
from fastmcp import FastMCP
from mcp.types import TextContentasync def test_client():mcp = FastMCP("Demo 🚀")@mcp.tool()def add(a: int, b: int) -> int:"""Add two numbers"""return a + basync with Client(mcp) as client:result = await client.call_tool("add", {"a": 1, "b": 2})assert len(result) == 1assert isinstance(result[0], TextContent)assert result[0].text == "3"
高级特性
1. 代理服务器(Proxy Servers)
FastMCP支持代理服务器功能,允许将请求转发到其他MCP服务器。这在分布式系统中非常有用,可以实现负载均衡和服务拆分。
2. 组合MCP服务器(Composing MCP Servers)
可以将多个MCP服务器组合在一起,形成一个更大的服务器。例如:
from fastmcp import FastMCPmain_app = FastMCP("MainApp")
api_app = FastMCP("APIApp")def fetch_data(query: str) -> str:return f"Data for query: {query}"api_app.add_tool(fetch_data, name="get_data")
await main_app.import_server("api", api_app)
3. OpenAPI & FastAPI 生成
FastMCP支持与OpenAPI和FastAPI集成,可以自动生成API文档和接口。这使得开发者可以方便地将MCP服务器集成到现有的Web应用中。
运行服务器
在编写好服务器代码后,可以使用以下命令运行服务器:
fastmcp run server.py
总结
FastMCP v2是一个功能强大、易于使用的Python库,为构建MCP服务器和客户端提供了丰富的功能和简洁的接口。通过本文的详细介绍和代码示例,你应该对FastMCP v2的核心概念、功能用途和使用方法有了更深入的了解。希望你能利用FastMCP v2构建出更加高效、强大的MCP应用程序。
更多详细信息,请参考FastMCP的官方文档:gofastmcp.com。
相关文章:
FastMCP v2:构建MCP服务器和客户端的Python利器
FastMCP v2:构建MCP服务器和客户端的Python利器 引言 在人工智能与大语言模型(LLMs)的应用场景中,如何高效地构建服务器和客户端以实现数据交互与功能调用是关键问题。Model Context Protocol (MCP) 为此提供了一种标准…...
一个WordPress连续登录失败的问题排查
文章目录 1. 问题背景2. 解决方案搜索3. 问题定位4. 排查过程5. 清理空间6. 处理结果7. 后续优化 1. 问题背景 登录请求URL: Request URL: https://www.xxxxxx.com/wp-login.php 返回的响应头信息是: location: https://www.xxxxxx.com/wp-admin/ 证明登录成功。 接下来浏览器…...

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析
SSM整合的基础jar包 需要创建的层级: controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#x…...
Go语言超时控制方案全解析:基于goroutine的优雅实现
一、引言 在构建高可靠的后端服务时,超时控制就像是守护系统稳定性的"安全阀",它确保当某些操作无法在预期时间内完成时,系统能够及时止损并释放资源。想象一下,如果没有超时控制,一个简单的数据库查询卡住…...
spark运行架构及核心组件介绍
目录 1. Spark 的运行架构1.1 Driver1.2 Executor1.3 Cluster Manager1.4 工作流程 2. Spark 的核心组件2.1 Spark Core2.2 Spark SQL2.3 Spark Streaming2.4 MLlib2.5 GraphX 3. Spark 架构图4. Spark 的优势4.1 高性能4.2 易用性4.3 扩展性4.4 容错性 5. 总结 1. Spark 的运行…...
idea中编写spark程序
### 在 IntelliJ IDEA 中配置和编写 Spark 程序 要在 IntelliJ IDEA 中高效地开发 Spark 程序,需要完成一系列必要的环境配置以及项目搭建工作。以下是详细的说明。 --- #### 1. 安装与配置 IntelliJ IDEA 为了确保 IDE 可以支持 Scala 开发,首先需要…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(21):复习
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(21):复习 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)じょうけん 条件形1、復習 (&#x…...

MYSQL数据库集群高可用和数据监控平台
项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP:192.168.12.200 cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…...
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
在 Spark 中,可以使用 Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库。以下是一个完整的示例,展示如何实现这一过程。 环境准备 安装 MySQL:确保 MySQL 数据库已安装并运行。创建 MySQL 数据库和表:CREATE DAT…...
C++矩阵操作:正交矩阵(旋转矩阵)
文章目录 一、简介二、实现代码三、实现效果一、简介 我们知道判断一个矩阵的正交性可以看它是否符合以下条件: R T R = I R^TR=I R...
基于单片机的车灯智能控制系统设计与实现
标题:基于单片机的车灯智能控制系统设计与实现 内容:1.摘要 随着汽车行业的快速发展,车灯的智能化控制成为提升行车安全和驾驶体验的关键因素。本文旨在设计并实现一种基于单片机的车灯智能控制系统。采用单片机作为控制核心,结合光照传感器、雨滴传感器…...
机器学习第十一讲:标准化 → 把厘米和公斤单位统一成标准值
机器学习第十一讲:标准化 → 把厘米和公斤单位统一成标准值 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署:超详细手把手指南 一、买菜…...

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)
先看问题 解决方案 在HBuilderX项目中,若需在Web配置中显式关闭摇树优化(Tree Shaking),可以通过以下步骤实现:首先,在配置中打开摇树优化,然后再将其关闭。这样操作后,配置文件中会…...
大二java第一面小厂(挂)
第一场: mybatis怎么防止数据转义。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多级缓存。 websocket怎么实现的多人协作编辑功能。 怎么实现的分库分表。 mysql里面的各种操作,比如说分表怎么分,分页查询怎么用。 mybat…...

【Redis】缓存穿透、缓存雪崩、缓存击穿
1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,导致请求直接穿透缓存到达数据库,给数据库带来压力的情况。 常见的解决方案有两种: 缓存空对象:实现简单,维护方便&am…...
双目云台摄像机:双摄安防功能全方位
双目云台摄像机是一种具有革命性设计的云台摄像机设备,其核心在于其独特的双摄像头配置。以下是对这种先进安防设备的详细介绍: 一、核心原理 双目云台摄像机的核心原理在于利用两个摄像头从不同角度捕捉同一场景,通过先进的算法计算两个图…...

告别数据僵尸!Redis实现自动清理过期键值对
在这个数据爆炸的时代,内存就像珍贵的土地资源,而Redis则是这片土地上的智能管家。它不仅能高效存储数据,还能像秋叶定时凋零般,让键值对在指定时间自动消失。今天,就让我们揭开这项"数据保鲜"技术的奥秘。 …...

web第三次课后作业--基于JDBC对mysql数据库的增删查改操作
一、工程搭建步骤 1.新建java项目,添加jdbc依赖 2.写java程序 3.添加mysql数据源,连接本地数据库 4.运行程序二、运行结果 三、代码 代码解析 加载数据驱动 try {Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundExceptio…...
《P2345 [USACO04OPEN] MooFest G》
题目背景 P5094 [USACO04OPEN] MooFest G 加强版 题目描述 约翰的 n 头奶牛每年都会参加“哞哞大会”。 哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。 它们参加活动时会聚在一起,第 i 头…...
现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析
现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析 摘要:本文对 Playwright 与 Selenium 在开发适配性、使用难度、场景适用性及性能表现等方面进行了全面深入的对比分析。通过详细的技术实现细节阐述与实测数据支撑,为开发者…...
【网络协议】TCP、HTTP、MQTT 和 WebSocket 对比
从协议本质、工作原理、特点、应用场景等方面详细对比 TCP、HTTP、MQTT 和 WebSocket。 1. TCP(Transmission Control Protocol,传输控制协议) 本质 协议类型:传输层协议(OSI模型第4层)。核心功能&#x…...
Cython打包多层目录Python文件方法
为了使用Cython打包多层目录下的Python文件,并保持目录结构,请按照以下步骤操作: 步骤1:项目结构示例 假设项目结构如下: myproject/setup.pysrc/__init__.pymodule1.pysubdir/__init__.pymodule2.py步骤2ÿ…...

[数据结构]5. 栈-Stack
栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”,底部称为“栈底”。把元素添加到栈…...
2020年下半年试题三:论云原生架构及其应用
论文库链接:系统架构设计师论文 论文题目 近年来,随着数字化转型不断深入,科技创新与业务发展不断融合,各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下,以容器盒微服务…...

基于Spring Boot + Vue的高校心理教育辅导系统
一、项目背景介绍 随着高校对学生心理健康教育的重视,传统的人工心理辅导与测评模式已经难以满足广大师生的个性化需求。为了提高心理服务的效率、便捷度和覆盖范围,本项目开发了一个高校心理教育辅导系统,集成心理评测、辅导预约、留言交流…...

JavaSwing之-JDialog
JavaSwing之-JDialog JDialog 是 Java Swing 中用于创建对话框窗口的容器类,继承自 Dialog 类(AWT),常用于显示临时信息、获取用户输入或执行模态操作。它是 javax.swing.JDialog 包中的类。 与 JFrame 不同的是,JDia…...

【学习路线】 游戏客户端开发入门到进阶
目录 游戏客户端开发入门到进阶:系统学习路线与推荐书单一、学习总原则:从底层出发,项目驱动,持续迭代二、推荐学习路线图(初学者→进阶)第一阶段:语言基础与编程思维第二阶段:游戏开…...

部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm
目录 编辑 实验环境 所需软件 实验开始 安装部署gitlab171.配置清华源仓库(版本高的系统无需做)vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下载包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…...

备战菊厂笔试2-BFS记忆化MLE?用Set去重-Set会TLE?用SortedSet剪枝
目录 200.岛屿数量 不用getnei,直接在dfs判断,去掉解包 如果害怕栈溢出那么可以用bfs 2617.网格图中最少访问的格子数 注意特判! MLE主要是因为vis占用的内存过大 用SortedSet有序剪枝 什么是SortedSet? 基本性质 导入 …...
主机A向主机B发送一个长度为L字节的文件,假设TCP的MSS为1460字节,则在TCP的序号不重复使用的前提下,L的最大值是多少?
📘题干回顾: 主机A向主机B发送一个长度为L字节的文件,假设TCP的MSS为1460字节,则在TCP的序号不重复使用的前提下,L的最大值是多少? 这个问题关键在于“TCP序号不重复使用”。 ✅ 正确答案是:D.…...