玩转MCP
玩转MCP
- 0.环境
- 1.自定义stdio交互
- 1.1.server
- 1.2.client
- 1.3.效果
- 2.自定义sse交互
- 2.1.server
- 2.2.client
- 2.3.效果
- 3.使用官方文件
mcp火了好一阵了,最近一直在大院干活儿,好不容易抽出时间,赶紧来学习学习。
官方文档, mcp广场可以搜索自己需要的server服务,都是些saas服务,其实就是把各家的server下载到本地然后调用。官方分stdio和sse两种交互模式。我这里都用代码自定义,方便项目应用,代码放到仓库了。需要使用claude,vscode等的可以自行搜索使用方法,我这里不涉及。
0.环境
conda create -n mcp python==3.12
conda activate mcp
pip install mcp openai
1.自定义stdio交互
1.1.server
服务端包括三部分:创建mcp客户端,然后写自己的tool都带上@mcp.tool()注解,最后run(这里确定使用stdio方式还是sse方式)
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my_server", version="1.0.0")@mcp.tool()
def use_my_camera()-> None:passif __name__ == "__main__":mcp.run(transport='stdio')
仓库代码里我写的四个tool,打开本地相机,向本地写入文件,打开spotify并播放某首歌曲,给我一个leetcode题目,写的比较糙,慎用,需要的可以去下载官网的。
这里我在调用spotify的时候记得要去https://developer.spotify.com/dashboard创建自己的开发者账户,拿到自己的client_id和client_secret,这里redirect url最好要写http://127.0.0.1:8888/callback/
1.2.client
客户端包括三部分:连接大模型(我用ollama,qwen2.5),连接mcp服务器(这里stdio和sse有区别),处理用户请求(将大模型和mcp服务建立连接,这里需要根据自己的模型效果改改逻辑)。
import asyncio
from typing import Optional
from contextlib import AsyncExitStack
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from openai import OpenAI
import json
import sys
class MCPClient:def __init__(self):# 初始化会话和客户端对象self.session: Optional[ClientSession] = None # 使用会话管理和 API 客户端进行初始化self.exit_stack = AsyncExitStack() # 使用AsyncExitStack管理资源self.openai_api_key = "ollama" self.base_url = "http://192.168.3.36:11434/v1" #Ollama 服务器的 IP 地址self.model = "qwen2.5:latest" # Ollama 模型名称self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)async def connect_to_server(self, server_script_path: str):"""连接到MCP服务器Args:server_script_path (str): 服务器脚本路径(.py 或.js)"""if not server_script_path.endswith(('.py', '.js')):raise ValueError("服务器脚本必须是.py 或.js 文件")command = "python" if server_script_path.endswith('.py') else "node"server_params = StdioServerParameters(command=command,args=[server_script_path],env=None)stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))self.stdio, self.write = stdio_transportself.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))# 初始化会话并列出可用工具await self.session.initialize()response = await self.session.list_tools()tools = response.toolsprint("\n已连接到服务器, 可用工具:", [tool.name for tool in tools])async def process_query(self, query: str) -> str:"""处理查询,使用Claude和可用工具Args:query (str): 用户输入的查询Returns:str: 处理后的响应内容"""# 构造消息对象messages = [{"role": "user","content": query}]# 获取可用工具列表response = await self.session.list_tools()# 将工具列表转换为需要的格式available_tools = [{"type": "function","function": {"name": tool.name,"description": tool.description,"input_schema": tool.inputSchema}}for tool in response.tools]# 第一次调用Claude API# print("进入》》》》》》》process_query")response = self.client.chat.completions.create(model=self.model,messages=messages,tools=available_tools)print("response",response)# 获取API响应的内容content = response.choices[0].messagefinal_text = []assistant_message_content = []if content.tool_calls:# 获取工具调用信息tool_call = content.tool_calls[0]tool_name = tool_call.function.nametool_args = json.loads(tool_call.function.arguments)# 调用工具result = await self.session.call_tool(tool_name, tool_args)final_text.append(f"[Calling tool {tool_name} with args {tool_args}]")assistant_message_content.append(content)print(f"\n\n[正在用工具 {tool_name}, 参数为 {tool_args}]\n\n")# 修正消息列表更新逻辑messages.append({"role": "assistant","content": "","tool_calls": [tool_call]})messages.append({"role": "tool","content": result.content[0].text if result.content[0].text else "","name": tool_name,"tool_call_id": tool_call.id})response = self.client.chat.completions.create(model=self.model,messages=messages,tools=available_tools)print("response",response)# 获取API响应的内容content = response.choices[0].messagefinal_text.append(content.content)# 如果没有调用工具,直接返回响应内容else:final_text.append(content.content)assistant_message_content.append(content)return "\n".join(final_text)async def chat_loop(self):"""运行交互式聊天循环"""print("\nMCP 客户端已启动!")print("请输入您的查询或输入 'quit' 退出。")while True:try:query = input("user input:").strip()if query.lower() == 'quit':breakresponse = await self.process_query(query)print("\n" + response)except Exception as e:print(f"\n错误: {str(e)}")async def cleanup(self):"""清理资源"""await self.exit_stack.aclose()async def main():if len(sys.argv) < 2:print("用法: python client.py <path_to_server_script>")sys.exit(1)client = MCPClient()try:await client.connect_to_server(sys.argv[1])await client.chat_loop()finally:await client.cleanup()if __name__ == "__main__":asyncio.run(main())
1.3.效果
运行
python client.py server.py
输入命令进行测试,我的命令(写一封500字告白信到我本地,给我播放一首好日子,我想练一个简单的二分法,打开本地相机)。
还可以使用网页端测试效果
pip install mcp[cli]
mcp dev server.py
2.自定义sse交互
sse交互与stdio差别很小,这里只写区别
2.1.server
这里初始化mcp的时候给一个端口号,运行的时候使用sse模式,剩下工具的定义都不变。
mcp = FastMCP("my_server", version="1.0.0", port=8000)
@mcp.tool()
if __name__ == "__main__":mcp.run(transport='sse')
2.2.client
client这里就是连接mcp服务的时候与stdio不同,然后在main里面调用的时候传递的就是server启动的url地址
async def connect_to_server(self, url: str):"""连接到基于 HTTP SSE 的 MCP 工具服务器"""sse_transport = await self.exit_stack.enter_async_context(sse_client(url))self.session = await self.exit_stack.enter_async_context(ClientSession(*sse_transport))await self.session.initialize()response = await self.session.list_tools()tools = response.toolsprint("\n已连接到服务器, 可用工具:", [tool.name for tool in tools])
async def main():client = MCPClient()try:await client.connect_to_server('http://0.0.0.0:8000/sse')await client.chat_loop()finally:await client.cleanup()
2.3.效果
启动服务端python server.py
启动客户端python client.py
网页端测试mcp dev server.py
3.使用官方文件
这里我测试了一个操作键鼠,截屏等操作的ScreenPilot,首先git代码,进入环境。
安装依赖包pip install -r requirements.txt
他的代码是stdio的交互(我没找到sse的),所以client我就用第一个stdio里面的,server就用官方的main文件,所以运行python C:\Users\robot\Desktop\mcp\stdio\client.py C:\Users\robot\Desktop\mcp\ScreenPilot\main.py
就可以调用这个服务。
相关文章:
玩转MCP
玩转MCP 0.环境1.自定义stdio交互1.1.server1.2.client1.3.效果 2.自定义sse交互2.1.server2.2.client2.3.效果 3.使用官方文件 mcp火了好一阵了,最近一直在大院干活儿,好不容易抽出时间,赶紧来学习学习。 官方文档, mcp广场可以…...
2025华东杯A/B/C题解题思路+可运行代码参考
A题:跳台滑雪问题 选题分析: 跳台滑雪问题涉及物理学、运动学和优化算法。需要建立数学模型来分析运动员在不同阶段的最佳姿势和策略,以提高运动成绩。问题分为三个小问,分别是助滑坡姿势、空中飞行控制和着陆策略。 解题思路: 1. 助滑坡姿势: 分析助滑坡的物理特性,…...
IsaacLab最新2025教程(7)-创建Interactive Scene
在isaaclab中创建的强化学习训练环境有两种:direct workflow,风格与isaacgym一样。另外一种是manager-based workflow更加模块化,它主要是两部分包括仿真环境也就是即将介绍的interactive scene,与mdp的内容,比如奖励函…...
Linux远程管理
1.网络管理获取计算机的网络信息基本语法:windows ipconfig<img src"ReadMe.assets/image-20250318152355476.png" alt"image-20250318152355476" style"zoom:33%;" />powershell ifconfig 也可以通过上面的网络处获取powershe…...
双指针(4)——盛水最多的容器
题目: 这题可以暴力枚举,但会超时,所以我们要用其他方法。 我们就用示例1的数组为例,我们先取出一部分研究。 虽然我们不能用暴力枚举,但可以借用其思想。 对于6和4组成的容器,它可以储存24个单位的水。…...
sd webui 安装插件sd-webui-EasyPhoto依赖安装失败解决办法
在最新版的SD webui中,可以安装easyphoto插件,官方建议通过github安装,对无法科学上网的用户很不友好。对我自己来说是通过地址: https://gitee.com/wowai/sd-webui-EasyPhoto.git 分支:anyid 点击安装即可。 在安装…...
虚拟机对前端开发的实用价值:提升效率与解决痛点的完整指南
作为前端开发者,虚拟机可能不是你日常工作的核心工具,但它确实能在多个方面为前端开发提供强大支持。下面我将详细解析虚拟机如何帮助前端开发者提升工作效率、解决开发难题。 一、跨浏览器/跨平台测试环境搭建 1.1 多浏览器测试 真实IE测试ÿ…...
用Playwright自动化网页测试,不只是“点点点”
如果你接触过网页自动化测试,可能听说过 Selenium、Puppeteer 这些工具。但最近几年,一个新的开源项目在测试圈子里悄然兴起——它就是 Playwright 。 Playwright 是微软开发的一个自动化库,支持多种浏览器(包括 Chrome、Firefox…...
合并两个有序数组
题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并…...
系统思考:局部最优与全局失衡
最近遇到一家创业公司的创始人,在复盘时说了一句扎心的话:“我们真的已经很努力了,大家每天都在拼,连周末都不休息……但事还是做不完,进展还是很慢。” 我和几个关键岗位员工聊了聊,他们也说:“…...
Windows 系统中安装 flash - attn
#工作记录 一、下载 flash_attn 在 Windows 系统中,直接使用 pip 在线安装 flash_attn 很可能失败。 建议从 kingbri1/flash-attention 的 GitHub 发布页面 下载与当前 Python、torch 和 CUDA 版本匹配的 .whl 文件,并从本地进行安装。 Linux版本&am…...
理想药用植物的特征综述-理想中药材”的系统定义-文献精读125
Decoding and designing: Promising routes to tailor-made herbs 解码与设计:定制化草药的潜力路径 摘要 理想药用植物的特征可归纳为高次生代谢产物含量、高抗逆性、理想的形态以及高产量。本研究提出了两种策略,用于解析中药活性成分的生物合成与质…...
Cline原理分析-prompt
Cline 抓包-prompt原文 You are Cline, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices. TOOL USE You have access to a set of tools that are executed upon the user’s…...
allegro 怎样显示/隐藏铜皮shape?
1、setup–>User preferences; 2、Display -->shape_fill ; 3、5个方框打“√”代表隐藏铜皮; 4、不打√代表显示铜皮;...
URP - 公告牌的效果实现
效果: 【太妃糖耶】我的最新作品,快来一睹为快! 原理:使面片的正面永远跟随摄像机的旋转 首先我们可以了解一下顶点旋转的原理 B点是由原坐标系中的基向量和A点坐标值相乘得到的 当旋转此基向量后,B点的坐标值会发生…...
在VTK中使用VTKCamera
文章目录 概要Cpp代码概要 在VTK(Visualization Toolkit)中,vtkCamera 类用于控制三维场景中相机的视角。相机决定了你从哪个角度和位置观察三维场景。使用 vtkCamera 的一般步骤包括创建相机对象、配置相机参数、将相机设置为渲染器的活动相机,以及更新相机视图。 Cpp代…...
牛客:AB4 逆波兰表达式求值
链接:逆波兰表达式求值_牛客题霸_牛客网 题解: 利用栈,遍历字符串数组,遇到运算数则入栈,遇到运算符则取出栈顶两个运算数进行运算,并将运算结果入栈。 class Solution { public:/*** 代码中的类名、方法…...
Linux:文件操作
在C语言中,我们可以使用fopen() fclose() fread() fwrite()等接口进行文件操作,而由于文件是储存于磁盘中的,且磁盘是由操作系统来管理的,因此在用户层面对文件的操作必然要调用操作系统对文件的操作。 我们接下来就要了解操作系…...
Gin 集成 prometheus 客户端实现注册和暴露指标
在 Gin 框架中集成 Prometheus 监控系统,可以帮助开发者实时收集和展示应用程序的性能指标,便于监控和故障排查。 Prometheus 是一个开源的监控和告警系统,最初由 SoundCloud 开发,现已成为 Cloud Native Computing Foundation (…...
欢度我们的节日
众所周知,一年一度的“五一”小长假就要来了。先预祝各位兄弟姐妹们假期快乐,天天好心情! 你们在节前的最后一天是处于什么状态呢?是不是已经处理好手中的工作静待明日的旅程?还是忙忙碌碌担心搞不完要加班?…...
03_Mybatis-Plus LambadaQueryWrapper 表达式爆空指针异常
🌟 03_MyBatis-Plus LambdaQueryWrapper 爆出空指针异常的坑点分析 ❓ 场景描述 来看一段常见的 MyBatis-Plus 查询写法,是否存在问题? Page<VideoInfoVo> videoInfoVosPage videoMapper.selectPage(page, new LambdaQueryWrapper&…...
左右分屏电商带货视频批量混剪自动剪辑生产技术软件:智能剪辑与合规化方案解析
一、引言:电商视频营销的工业化生产需求 在电商带货领域,高效产出差异化视频内容是提升转化率的核心竞争力。本文结合实战经验,解析基于智能分屏算法、动态素材重组、多维度参数配置的工业化剪辑方案,构建可复用的自动化生产流水…...
全面解析SimHash算法:原理、对比与Spring Boot实践指南
一、SimHash算法概述 SimHash是一种局部敏感哈希算法,由Google工程师Moses Charikar提出,主要用于海量文本的快速去重与相似度检测。其核心思想是将高维特征向量映射为固定长度的二进制指纹(如64位),通过计算指纹间的…...
【Docker】Docker拉取部分常用中间件
一、拉取MySQL 这里以Docker拉取MySQL5.7为例 #拉取镜像 docker pull mysql:5.7 docker run -d --name oj-mysql -p 3306:3306 -e "TZAsia/Shanghai" -e "MYSQL_ROOT_PASSWORD123456" mysql:5.7 -e 参数用于设置容器内的环境变量。TZ 是用于设置时区的环…...
表征(Representations)、嵌入(Embeddings)及潜空间(Latent space)
文章目录 1. 表征 (Representations)2. 嵌入 (Embeddings)3. 潜空间 (Latent Space)4. 关系总结5. 学习思考 1. 表征 (Representations) 定义: 表征是指数据的一种编码或描述形式。在机器学习和深度学习中,它特指模型在处理数据时,将原始输入数据转换成…...
google colab设置python环境为python3.7
最近在看transformers for machine learning:A Deep Dive这本书,发现书里的python版本是python3.7,但是当前google colab默认的python版本为3.12,带来诸多不便,因此需要将colab版本切换为python3.7的python环境。 1.下载需要的版…...
Kaggle比赛入门攻略(以 Titanic 为例)
为什么选择 Kaggle 入门比赛? Kaggle 是全球最大的数据科学竞赛平台。入门比赛 Titanic: Machine Learning from Disaster 是初学者的理想起点,数据量小、结构简单、题目经典。 Step 1:注册并加入比赛 访问比赛地址:https://www…...
【数据链路层深度解析】从帧结构到协议实现
目录 一、数据链路层核心定位1.1 OSI模型中的位置1.2 三大核心职责 二、帧结构详解2.1 以太网帧标准格式(IEEE 802.3)2.2 帧封装代码示例 三、核心协议机制3.1 MAC地址体系3.2 介质访问控制CSMA/CD(以太网冲突检测)现代交换机的演…...
大连理工大学选修课——机器学习笔记(5):EMK-Means
EM&K-Means 无监督学习 什么是无监督学习 模型从无标签的数据中自动发现隐藏的模式或结构聚类是最常用的方法 为什么要研究无监督学习 标记样本代价太大分类模式不断变化,标记易过时 数据的分布 参数方法 高斯分布、伯努利分布、多指分布等 非参数方法 局部模…...
算法基础学习|03整数二分
一、思路 (1)mid(lr1)/2 if(check(mid)):1.true [mid,r] lmid 2.false [l,mid-1] rmid-1 (2)mid(lr)/2 if(check(mid)):1.true [l,mid] rmid 2.false [mid1,r] lmid1 二、模板 如何选择模…...
婴幼儿急救实训室优化空间布局科学路径5.7
婴幼儿急救实训室的建设是提升托育服务质量、保障婴幼儿生命安全的关键环节。在当前托育行业快速发展的背景下,加强婴幼儿急救实训室建设,对于培养专业急救人才、提高急救技能水平具有重要意义。凯禾瑞华——实训室建设 一、搭建实操平台:沉浸…...
智能体开发
智能体开发是构建具备感知、决策和执行能力的智能系统的过程,核心围绕环境交互和自主决策展开。以下是关键要点: 一、开发流程 1. 需求定义 - 明确智能体目标(如对话交互、自动化任务、数据分析等)。 - 确定应用场景(…...
全球气象站点年平均降水数据(1929-2024)
ppmandata.cn借鉴Compustat、WRDS等国际知名数据库及FT50期刊专业标准,打造中国特色经济管理社会科学研究型数据库。涵盖上市公司、省份、地级市、专精特新等研究对象,涵盖经济、法律、金融、政策、科技、文化、健康、环保、人口等各类热点数据。顶刊标准…...
c++漏缺: stl等 初始化 用法 sort
目录 数组初始化:c int a[5]{1,2,3,4,5};int b[5]a;后面改变b对a有无影响 int pre[n]nums[0]对吗 初始化为0呢 方法1:使用循环初始化 方法2:使用memset函数 方法3:使用初始化列表(C99及以后) 方法4&…...
usb端点笔记
端点:端点是USB设备的唯一可识别部分,其是主机和设备之间的通信流的终点。是一个USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据。(逻辑上) 接口:可以理解为一个功能。(物理功能…...
多智能体协同作战:MagenticOne如何指挥一支AI团队
你有没有想过,如果能让多个AI智能体像高效团队一样协同工作会怎样?每个成员各司其职,却又紧密配合。今天,我们就来聊聊AI世界的"特工组织"——多智能体系统,尤其是最近热门的MagenticOne架构。 ᾞ…...
C++静态编译标准库(libgcc、libstdc++)
在使用GCC编译器时,部分版本默认动态加载标准库。如果客户机器上没有安装相应库,就会提示找不到:libgcc_s_seh-1.dll、libstdc-6.dll、libwinpthread-1.dll。 解决方法: 设有动态库libadd.dll、静态库libmul.a 编译命令&#x…...
[PRO_A7] SZ501 FPGA开发板简介
SZ501 FPGA开发板简介 概述 SZ501 FPGA开发板是专为高性能FPGA设计、快速原型开发和复杂应用调试打造的先进开发平台。搭载Xilinx Artix-7系列XC7A100T FPGA芯片,SZ501提供卓越的逻辑运算能力和灵活的接口支持,广泛适用于通信、信号处理、嵌入式系统及…...
URP - 序列图动画的实现
效果: 【太妃糖耶】更新了一条视频,快来围观! 序列图动画的实现 首先先了解下序列图样式的纹理图片 如上图一可在Shader中使用该图片制作燃烧的火的动画,但是如何实现呢?接下来一起来看一下吧 序列图动画的实现原理大…...
Helm部署kong+konga的路由管理系统
部署postgres服务 创建存储类 创建存储类对应的deployment --- apiVersion: apps/v1 kind: Deployment metadata:annotations: {}labels:app: eip-nfs-postgresql-storageclassname: eip-nfs-postgresql-storageclassnamespace: kube-systemresourceVersion: 26709116 spec:…...
液氮恒温器原理解析
一、核心降温原理 1、液氮媒介作用 液氮恒温器以液氮(沸点约77K/-196℃)为降温媒介,通过液氮蒸发吸收热量的特性实现快速降温。 液氮在内部腔体蒸发时形成气-液界面,利用毛细管路将冷媒导入蒸发器,强化热交换…...
EchoMimic 阿里开源数字人项目的复现过程
EchoMimic 是一个由阿里巴巴蚂蚁集团开发的开源AI 数字人项目,通过可编辑地标调节实现逼真的音频驱动肖像动画,它能够将静态图像转化为具有动态语音和表情的数字人像。 今天咱们来复现下,看看有哪些坑,再看看数字人效果如何。 先…...
iVX 开源战略:多维突破下的产业生态革新与未来图景
在开源技术浪潮席卷全球软件产业的当下,iVX 凭借持续迭代的开源战略,不断突破技术边界,拓展应用场景,重塑产业生态。从底层技术架构的深度优化,到多行业应用场景的全面覆盖;从全球化生态体系的完善构建&…...
数据库12(游标)
游标语法 declare c1 cursor for select title from titles --定义一个游标c1,确定游标对应的列是titles表的title列,游标可以对应多个列 declare bname varchar(50) --声明变量 open c1 --初始化,开始使用游标 fetch next from c1 in…...
Windows11下本地化部署AI开发环境(Dify+Ollama)
前言 本次实践希望在Windows环境下本地化部署AI开发环境,通过Ollama下载运行模型,通过Dify搭建管理AI应用。 硬件环境 AI大模型开发对硬件要求较高,理论上配置越高越好。本次搭建环境如下: Windows系统(Windows11&…...
Oracle Bigfile 与 Smallfile 表空间对比分析
Oracle Bigfile 与 Smallfile 表空间对比分析 一、基本概念对比 特性Bigfile 表空间Smallfile 表空间定义每个表空间只包含一个大数据文件每个表空间可包含多个数据文件引入版本Oracle 10gOracle 传统模式最大文件大小取决于块大小(32TB for 8K块)通常最大32GB(传统限制)文件…...
Cypress/Playwright 跨浏览器测试
以下是关于 Cypress 和 Playwright 跨浏览器测试的基本知识总结: 一、工具核心差异 维度CypressPlaywright浏览器支持Chromium 系为主(需配置支持其他浏览器)原生支持 Chromium/Firefox/WebKit架构设计同进程运行远程协议控制(CDP/WebDriver)执行速度较快(内存运行)快速…...
【Python学习路线】零基础到项目实战
目录 🌟 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 🧠 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 💻 二、实战演示环境配置要求核心代码实现运行结果验证 ⚡ 三、性能对比测试方法论量化数据对比…...
26个脑影像工具包合集分享:从预处理到SCI成图
为方便各位脑科学研究者更好地使用优质的开源工具,本期脑海科技实验室汇总了近期整理的脑影像分析软件,希望可以帮助大家。 脑影像分析软件汇总 本次总结脑影像工具包合集(点击本条文字内容跳转) 工具包包括 1、CONN࿱…...
C# 高效操作excel文件
C#高效操作Excel文件指南 一、主流Excel处理方案对比 方案类型特点适用场景EPPlus第三方库功能全面,性能好,支持.xlsx复杂Excel操作,大数据量NPOI第三方库支持.xls和.xlsx,功能全面兼容旧版Excel文件Closed…...