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
英文地址,請注明出處:http://en.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》…