MCP Server 三种传输协议深入分析:SSE、Streamable、Stateless

写在前面

MCP(Model Context Protocol)在传输层支持三种协议:SSE、Streamable HTTP 和 Stateless HTTP。这三种协议各有特点,适用于不同场景。


一句话概括

协议 特点 适用场景
SSE 长连接、服务器推送 实时推送、简单工具调用
Streamable 流式响应、双向通信 复杂交互、需要流式输出
Stateless 无状态、简单直接 纯请求响应、微服务

1. SSE(Server-Sent Events)

原理

SSE 是基于 HTTP 的单向通信协议,服务器主动推送给客户端。

特点

  • 单向通信:只能服务器 → 客户端
  • 持久连接:一次连接,多次推送
  • 自动重连:浏览器自动处理
  • 简单:基于标准 HTTP,不需要 WebSocket

缺点

  • 单向:客户端无法在连接中发送新请求
  • 只支持文本:二进制数据不方便
  • 并发限制:浏览器对单域名并发连接数有限制

适用场景

  • 简单的工具调用
  • 只需要从服务器获取结果
  • 实时日志推送

2. Streamable HTTP(流式 HTTP)

原理

Streamable HTTP 是双向流式通信,支持在单个 HTTP 连接上进行多次请求响应,并且支持流式输出。

特点

  • 双向通信:客户端和服务器可以在一个连接中交互
  • 流式响应:支持 chunked transfer encoding,边算边返回
  • 状态管理:可以在连接中保持会话状态
  • 低延迟:流式返回,不用等全部结果

缺点

  • 复杂度高:需要处理流式数据
  • 资源占用:长连接占用服务器资源
  • 调试困难:流式数据不好调试

适用场景

  • LLM 响应流式输出(打字机效果)
  • 复杂的多轮对话
  • 需要实时反馈的场景

简单理解

  • Stateless = 发短信 → 等回复 → 结束
  • Streamable = 打电话 → 双方实时交流 → 说完才挂

3. Stateless HTTP(无状态 HTTP)

原理

Stateless HTTP 就是传统的请求-响应模式,每次请求都是独立的,不保持连接状态。

特点

  • 简单:最传统的 HTTP 模式,容易理解
  • 可扩展:无状态,易于水平扩展
  • 资源友好:不占用长连接资源
  • 天然适合微服务:负载均衡器可以直接路由

缺点

  • 无状态:每次请求都要带全上下文
  • 延迟高:每次都要建立新连接
  • 不支持实时推送:只能轮询

适用场景

  • 简单的工具调用
  • 微服务架构
  • 对性能要求不高的场景

三种协议对比

特性 SSE Streamable Stateless
连接类型 长连接 长连接 短连接
通信方向 单向 双向 双向
流式支持 部分 完全支持 不支持
状态保持 会话级 会话级 无状态
复杂度
资源占用
扩展性 一般 较差 优秀
实时性 推送 推送/流式 轮询

怎么选?

选 SSE

  • 简单工具调用
  • 只需要服务器推送结果
  • 不想用 WebSocket 又需要实时性

选 Streamable

  • LLM 流式输出(打字机效果)
  • 复杂交互,需要在一个会话中多次往来
  • 对实时性要求高

选 Stateless

  • 微服务架构
  • 简单请求-响应
  • 需要高扩展性
  • 容器化部署(无状态好调度)

Spring AI 中的选择

Spring AI MCP 默认使用 SSE 模式,因为:

  1. 实现简单,生态成熟
  2. 足够满足大部分场景
  3. 调试方便(curl 就能测试)

写在最后

MCP 的三种传输协议,本质上是在实时性和简单性之间做权衡:

  • Stateless = 简单直接,但不够实时
  • SSE = 能推送,但只能单向
  • Streamable = 最强,但最复杂

根据你的业务场景选择合适的协议,别过度设计。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