一、前言
在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",)