mcp - 支持的四种传输方式
2025年12月20日 下午2:49:24
MCP 的通讯目前有三种传输方式(或通道):
| 传输方式(或通道) | 说明 | 备注 |
|---|---|---|
| stdio | 本地进程内通讯(一般,通过子进程启动) | 现有 |
| http sse | 远程 http sse 通讯 | 现有 |
| http streamable | 远程 http streamable 通讯 | v3.5.0 后支持 |
| http streamable_stateless | 远程 http streamable_stateless 通讯 | v3.8.0 后支持(只支持 server) |
业内已有大量的 stdio mcp 服务发布。其中 http 的服务,可支持多个端点。
public interface McpChannel {
String STDIO = "stdio";
String SSE = "sse"; //MCP官方已标为弃用
String STREAMABLE = "streamable"; //新增(MCP_2025-03-26 版本新增)
String STREAMABLE_STATELESS = "streamable_stateless"; //v3.8.0 后支持
}
传输方式对应表(服务端与客户端,须使用对应的传输方式才可通讯):
| 服务端 | 客户端 | 备注 |
|---|---|---|
| STDIO | STDIO | 有状态,支持反向通讯 |
| SSE | SSE | 有状态,支持反向通讯 |
| STREAMABLE | STREAMABLE | 有状态,支持反向通讯 |
| STREAMABLE_STATELESS (v3.8.0 后支持) | STREAMABLE | 无状态,不支持反向通讯 对 server 集群很友好 |
传输方式(或通道)使用提醒:
- 对于 llm 来说,任何传输方式都是一样的
- STREAMABLE_STATELESS,server 集群“不”需要 ip_hash,但不支持反向请求 client
1、使用示例
传输方式(或通道)的配置示例:
//服务端
@McpServerEndpoint(channel = McpChannel.STREAMABLE_STATELESS, mcpEndpoint = "/mcp")
public class McpServerTool {
@ToolMapping(description = "查询天气预报")
public String getWeather(@Param(description = "城市位置") String location) {
return "晴,14度";
}
}
//客户端
McpClientProvider clientProvider = McpClientProvider.builder()
.channel(McpChannel.STREAMABLE)
.apiUrl("http://localhost:8080/mcp")
.build();
2、什么是 STREAMABLE_STATELESS?
STREAMABLE 传输方式,支持有状态和无状态两种用况。
| 服务端 | 客户端 | 备注 |
|---|---|---|
| STREAMABLE | STREAMABLE | 有状态 |
| STREAMABLE_STATELESS (v3.8.0 后支持) | STREAMABLE | 无状态 |
- 什么是有状态?
MCP 协议,通过长链接实现 server 调用 client 的效果。比如:tool 变更通知;比如 sampling 采样通知。但 http 本身是单向通讯的,client 还需要用短链接不断给 server 发消息。此时,集群就需要用 ip_hash 路由策略把短链接也转发到长连接相同的ip上。
- 什么是无状态?(80% 的场景都是适合的)
不搞长链接了,不搞反向调用了。client 每次请求都是短链接请求,集群随便路由到哪个 ip