Java MCP 各传输模式完整启动示例

基于官方 Java SDK:io.modelcontextprotocol:sdk

前置依赖 Maven

XML 复制代码
<dependency>
    <groupId>io.modelcontextprotocol</groupId>
    <artifactId>sdk</artifactId>
    <version>0.4.0</version>
</dependency>

1. Stdio 标准输入输出模式(本地进程通信)

本地客户端拉起子进程,管道双向通信,仅本机可用

java 复制代码
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.transport.StdioServerTransport;

public class StdioMcpServer {
    public static void main(String[] args) {
        // 创建标准IO传输层
        StdioServerTransport transport = new StdioServerTransport();
        
        // 构建MCP服务
        McpServer server = McpServer.builder(transport)
                .serverInfo("demo-stdio-server", "1.0.0")
                .build();

        // 启动服务
        server.start();
        System.out.println("Stdio MCP Server running");
    }
}

客户端连接方式:启动该进程,通过进程 stdin/stdout 交互,无端口。

2. SSE 模式(传统 HTTP-SSE 半双工)

分两个接口:GET /sse 推送流、POST /message 客户端发消息

java 复制代码
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.transport.SseServerTransport;

public class SseMcpServer {
    public static void main(String[] args) {
        // 绑定0.0.0.0:8080,消息接口 /message,sse长连接端点 /sse
        SseServerTransport transport = new SseServerTransport("/message", 8080, "0.0.0.0");

        McpServer server = McpServer.builder(transport)
                .serverInfo("demo-sse-server", "1.0.0")
                .build();

        server.start();
        System.out.println("SSE MCP Server listen on http://127.0.0.1:8080/sse");
    }
}

特点:浏览器 EventSource 原生支持,半双工,多客户端连接。

3. Streamable HTTP(官方新一代标准双向 HTTP 流)

MCP 主推,单端点完成双向流式,替代老旧 SSE

java 复制代码
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.transport.StreamableHttpServerTransport;

public class StreamableHttpMcpServer {
    public static void main(String[] args) {
        // 监听8081,统一访问根路径 /mcp
        StreamableHttpServerTransport transport = new StreamableHttpServerTransport(
                "0.0.0.0",
                8081,
                "/mcp"
        );

        McpServer server = McpServer.builder(transport)
                .serverInfo("demo-streamable-http", "1.0.0")
                .build();

        server.start();
        System.out.println("Streamable HTTP MCP address: http://127.0.0.1:8081/mcp");
    }
}

优势:HTTP/2 双向流、会话持久、自动重连、无需双接口。

4. WebSocket 全双工模式(高实时交互)

原生全双工长连接,适合频繁工具调用、对话打断

java 复制代码
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.transport.WebSocketServerTransport;

public class WebSocketMcpServer {
    public static void main(String[] args) {
        // ws://127.0.0.1:8082/mcp
        WebSocketServerTransport transport = new WebSocketServerTransport(
                "0.0.0.0",
                8082,
                "/mcp"
        );

        McpServer server = McpServer.builder(transport)
                .serverInfo("demo-ws-server", "1.0.0")
                .build();

        server.start();
        System.out.println("WebSocket MCP ws://127.0.0.1:8082/mcp");
    }
}

5. TCP Socket 裸套接字(内网高性能)

无 HTTP 封装,延迟最低,仅后端服务互通,不支持浏览器

java 复制代码
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.transport.TcpServerTransport;

public class TcpMcpServer {
    public static void main(String[] args) {
        TcpServerTransport transport = new TcpServerTransport("0.0.0.0", 8083);

        McpServer server = McpServer.builder(transport)
                .serverInfo("demo-tcp-server", "1.0.0")
                .build();

        server.start();
        System.out.println("TCP MCP listen 127.0.0.1:8083");
    }
}

客户端极简示例(Stdio 客户端调用本地服务)

java 复制代码
import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.transport.StdioClientTransport;
import java.util.List;

public class StdioClientDemo {
    public static void main(String[] args) {
        // 启动MCP服务进程命令
        ProcessBuilder pb = new ProcessBuilder("java", "-cp", "target/classes", "StdioMcpServer");
        Process process = pb.start();

        // 绑定进程流作为客户端传输通道
        StdioClientTransport transport = new StdioClientTransport(process.getInputStream(), process.getOutputStream());
        McpClient client = McpClient.create(transport);

        // 初始化握手
        client.initialize();

        // 调用工具示例
        var tools = client.listTools();
        System.out.println("可用工具列表:" + tools);
    }
}

选型总结

  1. 本地桌面插件、本地调试 → Stdio
  2. 简单网页、低改造需求 → SSE
  3. 新项目、云服务、标准远程部署 → Streamable HTTP
  4. 实时对话、频繁工具交互、需要打断输出 → WebSocket
  5. 内网微服务集群、极致低延迟 → TCP Socket