关于MCP SSE 服务器的工作原理
模型上下文协议(Model Context Protocol,简称MCP) 是一种全新的开放协议,专门用于标准化地为大语言模型(LLMs)提供应用场景和数据背景。 你可以把MCP想象成AI领域的“USB-C接口”,它能让不同的AI模型与外部工具和数据源轻松连接
近来学习了一下,先是使用stdio的方式叫cursor做了一个,完全没有问题。但是sse的方式叫cursor 干始终不成功, 找了一轮,发现youtube的教程视频里主持,也没有搞定sse的服务器,balahblah说了一堆,就要move on ....于是研究了一下。
1. 首先MCP SSE是基于http协议的一个应用,服务器和客户端主要通过json rc的方式进行沟通。
2. MCP SSE Client会发起多个连接,但是第一个连接是http://yourhost:port/sse, 这个连接是沟通的第一步,它会使用chunked的回传数据,意思是不告诉client这个数据有多少,这样就它就可以一直连着了。 所以这个链接就是一个用来通知的链接。你现在就明白了为什么 ,就叫SSE(Server-Sent Events )。 它首先按以下格式信息给client, 然后就是定时的ping包了, 每次都只是一个chunk,估计后期server会有推送也会使用这个链接通知client.
event: 事件的名字
data: 事件的数据
2.1 第一个event是,这个直接返回,就是给client分配一个session_id, 方便后面多个连接过来服务器可以分清谁和谁。
51
event: endpoint
data: /messages/?session_id=07aa8f90d79a49eaad802693cdd05b5b
client收到这个,就会以http://yourhost:port/messages/?session_id=07aa8f90d79a49eaad802693cdd05b5b , 新发起一个连接去请求mcp sse server
2.2 第二个event是event: message, 这个data 是一个json来的,就是告诉client,当前mcp server的能力,还有服务器的基本信息。
124
event: message
data: {"jsonrpc": "2.0","id": 0,"result": {"protocolVersion": "2024-11-05","capabilities": {"experimental": {},"prompts": {"listChanged": false},"resources": {"subscribe": false,"listChanged": false},"tools": {"listChanged": false}},"serverInfo": {"name": "mem0-mcp","version": "1.3.0"}}
}
2.3 第三个event也是一个message , 用来告诉client 服务器提供的tools有哪些。
{"jsonrpc": "2.0","id": 1,"result": {"tools": [{"name": "add_coding_preference","description": "Add a new coding preference to mem0. This tool stores code snippets, implementation details,\n and coding patterns for future reference. Store every code snippet. When storing code, you should include:\n - Complete code with all necessary imports and dependencies\n - Language/framework version information (e.g., \"Python 3.9\", \"React 18\")\n - Full implementation context and any required setup/configuration\n - Detailed comments explaining the logic, especially for complex sections\n - Example usage or test cases demonstrating the code\n - Any known limitations, edge cases, or performance considerations\n - Related patterns or alternative approaches\n - Links to relevant documentation or resources\n - Environment setup requirements (if applicable)\n - Error handling and debugging tips\n The preference will be indexed for semantic search and can be retrieved later using natural language queries.","inputSchema": {"properties": {"text": {"title": "Text","type": "string"}},"required": ["text"],"title": "add_coding_preferenceArguments","type": "object"}},{"name": "get_all_coding_preferences","description": "Retrieve all stored coding preferences for the default user. Call this tool when you need \n complete context of all previously stored preferences. This is useful when:\n - You need to analyze all available code patterns\n - You want to check all stored implementation examples\n - You need to review the full history of stored solutions\n - You want to ensure no relevant information is missed\n Returns a comprehensive list of:\n - Code snippets and implementation patterns\n - Programming knowledge and best practices\n - Technical documentation and examples\n - Setup and configuration guides\n Results are returned in JSON format with metadata.","inputSchema": {"properties": {},"title": "get_all_coding_preferencesArguments","type": "object"}},{"name": "search_coding_preferences","description": "Search through stored coding preferences using semantic search. This tool should be called \n for EVERY user query to find relevant code and implementation details. It helps find:\n - Specific code implementations or patterns\n - Solutions to programming problems\n - Best practices and coding standards\n - Setup and configuration guides\n - Technical documentation and examples\n The search uses natural language understanding to find relevant matches, so you can\n describe what you're looking for in plain English. Always search the preferences before \n providing answers to ensure you leverage existing knowledge.","inputSchema": {"properties": {"query": {"title": "Query","type": "string"}},"required": ["query"],"title": "search_coding_preferencesArguments","type": "object"}}]}
}
跟着就是ping包的返回,防止client死了。
2d
: ping - 2025-03-12 08:16:23.071429+00:00
3. endpoint请求
拿到endpont后,client 使用post的请求endpoint, 这个只处理请求,目前看 返回则在第一个http连接里。
第二个链接 请求如下:, 这个调用initialize,对应上面的第一个message的event.
第二个链接, 这个只回复202 AcceptedPOST /messages/?session_id=9aa12073a4494d5580a5c30ed54c4bfd HTTP/1.1
host: 10.0.105.64:8080
connection: keep-alive
content-type: application/json
accept: */*
accept-language: *
sec-fetch-mode: cors
user-agent: node
accept-encoding: gzip, deflate
content-length: 253{"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{"tools":true,"prompts":false,"resources":true,"logging":false,"roots":{"listChanged":false}},"clientInfo":{"name":"cursor-vscode","version":"1.0.0"}},"jsonrpc":"2.0","id":0}
HTTP/1.1 202 Accepteddate: Wed, 12 Mar 2025 08:08:32 GMT
server: uvicorn
content-length: 8Accepted
第三个链接,请求如下:
第三个链接,仅回复 202 AcceptedPOST /messages/?session_id=9aa12073a4494d5580a5c30ed54c4bfd HTTP/1.1
host: 10.0.105.64:8080
connection: keep-alive
content-type: application/json
accept: */*
accept-language: *
sec-fetch-mode: cors
user-agent: node
accept-encoding: gzip, deflate
content-length: 54{"method":"notifications/initialized","jsonrpc":"2.0"}
HTTP/1.1 202 Accepted
date: Wed, 12 Mar 2025 08:08:32 GMT
server: uvicorn
content-length: 8Accepted
第四个链接,请求如下,请求tools/list, 服务器在第一个get的链接,通过event的方式返回了这个列表给mcp sse client
第四个链接,仅加复 202 AcceptedPOST /messages/?session_id=9aa12073a4494d5580a5c30ed54c4bfd HTTP/1.1
host: 10.0.105.64:8080
connection: keep-alive
content-type: application/json
accept: */*
accept-language: *
sec-fetch-mode: cors
user-agent: node
accept-encoding: gzip, deflate
content-length: 46{"method":"tools/list","jsonrpc":"2.0","id":1}
HTTP/1.1 202 Accepted
date: Wed, 12 Mar 2025 08:08:32 GMT
server: uvicorn
content-length: 8Accepted
1-3完成就是属于初始化完成,mcp sse的client和server 连接起来了。
然后后面使用mcp call 调用的,在cursor chat里输入
call mcp tool search_coding_preferences about StdioServerTransport
就是新起一个http短链接,post到endpoint,如下
POST /messages/?session_id=97a44bcff590415e99cf803350ffd542 HTTP/1.1
host: 10.0.105.64:8080
connection: keep-alive
content-type: application/json
accept: */*
accept-language: *
sec-fetch-mode: cors
user-agent: node
accept-encoding: gzip, deflate
content-length: 143{"method":"tools/call","params":{"name":"search_coding_preferences","arguments":{"query":"about StdioServerTransport"}},"jsonrpc":"2.0","id":3}HTTP/1.1 202 Accepted
date: Wed, 12 Mar 2025 09:10:43 GMT
server: uvicorn
content-length: 8HTTP/1.1 202 Accepted
date: Wed, 12 Mar 2025 09:10:43 GMT
server: uvicorn
content-length: 8Accepted
第一个链接就是会有一个通知返回如下:
event: message
data: {"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"[]"}],"isError":false}}
相关文章:
关于MCP SSE 服务器的工作原理
模型上下文协议(Model Context Protocol,简称MCP) 是一种全新的开放协议,专门用于标准化地为大语言模型(LLMs)提供应用场景和数据背景。 你可以把MCP想象成AI领域的“USB-C接口”,它能让不同的A…...
碳中和小程序:助力用户记录低碳行为,推动环保生活
碳中和小程序:助力用户记录低碳行为,推动环保生活 一、碳中和的全民化挑战与数字化机遇 中国承诺2030年前实现碳达峰,2060年前达成碳中和目标。在这一国家战略下,个人碳减排贡献率需从当前不足5%提升至25%。小程序开发技术正成为破解"公众参与度低"“行为量化难…...
Python读取显示Latex的公式文档,Python加载显示markdown文件。
平时用LLM大语言模型去解释文献里面的公式含义直接复制的格式word看不懂,基于这个web可以正常加载显示。 下面是读取的效果展示:下面程序保存为stl_read.py然后运行下面指令。 streamlit run stl_read.pyimport streamlit as st import base64 import …...
mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体,并添加侧面窗户贴图和楼顶贴图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox extrusion挤出几何体二、🍀…...
mock的定义和使用场景
Python自动化中使用mock的示例 在Python自动化测试中,mock 用于模拟对象、函数或方法的行为,以便在隔离的环境中测试代码。以下是一个简单的示例: 假设你有一个 user.py 模块,其中包含一个 get_user_info 函数,用于从…...
Android Retrofit 请求执行模块执行原理深入源码分析(三)
一、引言 Retrofit 是 Square 公司开发的一款优秀的类型安全的 HTTP 客户端,在 Android 和 Java 开发中被广泛使用。它通过简洁的接口定义和强大的注解功能,使得开发者能够轻松地进行网络请求。请求执行模块是 Retrofit 的核心部分之一,负责…...
封装Axios拦截器实现用户无感刷新AccessToken实践指南
一、背景与需求场景 1.1 单点登录体系中的Token管理 在单点登录(SSO)体系下,用户登录后系统会颁发两种令牌: AccessToken:短期有效(2小时),用于接口鉴权 RefreshToken:…...
CSDN博客:Markdown编辑语法教程总结教程(下)
❤个人主页:折枝寄北的博客 Markdown编辑语法教程总结 前言1. LaTex数学公式2. 插入不同类别的图2.1 插入甘特图2.2 插入UML图2.3 插入Mermaid流程图2.4 插入Flowchart流程图2.5 插入classDiagram类图 3. CSDN快捷键4. 字体相关设置4.1 字体样式改变4.2 字体大小改变…...
【Python】06、流程控制语句
文章目录 1.条件判断语句1.1 if 语句2. input 函数3.if-else 语句4.if-elif-else 语句 2.循环语句2.1 while语句2.2 while语句练习:2.3 循环嵌套2.4 break和continue 通过流程控制语句,可以改变程序的执行顺序,也可以让指定程序反复执行多次。…...
《python》—— threading库(线程和多线程)
文章目录 threading简介threading基本概念常用类和方法线程同步线程池实例 threading简介 threading 是 Python 标准库中用于实现多线程编程的模块。多线程编程允许程序同时执行多个任务,提高程序的并发性能,尤其适用于 I/O 密集型任务,例如…...
【数据分享】2000-2024年全国逐年归一化植被指数(NDVI)栅格数据(年最大值)
NDVI,全名为Normalized Difference Vegetation Index,中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力,我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享了来源于MOD13A3数…...
【项目】负载均衡式在线OJ
负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍: 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...
前端发布缓存导致白屏解决方案
解决发布H5后因为本地缓存白屏方案 一、 核心配置优化(前提是访问网站的请求能抵达服务器) 方案一:前端项目设置全局不缓存方案 运行逻辑:在H5服务器配置中增加Cache-Control: no-cache或max-age0响应头,禁用静态资…...
大模型开源的工具包有哪些特殊符号可以使用;SEP 是什么
大模型开源的工具包有哪些特殊符号可以使用 目录 大模型开源的工具包有哪些特殊符号可以使用自定义特殊token:special_tokens=True一、**对话轮次分隔符(必选)**二、**系统提示标记(提升指令理解)**三、**中文特色分隔符(贴合书写习惯)**四、**开源模型专属符号(按文档…...
混沌理论与混沌映射——算法改进初始化创新点之一
混沌理论与混沌映射 混沌理论研究混沌系统的动力学,其特征是非线性和对初始条件的极端敏感性。即使在这些条件下的微小变化也可能导致系统结果的显著变化。尽管看起来是随机的,混沌系统可以在不依赖随机性的情况下表现出不规则的行为,因为确…...
19874并查集
19874并查集 ⭐️难度:中等 🌟考点:并查集、数据结构 📖 📚 import java.util.*;public class Main {static int N 100010;static int[] a new int[N];static int[] p new int[N];static int n;static int m;st…...
macOS 安装配置 iTerm2 记录
都说 macOS 里替换终端最好的就是 iTerm2 ,这玩意儿还是开源的,所以就也根风学习一下,但全是英文的挺麻烦,所以这里记录一下自己的设置,以最简单的安装及设置为主,想要更酷炫、更好看的还请自己百度吧&…...
LLM最新的模型微调技术有哪些
LLM 最新的模型微调技术有哪些 目录 LLM 最新的模型微调技术有哪些1. QLoRA(Quantized Low-Rank Adaptation)2. P-Tuning v23. LoRA++(增强版 LoRA)4. AdaLoRA(Adaptive LoRA)5. BitFit(仅微调偏置)1. QLoRA(Quantized Low-Rank Adaptation) 原理:QLoRA 结合了低秩自…...
Jmeter下载安装配置及使用
1、下载 官网地址:Apache JMeter - Download Apache JMeter 2、配置环境变量 ①找到环境变量,两种方法 法一:我的电脑→右键菜单→属性→高级系统设置→环境变量 法二:直接搜索环境变量 ②新建两个系统变量 1.变量名&#x…...
简单易懂Modbus Tcp和Rtu的异同点
关键说明 无需修改业务逻辑:同一套读写代码可同时支持TCP和RTU,仅需调整底层通信接口。 工具兼容性:调试工具(如Modbus Poll)可同时解析两种协议,仅需切换传输模式。 系统集成优势:混合网络下可…...
try catch的使用
try catch的使用 在 Java 中,try-catch 语句用于异常处理。异常处理可以帮助我们在程序出现错误时,不会导致程序崩溃,而是采取一定的措施来处理错误。try-catch 语句是用于捕获并处理异常的机制。 基本语法 try {// 可能会抛出异常的代码块…...
【从零开始学习计算机科学】编译原理(一)编译过程概述
【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...
PCL 点云AABB包围盒(二)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 包围盒是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。(来源于百度)常用的求解包围盒的算法主要有AABB和OOB算法,其中AABB的算法思想…...
【算法day8】 Z 字形变换 -O(n)算法思路整理
Z 字形变换,算法思路整理 https://leetcode.cn/problems/zigzag-conversion/description/ 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下…...
L3-1 夺宝大赛
输入样例 1: 5 7 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 2 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 7 1 5 7 1 1 1 5 5 3 1 3 5 1 4输出样例 1: 7 6样例 1 说明: 七支队伍到达大本营的时间顺次为:7、不可能、5、3、3、5、6,…...
Matlab:矩阵运算篇——矩阵
目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…...
泛微ecode的页面开发发送请求参数携带集合
1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况,那么这里就有一些如下的注意事项,如以下代码: // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…...
【结构光相机的精度极限】
1. 光源波长((\lambda)) 光源波长是决定结构光相机精度极限的核心因素之一。根据光学衍射极限理论,光的波长越短,能够分辨的细节越小,精度越高。 理论依据: 根据瑞利判据(Rayleigh Criterion&…...
Javaweb后端全局异常处理器
类名随便定义 这是异常处理的方法exceptionhandler responsebody作用,方法的响应值返回给前端,如果返回的是集合对象,会把集合对象转为json,再给前端响应返回...
SpringBoot缓存抽象:@Cacheable与缓存管理器配置
文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层&am…...
