跳转到内容
Spring AI Alibaba 1.0 GA 版本正式发布,开启 Java 智能体开发新时代!点此了解

使用 Spring AI MCP Client Starter 实现 MCP 客户端

案例3:使用 Spring AI MCP Client Starter 实现 MCP 客户端

在前面的案例中,我们看到了如何手动配置和初始化MCP客户端。Spring AI 提供了更简便的方式来使用MCP,通过starter可以大大简化MCP客户端的配置和使用。Spring AI MCP支持两种不同的传输层实现:基于stdio的实现和基于SSE的实现。

传输层介绍

stdio 传输层

stdio(标准输入输出)传输层是MCP最基本的传输实现方式。它通过进程间通信(IPC)实现,具体工作原理如下:

  1. 进程创建:MCP客户端会启动一个子进程来运行MCP服务器
  2. 通信机制
    • 使用标准输入(stdin)向MCP服务器发送请求
    • 通过标准输出(stdout)接收MCP服务器的响应
    • 标准错误(stderr)用于日志和错误信息
  3. 优点
    • 简单可靠,无需网络配置
    • 适合本地部署场景
    • 进程隔离,安全性好
  4. 缺点
    • 仅支持单机部署
    • 不支持跨网络访问
    • 每个客户端需要独立启动服务器进程

SSE 传输层

SSE(Server-Sent Events)传输层是基于HTTP的单向通信机制,专门用于服务器向客户端推送数据。其工作原理如下:

  1. 连接建立
    • 客户端通过HTTP建立与服务器的持久连接
    • 使用text/event-stream内容类型
  2. 通信机制
    • 服务器可以主动向客户端推送消息
    • 支持自动重连机制
    • 支持事件ID和自定义事件类型
  3. 优点
    • 支持分布式部署
    • 可跨网络访问
    • 支持多客户端连接
    • 轻量级,使用标准HTTP协议
  4. 缺点
    • 需要额外的网络配置
    • 相比stdio实现略微复杂
    • 需要考虑网络安全性

3.1 基于 stdio 的 MCP 客户端实现

基于 stdio 的实现是最常见的 MCP 客户端实现方式,它通过标准输入输出流与 MCP 服务器进行通信。这种方式适用于本地部署的 MCP 服务器,可以直接在同一台机器上启动 MCP 服务器进程。

添加依赖

首先,在您的项目中添加 Spring AI MCP starter 依赖:

<!-- 添加Spring AI MCP starter依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>

配置MCP服务器

application.yml中配置MCP服务器:

spring:
ai:
dashscope:
# 配置通义千问API密钥
api-key: ${DASH_SCOPE_API_KEY}
mcp:
client:
stdio:
# 指定MCP服务器配置文件路径(推荐)
servers-configuration: classpath:/mcp-servers-config.json
# 直接配置示例,和上边的配制二选一
# connections:
# server1:
# command: java
# args:
# - -jar
# - /path/to/your/mcp-server.jar

这个配置文件设置了 MCP 客户端的基本配置,包括API密钥和服务器配置文件的位置。你也可以选择直接在配置文件中定义服务器配置。

{
"mcpServers": {
// 定义名为"weather"的MCP服务器
"weather": {
// 指定启动命令为java
"command": "java",
// 定义启动参数
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-jar",
"/path/to/your/mcp-server.jar"
],
// 环境变量配置(可选)
"env": {}
}
}
}

这个 JSON 配置文件定义了 MCP 服务器的详细配置,包括如何启动服务器进程、需要传递的参数以及环境变量设置。

@SpringBootApplication
public class Application {
public static void main(String[] args) {
// 启动Spring Boot应用
SpringApplication.run(Application.class, args);
}
@Bean
public CommandLineRunner predefinedQuestions(
ChatClient.Builder chatClientBuilder,
ToolCallbackProvider tools,
ConfigurableApplicationContext context) {
return args -> {
// 构建ChatClient并注入MCP工具
var chatClient = chatClientBuilder
.defaultTools(tools)
.build();
// 定义用户输入
String userInput = "北京的天气如何?";
// 打印问题
System.out.println("\n>>> QUESTION: " + userInput);
// 调用LLM并打印响应
System.out.println("\n>>> ASSISTANT: " +
chatClient.prompt(userInput).call().content());
// 关闭应用上下文
context.close();
};
}
}

这段代码展示了如何在 Spring Boot 应用中使用MCP客户端。它创建了一个命令行运行器,构建了 ChatClient 并注入了 MCP 工具,然后使用这个客户端发送查询并获取响应。

3.2 基于 SSE 的 MCP 客户端实现

除了基于 stdio 的实现外,Spring AI Alibaba 还提供了基于 Server-Sent Events (SSE) 的 MCP 客户端实现。这种方式适用于远程部署的 MCP 服务器,可以通过 HTTP 协议与 MCP 服务器进行通信。

添加依赖

首先,在您的项目中添加Spring AI MCP starter依赖:

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>

配置 MCP 服务器

application.yml中配置MCP服务器:

spring:
ai:
dashscope:
api-key: ${DASH_SCOPE_API_KEY}
mcp:
client:
sse:
connections:
server1:
url: http://localhost:8080

使用 MCP 客户端

使用方式与基于stdio的实现相同,只需注入ToolCallbackProviderChatClient.Builder

@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,
ToolCallbackProvider tools,
ConfigurableApplicationContext context) {
return args -> {
// 构建ChatClient并注入MCP工具
var chatClient = chatClientBuilder
.defaultTools(tools)
.build();
// 使用ChatClient与LLM交互
String userInput = "北京的天气如何?";
System.out.println("\n>>> QUESTION: " + userInput);
System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());
context.close();
};
}
}

3.3 总结

使用Spring AI Alibaba提供的MCP starter,可以大大简化MCP客户端的配置和使用。您只需要添加相应的依赖,配置MCP服务器,然后注入ToolCallbackProviderChatClient.Builder即可使用MCP功能。

根据您的部署需求,可以选择基于stdio的实现或基于SSE的实现。基于stdio的实现适用于本地部署的MCP服务器,而基于SSE的实现适用于远程部署的MCP服务器。

完整示例代码可在以下链接查看: