FastMCP框架进行MCP开发:(三)从SSE升级到SteamableHTTP

一、前言

在MCP(Model Context Protocol)中,Streamable HTTP和SSE(Server-Sent Events)都是用于实现客户端与服务器之间通信的传输机制。然而,它们在设计、功能以及性能表现上有着显著的区别。

二、SSE在MCP中的表现

SSE是一种基于HTTP的协议,允许服务器向客户端推送更新。它非常适合需要实时更新的应用场景,如股票价格更新或社交媒体的新消息通知。在MCP中,SSE通常被用来实现实时的通知或者状态更新。
SSE的特点:

  • 单向通信:SSE主要用于从服务器到客户端的数据推送,对于客户端到服务器的请求,则需通过其他方式(例如标准HTTP POST请求)来完成。
  • 长连接:为了维持数据流,SSE需要保持一个持续打开的HTTP连接,这可能对服务器资源造成压力,尤其是在高并发情况下。
  • 事件驱动:每个推送的数据包都包含一个事件标识符和数据内容,使得客户端能够识别并处理不同的事件类型。

在MCP中使用SSE的一个典型流程是这样的:

  • 客户端发送一个GET请求到/sse端点以建立连接。
  • 服务器接收请求后开始维护这个长连接,并通过此连接向客户端发送事件。
  • 当有新的数据可用时,服务器会将这些数据作为事件推送给客户端。
  • 如果连接断开,客户端必须重新发起连接以继续接收数据。

三、Streamable HTTP在MCP中的表现

Streamable HTTP是对传统HTTP+SSE的一种改进,旨在解决SSE存在的问题,同时保留其优点。它是为了解决SSE不支持恢复连接、要求服务器保持高可用的长连接等问题而设计的。
Streamable HTTP的特点:

  • 双向通信:Streamable HTTP不仅支持服务器向客户端推送数据,同时也支持客户端向服务器发送请求,所有交互都可以通过统一的/message端点进行。
  • 按需流式传输:服务器可以根据实际需求选择是否使用SSE进行流式传输,而不是强制性的长连接。
  • 无状态服务:Streamable HTTP支持无状态运行模式,这意味着服务器不需要为每个连接保持长期的状态信息,从而减轻了服务器的压力。
  • 兼容性:由于基于标准HTTP协议,Streamable HTTP可以很好地与现有的网络基础设施集成,比如CDN、API网关等。

在MCP中使用Streamable HTTP的一个典型流程如下:

  • 客户端发送POST请求到/message端点以初始化通信。
  • 服务器收到请求后返回响应,并根据情况决定是否升级为SSE流式传输。
  • 如果需要,服务器可以通过SSE的方式向客户端推送数据;否则,它将以常规HTTP响应的形式回复。
  • 在任何时间点,如果连接中断,客户端可以携带必要的上下文信息(如Last-Event-ID)重新连接,服务器则可以根据这些信息恢复之前的状态。

总结来说,Streamable HTTP提供了更加灵活且高效的通信机制,适用于更广泛的场景,特别是在需要高效双向通信和大规模部署的情况下。而SSE虽然也能满足某些特定的需求,但在处理复杂性和扩展性方面不如Streamable HTTP。

因此,在最新的MCP版本中,官方推荐使用Streamable HTTP作为默认的传输机制。

四、SSE改造成StreamableHTTP

之前我们编写了一个基于FastMCP框架的SSE模式的图书馆预定MCP-Server。现在我们给它升级成Streamable。

首先需要升级FastMCP框架版本,需要>=2.3.3

uv pip install fastmcp==2.3.3

然后引入依赖时,需要引入根依赖:

from fastmcp import FastMCP

SSE时是这样引入的from mcp.server.fastmcp import FastMCP

中间代码全部都不变,在最后指定通信方式是Streamable,如下:

if   __name__  == "__main__":# mcp.run(transport="streamable-http", host="0.0.0.0", port=8000, path="/mcp")#  mcp.run(transport="streamable-http")mcp.run(transport="streamable-http",host="0.0.0.0",port=8000,path="/mcp",# log_level="debug",)

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

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

相关文章

Android 15 变更及适配攻略

2025年的第一篇Android适配,比以往来的更晚一些。废话不多说,我们开始!! 准备工作 首先将我们项目中的 targetSdk和compileSdk 升至 35。 推荐使用Android Studio Koala Feature Drop | 2024.1.2或更高版本。AGP版本最低升级到…

Vue项目使用defer优化页面白屏,性能优化提升,秒加载!!!

defer表示延迟加载,针对大量节点的渲染加载,结合使用关键帧requestAnimationFrame的形式来分片加载,可以优化白屏时间 知识补充: requestAnimationFrame requestAnimationFrame 是根据帧数来执行回调函数的,就是屏幕…

sentinel与seata组件在微服务中的基本作用

微服务基础内容: 在微服务中,首先学习了微服务的横向拆分与纵向拆分,纵向拆分指按照功能拆分模块,横向拆分指将高复用的模块单独拆分,使纵向拆分的模块去调用这部分内容。 学习了基本拆分后,需要知道微服…

