MCP 客户端 SDK

MCP 服务端 SDK

其他

MCP 客户端 SDK 设置

安装依赖

我们需要使用 AJ MCP SDK 来进行 API 请求。安装依赖如下:


<dependency>
    <groupId>com.ajaxjs</groupId>
    <artifactId>aj-mcp-client</artifactId>
    <version>1.6</version>
</dependency>

您可以通过以下链接找到最新版本: Maven Central

客户端 SDK 的实现由两个主要组件组成:

设置传输层 Transport

首先创建与 MCP 服务端匹配的传输层。客户端支持 STDIO、旧版双端点 HTTP/SSE 和 Streamable HTTP 三类传输。

标准输入输出(Stdio)传输

“Stdio” 是标准输入/输出的缩写,通常用于在程序和人之间通过命令行交互。在这里,它用于 MCP 客户端和 MCP 服务器之间的交互。通常,Stdio 用于本地应用程序,如 *.exe 程序或 Java Jar 程序等。

// MCP 服务器是一个 Java 程序,使用标准输入输出运行。
McpTransport transport = StdioTransport.builder()
                .command(Arrays.asList("java", "-jar", "C:\\app\\my-app-jar-with-dependencies.jar"))
                .logEvents(true)
                .build();

以下是一个 .exe 程序的示例:

// MCP 服务器是一个可执行程序,使用标准输入输出运行。
McpTransport transport = StdioTransport.builder()
                .command(Arrays.asList("C:\\app\\my-app.exe", "-token", "dd4df2sx32ds"))
                .logEvents(true)
                .build();

调试时可将 logEvents 设置为 true,以记录发出的协议消息。传输层也会持续消费子进程的 stderr,避免错误输出管道写满后阻塞子进程。

旧版 HTTP/SSE 传输

旧版传输使用 SSE 端点承载服务端到客户端的消息,并使用服务端公布的 POST 端点承载客户端请求,适用于需要对接旧 MCP 服务的场景。

McpTransport transport = HttpMcpTransport.builder()
        .sseUrl("http://localhost:8080/sse")
        .logRequests(true)
        .logResponses(true)
        .build();

sseUrl 是必需的,它指定 MCP 服务器的 SSE 端点 URL。

Streamable HTTP(2025-03-26 / 2025-06-18)

较新的协议版本使用单一 HTTP 端点:

McpTransport transport = StreamableHttpTransport.builder()
        .endpointUrl("http://localhost:8080/mcp")
        .openEventStream(true)
        .build();

McpClient client = McpClient.builder()
        .transport(transport)
        .protocolVersion("2025-06-18")
        .build();
client.

initialize();

如需 OAuth Bearer token,可通过 requestHeaders 传入 Authorization。SDK 会保存服务端返回的 session ID,并在后续请求中自动加入协商后的 MCP-Protocol-Version

如果客户端声明了 Roots、Sampling 或 Elicitation handler,请设置 openEventStream(true);服务端主动请求通过可选的 GET event stream 到达客户端。该流会在初始化后异步打开。

当前限制:POST text/event-stream 响应会先完整缓冲,尚不能按事件增量处理;请使用普通 JSON POST 响应。可选 GET event stream 目前没有断线重连/恢复策略,初始化也不会等待它就绪。在该限制解除前,请勿依赖通过 POST 响应增量发送的 progress 或服务端请求。

MCP 客户端

MCP 客户端充当本地应用程序与远程工具实现之间的桥梁。

McpClient mcpClient = McpClient.builder()
        .clientName("my-host")
        .clientVersion("1.2")
        .transport(transport)
        .build();

通常我们会填写 clientNameclientVersion 属性:

所有属性如下所示:

属性 说明 值类型 示例值
clientName 设置客户端在初始化消息中向 MCP 服务器标识自己的名称。 String myapp/foo-app
clientVersion 设置客户端在初始化消息中向 MCP 服务器标识自己的版本字符串。默认值为 "1.0"。 String 1.0/2.1.2
protocolVersion 设置客户端在初始化消息中声明的协议版本。当前默认值为 "2024-11-05",但在后续版本中可能会有所更改。 String 2024-11-05
requestTimeout 所有请求(包括初始化和健康检查)的超时时间。默认值为 60 秒;0 表示无限等待,负值不合法。 Duration Duration.ofSeconds(60)

请注意,在创建 McpClient 后,应立即调用 mcpClient.initialize();。关于初始化工作将在下一小节介绍。

McpClient mcpClient = McpClient.builder()
        .clientName("my-host")
        .clientVersion("1.2")
        .transport(sseTransport)
        .build();

mcpClient.

initialize();

不再使用客户端时应调用 close()。关闭操作会释放 HTTP/SSE 请求或 Stdio 子进程,并使尚未完成的请求以异常结束。

try(IMcpClient mcpClient2 = McpClient.builder().transport(transport).build()){
        mcpClient2.

initialize();
    ...
            }catch(
Exception e){
        throw new

RuntimeException(e);
}

MCP 客户端遵循分层架构,接口定义与实现之间有清晰的分离。客户端依赖传输层与服务器进行实际通信,并抽象通信细节以支持不同的传输机制。