FastMCP 客户端服务器通信示例:从入门到实战(STDIO 传输)

引言

在现代分布式系统和AI应用中,模型上下文协议(MCP)扮演着重要角色,它负责协调客户端与服务器之间的通信,尤其是在需要频繁交互的场景中。本文将介绍如何使用FastMCP库快速实现客户端与服务器之间的通信,并通过实战案例展示其核心用法。

项目概述

本项目使用FastMCP库实现了一个简单的客户端-服务器通信示例,包含基本的工具注册与调用功能。通过本示例,你将了解FastMCP的核心概念、使用方法以及常见问题的解决方案。

项目结构

├── .venv/         # Python虚拟环境
├── client.py      # 客户端代码
├── server.py      # 服务器代码
└── README.md      # 项目说明文档

实现步骤

步骤1: 创建虚拟环境并安装依赖

首先,我们需要创建一个独立的Python虚拟环境并安装必要的依赖:

  1. 创建Python虚拟环境:

    python -m venv .venv
    
  2. 激活虚拟环境:

    # Linux/Mac系统
    source .venv/bin/activate# Windows系统
    .venv\Scripts\activate
    
  3. 安装FastMCP库:

    pip install fastmcp
    

步骤2: 编写服务器代码

创建server.py文件,实现一个简单的MCP服务器,该服务器将提供一个hello工具供客户端调用:

# 导入FastMCP类,用于创建MCP服务器
from fastmcp import FastMCP# 创建FastMCP服务器实例,命名为"Demo"
mcp = FastMCP("Demo")# 使用装饰器注册一个名为"hello"的工具函数
@mcp.tool
def hello(name: str) -> str:"""向指定名称的用户发送问候参数:name: 字符串,要问候的用户名称返回:字符串,包含问候语的响应"""return f"Hello, {name}!"# 当脚本作为主程序运行时
if __name__ == "__main__":# 启动MCP服务器# 默认使用STDIO传输方式,通过标准输入输出与客户端通信mcp.run()

代码解析

  • 我们通过FastMCP类创建了一个服务器实例,并命名为"Demo"
  • 使用@mcp.tool装饰器注册了一个名为hello的工具函数
  • 该工具函数接收一个name参数,并返回相应的问候语
  • 服务器默认使用STDIO(标准输入输出)作为传输方式
  • 最后通过mcp.run()启动服务器

步骤3: 编写客户端代码

创建client.py文件,实现一个连接到服务器的客户端:

# 导入asyncio模块,用于支持异步操作
import asyncio
# 导入Client类,用于创建MCP客户端
from fastmcp import Client# 创建Client实例,连接到名为"server.py"的服务器脚本
# 客户端会自动推断使用STDIO传输方式与服务器通信
client = Client("server.py")# 定义异步函数call_tool,用于调用服务器上的工具
async def call_tool(name: str):"""异步调用服务器上的hello工具参数:name: 字符串,要传递给hello工具的名称参数返回:无返回值,但会打印服务器的响应结果"""# 使用异步上下文管理器连接到服务器async with client:# 调用服务器上的hello工具,传递name参数result = await client.call_tool("hello", {"name": name})# 打印服务器返回的结果print(result)# 运行异步函数call_tool,传入默认名称"Ford"
asyncio.run(call_tool("Ford"))

代码解析

  • 我们创建了一个Client实例,指定要连接的服务器脚本
  • 定义了异步函数call_tool用于调用服务器上的工具
  • 使用异步上下文管理器async with client来管理与服务器的连接
  • 通过await client.call_tool()方法调用服务器上的hello工具
  • 最后使用asyncio.run()运行异步函数,启动客户端

步骤4: 解决通信问题

在实现过程中,我们遇到了几个典型问题并成功解决:

  1. 传输方式识别问题

    • 问题:最初客户端无法自动识别"stdio"传输方式
    • 解决:通过查看源码了解到FastMCP使用PythonStdioTransport类处理标准输入输出通信,客户端会根据服务器类型自动选择合适的传输方式
  2. 连接管理问题

    • 问题:不清楚如何正确管理客户端与服务器的连接状态
    • 解决:FastMCP Client采用异步上下文管理器模式进行连接管理,替代了显式的connect()disconnect()方法,使用async with client即可自动管理连接的建立和关闭
  3. 工具调用参数问题

    • 问题:工具调用时参数传递不正确
    • 解决:call_tool方法需要使用name参数指定工具名称,第二个参数为工具所需的参数字典
  4. 工具名称匹配问题

    • 问题:客户端调用工具时提示找不到工具
    • 解决:确保客户端调用的工具名称与服务器注册的工具名称完全匹配,包括大小写

步骤5: 运行和测试

完成代码编写后,我们可以按照以下步骤运行和测试:

  1. 首先启动服务器,在终端中执行:
    python server.py
    