微信点餐小程序—美食物

本项目是基于WAMP Server 和PHP 动态网页技术构建的微信小程序点餐系统,该系统主要分为前端(微信小程序)和后端(基于PHPMySQL服务器端) 整体架构流程 1、前端部分 用户界面:展示菜品、处理用户点餐操作、…

记录Idea运行控制台乱码处理方案

记录Idea运行控制台乱码处理方案 方法1:修改运行配置 打开 Run/Debug Configurations在对应的运行配置中 → 找到 VM Options → 添加: -Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8重新运行程序 方法2:强制指定输出流编码 在代码中显…

JVM对象内存分配机制全解析

jvm创建对象的内存分配过程 1、逃逸对象在栈上分配 通过在栈上为对象分配内存,使对象占用的内存空间随着方法结束栈帧弹出而销毁,避免了GC垃圾收集器回收对象,减小GC的压力; 栈上分配内存依赖逃逸分析和标量替换。 逃逸分析: 分析对象的动态作用域逃逸:当一个对象在方…

揭秘OSPF核心:LSA类型与路由计算

一、区域内路由计算 同一区域内中的所有路由器有相同的LSDB LSA关键字段: 【1】LS Age(链路状态老化时间):LSA生存的时间,单位秒 【2】Option(选项字段) 【3】LS Type(链路状…

英文摘要给成中文摘要模型

你现在使用的 UNIMO 项目(PaddlePaddle/Research/NLP/UNIMO),默认是做英文摘要任务,如你在 README 中看到的数据集是 CNN/DailyMail,它是一个 英文摘要数据集。不过,这个项目的架构完全支持中文&#xff0c…

前端面试专栏-主流框架:13.vue3组件通信与生命周期

🔥 欢迎来到前端面试通关指南专栏!从js精讲到框架到实战,渐进系统化学习,坚持解锁新技能,祝你轻松拿下心仪offer。 前端面试通关指南专栏主页 前端面试专栏规划详情 Vue3组件通信与生命周期深度解析 在Vue3的开发体系…

自动化交易优化网格策略

一、动态参数调整 1. 网格间距优化 - 波动率自适应:使用平均真实波幅(ATR)指标动态调整间距。例如,当ATR值上升20%时,将间距从原定的1%扩大至1.5%;ATR下降时则缩小间距至0.8%。可通过Python的TA-Lib库实时计…

测试平台ui自动化demo说明

1. 要启动celery worker windows 开发时,用第二行 。(试过,可以),第一行的没试过。 celery -A myproject worker --loglevelinfo # windows电脑用下面的,并且settings中还要加那个solo celery -A your_p…

五大主要Token类型之字符标记Token

如大家所了解的,在数字化时代,我们每天都会与Token(令牌)打交道——无论是在线支付、登录社交媒体,还是调用API接口,都离不开这一关键技术。 今天我们主要来学习:字符标记Token 在自然语言处理…

可理解性输入:洗澡习惯

一、开场与淋浴准备 Today we’re going to learn bathroom English. Let’s get started. So the first thing we want to do. Make sure we have our towel and we’ll hang it on the towel rack before we have a shower. Because if we have a shower and then forget ou…

GO Echo框架面试题及参考答案

目录 Echo 框架的核心结构是什么?Echo 和 Context 分别扮演什么角色? 如何创建一个 Echo 实例?简述常见配置项。 e.Start () 与 e.StartServer () 的区别是什么? Echo 如何实现基于先后顺序路由匹配? 如何注册 GET、POST、PUT、DELETE 等不同 HTTP 方法的路由? Echo…

Java 中LinkedList 总结

406.根据身高重建队列 力扣题目链接(opens new window) 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高…

大模型微调:从零到实践,掌握AI大模型的核心技能

大模型微调:从零到实践,掌握AI大模型的核心技能 引言 大规模语言模型(如DeepSeek、通义千问)的出现,彻底改变了自然语言处理的格局。这些模型不仅在学术界取得了突破性进展,在工业界也得到了广泛应用。 …

Flutter - 原生交互 - 相册

环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 iOS 13.4.1 iOS 18.5 集成image_picker 在Flutter中可以使用image_picker插件实现从相册中获取图片 添加插件 flutter中访问相册image_picker插件 flutter pub add image_pickerflutter pub getXcode工程的GenerateP…

node.js在vscode的配置

文章目录 概要1. 使用和webstrom一样的快捷键2. 让vscode的主题变成webstrom3. 如何在 Node.js 环境下写代码3.1 使用 ESLint配置规则3.2 配置.vscode/settings.json 4. Prettier安装5. 其它问题解决 概要 node.js在webstrom编辑器中可以完美使用代码提示、错误提示等功能&…

Android14音频子系统-Audio HAL分析

文章目录 1)概述2)HAL的打开流程3)HAL库的实现(Qualcomm)4)tinyalsa5)数据结构6)代码流程 1)概述 1、回顾HAL、tinyalsa与linux driver的关系 2、与AudioFlinger的关系 3、 1、如何判断当前…

前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…