FastMCP本地构建Server和Clinet交互

1. MCP Server介绍

MCP Server 是实现模型上下文协议(MCP)的服务器,旨在为 AI 模型提供一个标准化接口,连接外部数据源和工具,例如文件系统、数据库或 API。
在这里插入图片描述

相比之下,在MCP出现前,AI调用工具基本上是通过Function Call 完成的,通过Function Call 调取相关Function 或 API 调用相关工具,AI 模型根据用户提示生成函数调用指令,这些指令随后由系统执行,例如查询天气或管理文件。但是存在两个问题:

  1. 不同的大模型厂商 Function Call 的格式不一致
  2. 大量的 api 工具的输入和输出格式不一致,封装管理起来繁琐不方便

而 MCP 相当于是一个统一的 USB-C,不仅统一了不同大模型厂商的 Function Call 格式,也对相关工具的封装进行了统一。
今天 MCP 的价值也得到了越来越多的人的认可。
目前 MCP 支持两种主要的传输协议:

  1. **Stdio 传输协议:**主要针对本地,需要在用户本地安装命令行工具,对运行环境有特定要求
  2. **SSE(Server-Sent Events)传输协议:**主要针对云服务部署,基于 HTTP 长连接实现

目前市面上支持MCP的客户端主要有如Claude desktop,Cline,Cursor 等,由于claude封禁较严重,我们主要基于自建 Client,Cursor 和 Cline进行构建。

2. 基于FastMCP的简单server-client交互示例(http方式调用)

2.1 server端代码

安装依赖包:

pip install fastmcp httpx

服务端代码(server.py)

from fastmcp import FastMCP# 1. 创建 MCP 实例
mcp = FastMCP("demo-server")# 2. 用装饰器注册工具
@mcp.tool()
def greet(name: str) -> str:"""Say hello to someone."""return f"Hello, {name}!"
@mcp.tool()
def calculate(a:float,b:float,op:str) -> float:"""数学计算器(支持加减乘除)"""ops = {'+': a + b,'-': a - b,'*': a * b,'/': a / b if b != 0 else float('nan')}result = ops.get(op, float('nan'))return result# 3. 启动服务
if __name__ == "__main__":# transport 默认是 stdio,也可以换成 "http" 或 "sse"mcp.run(transport="http", host="127.0.0.1", port=9000)

在Terminal运行,注意要切换到对应的conda环境中:

python server.py

注意:如果使用jupyter运行,则需要将mcp.run(transport="http",host="127.0.0.1", port=9000)
改为
await mcp.run_async(transport="http", host="127.0.0.1", port=9000)
在这里插入图片描述

2.2. client端代码示例

客户端代码(client.py):

import asyncio
from fastmcp import Client# 1. 指定 MCP 服务器地址
config = {"mcpServers": {"demo": {"url": "http://127.0.0.1:9000/mcp","transport": "streamable-http"}}
}async def main():client = Client(config)async with client:# 2. 调用工具result1 = await client.call_tool("greet", {"name": "world"})result2 = await client.call_tool("calculate", {"a":12,"b":15,"op": "*"})calculate_result = result2.content[0].textname_result2 = result1.content[0].textprint("计算结果:", calculate_result)print("输出结果:", name_result2)if __name__ == "__main__":asyncio.run(main())

在Terminal运行,注意要切换到对应的conda环境中:

python client.py

运行结果:
运行结果

3. 基于FastMCP的简单server-client交互示例(stdio方式调用)

3.1 server端代码

from fastmcp import FastMCP# 1. 创建 MCP 实例
mcp = FastMCP("demo-server")# 2. 用装饰器注册工具
@mcp.tool()
def greet(name: str) -> str:"""Say hello to someone."""return f"Hello, {name}!"# 3. 启动服务(改为 stdio)
if __name__ == "__main__":mcp.run(transport="stdio")

运行:

python server.py

在这里插入图片描述

3.2. client端代码