在这里插入图片描述

  1. 打开另一个终端,激活相同的虚拟环境,运行客户端:

    python client.py
    
  2. 客户端将输出服务器的响应结果:

    CallToolResult(content=[TextContent(type='text', text='Hello, Ford!', annotations=None, meta=None)], structured_content={'result': 'Hello, Ford!'}, data='Hello, Ford!', is_error=False)
    

步骤6: trae中集成MCP

  1. 在trae ide中点击手动添加MCP
    在这里插入图片描述
  2. 把这段json输入进去
{"mcpServers": {"local-mcp-server": {"command": "bash","args": ["-c","source /mcp-test/.venv/bin/activate && python /mcp-test/server.py"],"cwd": "/mcp-test"}}
}

在这里插入图片描述
3. 看到这个小绿对钩就是成功了
在这里插入图片描述
4. 在对话中输入“张三”,可以看到正常调用我们自定义的MCP服务
在这里插入图片描述

技术要点总结

  1. FastMCP库核心概念

    • FastMCP提供了简单易用的API,简化了MCP客户端-服务器通信的实现
    • 服务器通过装饰器注册工具,客户端通过名称调用这些工具
  2. STDIO传输方式

    • 默认使用标准输入输出进行进程间通信
    • 无需网络配置,适合本地进程间的简单通信场景
  3. 异步编程模型

    • 客户端基于asyncio实现异步操作
    • 使用异步上下文管理器管理连接生命周期
    • 通过await关键字处理异步工具调用
  4. 工具注册与调用

    • 服务器使用@mcp.tool装饰器注册工具函数
    • 客户端使用call_tool方法调用服务器上的工具
    • 工具参数以字典形式传递,支持复杂数据结构

扩展与优化建议

  1. 对于生产环境,可以考虑:

    • 使用更可靠的传输方式(如TCP)
    • 添加身份验证和数据加密
    • 实现错误重试机制
    • 添加日志记录和监控
  2. 功能扩展:

    • 注册多个工具函数,实现更复杂的业务逻辑
    • 添加工具调用的超时处理
    • 支持更复杂的参数类型和返回值
    • 实现批量工具调用功能

结论

通过本文的示例,我们展示了如何使用FastMCP库快速实现客户端与服务器之间的通信。FastMCP提供了简洁的API和灵活的扩展能力,使开发者能够专注于业务逻辑的实现,而无需过多关注底层通信细节。无论是在AI模型交互、分布式系统协调还是普通的进程间通信场景,FastMCP都是一个值得尝试的优秀选择。

希望本文能帮助你快速入门FastMCP的使用,如果有任何问题或建议,欢迎在评论区留言讨论!

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

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

相关文章

宝可梦肉鸽 PC/手机双端 多种存档 全闪光 无限金币 全宝可梦解锁 免安装中文版

网盘链接: 宝可梦肉鸽 免安装中文版 名称:宝可梦肉鸽 PC/手机双端 多种存档 全闪光 无限金币 全宝可梦解锁 免安装中文版 描述:宝可梦肉鸽修改版是一款非常受欢迎的口袋妖怪系列,游戏拥有许多独特的妖怪和玩法。在游戏中&#…

Linux 下的网络编程

1、目的实现不同主机上进程间的通信。2、问题主机与主机之间在物理层面必须互联互通。进程与进程在软件层面必须互联互通。IP地址:计算机的软件地址,用来标识计算机设备。MAC地址:计算机的硬件地址(固定)。网络的端口号…

Go语言在边缘计算中的网络编程实践:从入门到精通

一、引言 在数字化浪潮席卷全球的今天,边缘计算如同一股清流,正在重新定义我们对网络架构的理解。想象一下,当你在自动驾驶汽车中需要毫秒级响应,或者在偏远工厂中需要实时处理传感器数据时,传统的云计算模式就像是&qu…

ASPICE过程能力确定——度量框架

🚗【汽车人必看】ASPICE能力评估核心:度量框架全解析|90%工程师都搞不懂的评分规则!🔍 为什么你的ASPICE评估总卡在L2?——揭秘6大能力等级背后的评分逻辑,附提升秘籍!🔥…

机器学习在量化中的应用

一、核心应用场景在因子研究中,scikit-learn 主要解决以下几类问题:因子预处理与标准化:StandardScaler, RobustScaler因子有效性分析:LinearRegression (IC分析)降维与因子合成:PCA, FactorAnalysis机器学习预测模型&…

RabbitMQ:消息转化器

目录一、基本概述二、如何处理一、基本概述 在RabbitMQ中,一般情况下传递字符串会被正常解析,如果传递的是一个Object类型或者是一个对象类型的时候,RabbitMQ会将其自动转化为字节码发送,这不利于我们的读取个解析。 二、如何处…

【Protues仿真】基于AT89C52单片机的LCD液晶显示屏显示控制

