Solon v3.8.0

mcp - 支持的四种传输方式

</> markdown
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 后支持
}

传输方式对应表(服务端与客户端,须使用对应的传输方式才可通讯):

服务端客户端备注
STDIOSTDIO有状态,支持反向通讯
SSESSE有状态,支持反向通讯
STREAMABLESTREAMABLE有状态,支持反向通讯
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 传输方式,支持有状态和无状态两种用况。

服务端客户端备注
STREAMABLESTREAMABLE有状态
STREAMABLE_STATELESS (v3.8.0 后支持)STREAMABLE无状态
  • 什么是有状态?

MCP 协议,通过长链接实现 server 调用 client 的效果。比如:tool 变更通知;比如 sampling 采样通知。但 http 本身是单向通讯的,client 还需要用短链接不断给 server 发消息。此时,集群就需要用 ip_hash 路由策略把短链接也转发到长连接相同的ip上。

  • 什么是无状态?(80% 的场景都是适合的)

不搞长链接了,不搞反向调用了。client 每次请求都是短链接请求,集群随便路由到哪个 ip