import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_clientasync def main():# 1. 告诉客户端如何启动 server.pyserver_params = StdioServerParameters(command="python",args=["server.py"],env=None)# 2. 建立连接并拿到 sessionasync with stdio_client(server_params) as (read, write):async with ClientSession(read, write) as session:await session.initialize()# 3. 调用 greet 工具result = await session.call_tool("greet", arguments={"name": "Bob"})print("结果 ->", result.content[0].text)   # Hello, Bob!if __name__ == "__main__":asyncio.run(main())

运行:

python client.py

运行结果
运行结果

4. 参考链接:

MCP Server & Client教程
FastMcp简介
Python FastMCP中文文档
MCP 通信消息格式之 JSON-RPC 2.0 协议
MCP简介

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

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

相关文章

工业企业与清洁生产匹配数据库(1998-2015年)

1484工业企业与清洁生产匹配数据库(1998-2015年)“清洁生产”近年发文趋势及主题分布数据来源中华人民共和国生态环境部以及中国工业企业数据库,由数据皮皮侠团队整理时间跨度1998-2015年数据范围各工业企业数据指标参考文献孙博文,郑世林.环…

第13届蓝桥杯C++青少组中/高级组选拔赛2022年1月22日真题

第13届蓝桥杯C青少组中/高级组选拔赛2022年1月22日真题 更多内容请查看网站:【试卷中心 -----> 蓝桥杯----> C ----> 选拔赛】 网站链接 青少年软件编程历年真题模拟题实时更新 编程题 第 1 题 比大小 题目描述: 给出两个不同的整数&#…

从0到1学PHP(七):PHP 与 HTML 表单:实现数据交互

目录一、表单的创建与提交方式1.1 HTML 表单的基本结构1.2 GET 和 POST 提交方式的区别及适用场景二、表单数据的接收与处理2.1 使用\$_GET、\$_POST 超全局变量获取表单数据2.2 对接收的数据进行验证三、表单安全处理3.1 防止 XSS 攻击的方法3.2 防止 CSRF 攻击的措施一、表单…

Docker compose和Docker-compose的区别

Docker Compose 的两个命令形式 docker compose(空格连接)与 docker-compose(短横线连接)核心区别如下:一、技术本质docker-compose(短横线)独立可执行文件:早期实现方式&#xff0c…

自定心深凹槽参数检测装置及检测方法 - 激光频率梳 3D 轮廓检测

一、引言在机械零件深凹槽检测中,传统方法常因定心不准导致检测误差。如平台推表检测时零件基准面与测量平台难以精准对齐,三坐标测量需人工找正,效率低且误差大。激光频率梳 3D 轮廓检测虽精度高,但缺乏自定心机制会影响深凹槽轴…

C语言---结构体(格式、用法、嵌套、初始化)、共用体、枚举类型、typedef类型

目录 结构体与共用体 1、结构体(struct) (1) 格式与用法 (2) 结构体允许嵌套 (3) 结构体成员初始化 (4) 指针替换变量 (5) 求结构体在内存空间所占字节 2、共用体(union) (1) 格式与概念 (2) 应用 3、枚举类型(enum) (1) 格式与概念 (2) 应用 4、typedef 类型 结构体与共用…

辐射源定位方法简述

文章目录 前言 一、按照信息建模分类 1.1.时间参数 1.1.1.到达时间(TOA, Time of Arrival)定位 1.1.2.到达时间差(TDOA, Time Difference of Arrival)定位 1.2.角度参数 1.2.1.到达角度(AOA, Angle of Arrival&a…

CamX-设置SceneMode:CONTROL_SCENE_MODE_FACE_PRIORITY不生效问题解决

应用设置CONTROL_SCENE_MODE_FACE_PRIORITY设置不生效 问题:app 代码 CaptureRequest.Builder captureRequestBuilder mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);builder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTRO…

MFC CChartCtrl编程

重点:创建CChartCtrl控件有2种方式1、直接创建CChartCtrl2、窗体上添加Custom Control(切记一定不能是Static Text或者Picture Control,否则无法响应鼠标消息),然后根据ID关联CChartCtrl控件,初始化代码如下…

从0到1了解热部署

热部署(Hot Deployment)是软件开发中一种提高开发效率的技术,指的是在应用程序不停止运行的情况下,动态更新代码、配置或资源(如页面、图片等),并让这些修改立即生效的过程。热部署主要用于开发…

