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 的服务，可支持多个端点。


```java
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  | 无状态，不支持反向通讯<br/>对 server 集群很友好  |




传输方式（或通道）使用提醒：

* 对于 llm 来说，任何传输方式都是一样的
* STREAMABLE_STATELESS，server 集群“不”需要 ip_hash，但不支持反向请求 client


### 1、使用示例

传输方式（或通道）的配置示例：

```java
//服务端
@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



