FastMCP v2:构建MCP服务器和客户端的Python利器

news2025/5/15 17:57:56

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 FastMCP

mcp = 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 TextContent

async def test_call_tool():
    async with Client(mcp) as client:
        result = await client.call_tool("add", {"a": 1, "b": 2})
        assert len(result) == 1
        assert isinstance(result[0], TextContent)
        assert result[0].text == "3"

2. 资源与模板(Resources & Templates)

资源类似于HTTP的 GET 请求,用于加载信息到上下文。模板则是用于动态生成资源的一种机制。资源可以是文件内容、数据库查询结果等。

资源注册

可以通过 @mcp.resource() 装饰器将一个函数注册为资源。例如:

from fastmcp import FastMCP
from pathlib import Path

mcp = 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 TextResourceContents

async def test_read_resource():
    async with Client(mcp) as client:
        result = await client.read_resource("file://test_dir/config.json")
        assert len(result) == 1
        assert isinstance(result[0], TextResourceContents)

3. 提示(Prompts)

提示是可重用的模板,用于定义与LLM的交互模式。在与大语言模型交互时,提示可以帮助引导模型生成更符合预期的结果。

提示注册

可以通过 @mcp.prompt() 装饰器将一个函数注册为提示。例如:

from fastmcp import FastMCP

mcp = 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 Client

async 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_context

mcp = 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 TextContent

async def test_client():
    mcp = FastMCP("Demo 🚀")

    @mcp.tool()
    def add(a: int, b: int) -> int:
        """Add two numbers"""
        return a + b

    async with Client(mcp) as client:
        result = await client.call_tool("add", {"a": 1, "b": 2})
        assert len(result) == 1
        assert isinstance(result[0], TextContent)
        assert result[0].text == "3"

高级特性

1. 代理服务器(Proxy Servers)

FastMCP支持代理服务器功能,允许将请求转发到其他MCP服务器。这在分布式系统中非常有用,可以实现负载均衡和服务拆分。

2. 组合MCP服务器(Composing MCP Servers)

可以将多个MCP服务器组合在一起,形成一个更大的服务器。例如:

from fastmcp import FastMCP

main_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。

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

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

相关文章

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析

SSM整合的基础jar包 需要创建的层级: controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#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…

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)

先看问题 解决方案 在HBuilderX项目中,若需在Web配置中显式关闭摇树优化(Tree Shaking),可以通过以下步骤实现:首先,在配置中打开摇树优化,然后再将其关闭。这样操作后,配置文件中会…

【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…

[数据结构]5. 栈-Stack

栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”,底部称为“栈底”。把元素添加到栈…

基于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? 基本性质 导入 …

【RabbitMQ】发布确认机制的具体实现

文章目录 模式介绍建立连接单独确认代码实现逻辑运行结果 批量确认代码实现逻辑运行结果 异步确认实现逻辑介绍代码实现逻辑运行结果 三种策略对比以及完整代码 模式介绍 作为消息中间件,都会面临消息丢失的问题,消息丢失大概分为三种情况: …

React状态管理-对state进行保留和重置

相同位置的相同组件会使得 state 被保留下来 当你勾选或清空复选框的时候&#xff0c;计数器 state 并没有被重置。不管 isFancy 是 true 还是 false&#xff0c;根组件 App 返回的 div 的第一个子组件都是 <Counter />&#xff1a; 你可能以为当你勾选复选框的时候 st…

vue和springboot交互数据,使用axios【跨域问题】

vue和springboot交互数据&#xff0c;使用axios【跨域问题】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&…

AJAX 使用 和 HTTP

ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML&#xff1a; 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用&#xff1f;表示之后的参数…

MySQL之基础事务

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …

MySQL基础关键_013_常用 DBA 命令

目 录 一、MySQL 用户信息存储位置 二、新建用户 1.创建本地用户 2.创建外网用户 三、用户授权 1.说明 2.实例 四、撤销授权 五、修改用户密码 六、修改用户名、主机名/IP地址 七、删除用户 八、数据备份 1.导出数据 2.导入数据 &#xff08;1&#xff09;方式…

java基础:异常体系

目录 一、java异常体系介绍二、异常1、运行时异常2、非运行时异常 三、错误四、异常的处理方式1、方式1&#xff1a;throws声明抛出异常1.1、throws关键字1.2、throw关键字 2、方式2&#xff1a;try-catch-finally 一、java异常体系介绍 异常体系图如下&#xff1a; Throwable…

记录算法笔记(20025.5.14)对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; 树中节点数目…