目录 1 LM016L液晶显示模块 1.1 基本参数 1.2 引脚定义 1.3硬件连接示例(AT89C52) 1.4 常用指令集(HD44780 子集) 1.5 常见问题与注意事项 1.8 结论 2 LM016L液晶显示模块控制电路原理图 3 LM016L液晶显示模块控制程序 …

孤独伤感视频素材哪里找?分享热门伤感短视频素材资源网站

你是不是也经常在抖音上刷到很火的伤感视频,那么伤感视频素材都在哪里可以下载呢?作为一名从业多年的视频剪辑师,今天就跟大家聊聊那些可以下载伤感素材高清无水印的网站,如果你也在苦苦找寻伤感素材,快来看看吧&#…

笔记本怎么才能更快散热?

一、“物理降温法”​▪️ 垫高高!别让底部 “窒息”​笔记本底部全是进风口,放床上 / 沙发上会被堵住!垫点东西拉开底部空间,高度 1-2cm。​▪️ 给风扇 “松绑”​按「CtrlShiftEsc」打开任务管理器,点 “进程”&…

电机驱动实现插补算法之脉冲和方向接收(以stm32主控为例)

一、方案 A(推荐):编码器模式吃脉冲(TI1 STEP,TI2 DIR) 核心思路 把定时器设为 Encoder TI1 模式:每个 STEP 上升沿计一次,在那个沿的瞬间用 TI2(DIR)的电…

[特殊字符] 潜入深渊:探索 Linux 内核源码的奇幻之旅与生存指南

文章目录 朋友们,敲黑板!!!(超级重要)我们今天聊点硬核的——不是普通的代码,而是驱动了整个数字世界心跳的Linux内核源代码!它藏在哪?就在那个传奇仓库:torv…

如何监控和管理微服务之间的调用关系

监控和管理微服务之间的调用关系需要结合分布式追踪、服务依赖分析、实时监控和可视化工具,以实现对调用链路的可见性、问题定位和性能优化。以下是具体的实现方案和工具链:一、核心监控目标调用链路可视化:展示服务间的调用关系、方向和频率…

3.4 缩略词抽取

概述 缩略词指的是一个词或者短语的缩略形式,其通常由原词中的一些组成部分构成,同时保持原词的含义。缩略词的检测与抽取在方法上与同义词的检测与抽取类似,但是相比同义词,缩略词在文本中出现的规则往往更简单。 不同语言缩略词…

Lua脚本如何执行主程序的C函数

Lua Call C function Lua脚本可以和C函数灵活的结合,Lua脚本作为控制语言,使用C函数来做性能计算部分。 Lua脚本的执行器有Lua 和 Luajit。 使用Lua执行器,可以通过C语言注册C函数到Lua State, 然后Lua脚本可以调用该C函数。 使用Luajit&…

农业-学习记录

1-git上传(简易版)首先,记得vscode打开的项目路径是/home/Agribrain。不然会提示上传很多项目无关的文件。① 暂存所有更改②使用vscode终端注意:终端打开路径:/home/Agribrain/agribrain【git项目的所在目录】&#x…

什么是数据集成?数据集成对数据治理有什么影响

在大数据与人工智能驱动的时代,数据已经成为企业的“新型生产力”。然而,企业内部数据往往分散在不同系统、不同格式、甚至不同地域中。如果缺乏有效管理与整合,数据价值就无法真正释放。这时,“数据集成”应运而生,它…

技术成长战略是什么?

文章目录技术成长战略是什么?1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议技术成长战略是什么? 1. 前言 在波波的微信技术交流群里头&am…

从0到1打造一台机器人走起来

聚焦仿人双足机器人,着重解决其下肢鲁棒行走中仿真到实机间隔(SimToReal gap)的误差问题 总述 硬件:采用傅利叶智能科技一体化关节模组: 1)胯部和膝关节选用 FSA80 - 29E 电机,以承受较大扭矩; 2)大腿部分采用 FSA60 - 43E 电机,兼顾扭矩和转速需求; 3)小腿选用 …

【Cmake】Cmake概览

目录 一.环境准备 1.1.Cmake安装 1.2. VSCodeCMake插件安装 1.3 快速样例-helloworld⼯程 二. cmake的基础命令⾏使用示例 2.1.文件准备 2.2.⽣成构建系统 2.3.编译连接 2.4.测试Ctest模块 2.5.测试安装模块 2.6.测试打包模块 2.7 查看帮助 CMake语法简洁清晰&…

概率核心概念学习笔记:随机事件与样本空间、古典概率与条件概率、全概率公式与贝叶斯公式

目录 一、 随机事件与样本空间 1. 原理讲解 2. 类型与关系 3. 案例计算 4. 应用场景 二、 古典概率与条件概率 1. 古典概率 (Classical Probability) 2. 条件概率 (Conditional Probability) 三、 全概率公式与贝叶斯公式 1. 全概率公式 (Law of Total Probability) …