[12月考试] E

[12月考试] E 题目描述 给定 nnn 个正整数 a1,a2,…,ana_1,a_2,\ldots,a_na1​,a2​,…,an​,小 E 可以进行若干次交换,每一次可以交换两个相邻的整数。 求小 E 至少要交换多少次,才可以让 a1a_1a1​ 是 nnn 个数里的最小值,ana_n…

kmp复习,需要多看多练

151. 反转字符串中的单词 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string reverseWords(string s) {int n s.size();int i n - 1;string res;while(i > 0){while(i > 0 && s[i] ) i--;if(i < 0) break;int j i;while(i > …

Linux驱动开发笔记(五)——设备树(下)——OF函数

一、OF函数定义 第6.8讲 Linux设备树详解-绑定文档以及OF函数_哔哩哔哩_bilibili 《指南》43.9部分 设备树的功能就是描述设备信息&#xff0c;帮助驱动开发。那么驱动如何获取设备信息&#xff1f;获取这些信息的函数linux直接提供&#xff0c;都定义在linux-imx-rel_imx_4.…

8.2-使用字符串存储 UTF-8 编码文本

使用字符串存储 UTF-8 编码文本 我们在第4章讨论过字符串&#xff0c;但现在将更深入地探讨它们。新手 Rustacean 常常因为三个原因而卡在字符串上&#xff1a;Rust 倾向于暴露可能的错误、字符串比许多程序员想象的要复杂得多&#xff0c;以及 UTF-8。这些因素结合起来&#x…

以AI大模型重构教育新生态,打造“教-学-练-辅-评”一体化智能平台

在《中国教育现代化2035》与“教育新基建”政策驱动下&#xff0c;教育数字化转型已进入深水区。如何将AI技术深度融合于教学全流程&#xff0c;实现从“标准化”到“个性化”的跨越&#xff1f;文渊智阁推出的 AI教学大模型建设方案 &#xff0c;以“数据驱动AI潜能&#xff0…

AI在法律合同内容比对的应用实例

在商业世界的复杂交易中&#xff0c;合同是至关重要的法律保障。然而&#xff0c;随着业务的扩展&#xff0c;合同数量呈指数级增长&#xff0c;合同条款也日趋复杂。对于法务和商务团队来说&#xff0c;如何高效、准确地进行合同比对&#xff0c;成为一个亟待解决的难题。传统…

【Maven】Maven多模块拆分与依赖隔离 的终极深度解析,从 原子级配置 到 企业级架构设计,涵盖 8大核心维度

Maven多模块拆分与依赖隔离 的终极深度解析&#xff0c;从 原子级配置 到 企业级架构设计&#xff0c;涵盖 8大核心维度一、模块化工程结构设计&#xff08;黄金法则&#xff09;1. 分层架构模板2. 依赖流向控制矩阵二、依赖隔离的原子级配置1. 严格依赖管理&#xff08;父POM&…

大模型流式长链接场景下 k8s 优雅退出 JAVA

一、 java bootstrap.yml bootstrap.yml 启动文件增加timeout-per-shutdown-phase spring:lifecycle:timeout-per-shutdown-phase: 30m# 这个值是故意设置这么大的&#xff0c;因为现在推理服务支持深度思考# 为了保证用户侧的连接不被断开&#xff0c;因此我们需要设置超大 g…

uni-app用css编写族谱树家谱树

需求背景&#xff1a;公司接到一个项目&#xff0c;是需要做一个族谱微信小程序&#xff0c;需要有族谱树&#xff0c;且可以添加家族人员。 灵感来源&#xff1a;在插件市场中下载了作者 羊羊不想写代码 的插件tree-list族谱&#xff0c;树形列表&#xff0c;可缩放滑动 - DC…

思途JSP学习 0731

继0730&#xff0c;我们对项目做最后的升级一、删除功能1、新增复选框辅助删除条目的选择修改我们的list.jsp和list.js在列表的第一列增加一列选择框2、给复选框添加全选与行点击选择功能在行选择功能中&#xff0c;因为此时的选择框还未生成&#xff0c;所以我们将事件委托给他…