跳到主要内容

MCP 客户端启动器

DeepSeek V3 中英对照 MCP Client Boot Starters MCP Client Boot Starter

Spring AI MCP(Model Context Protocol)Client Boot Starter 为 Spring Boot 应用程序中的 MCP 客户端功能提供了自动配置。它支持同步和异步客户端实现,并提供多种传输选项。

MCP 客户端启动器提供以下功能:

  • 多客户端实例管理

  • 自动客户端初始化(如果启用)

  • 支持多个命名传输

  • 与 Spring AI 的工具执行框架集成

  • 适当的生命周期管理,在应用程序上下文关闭时自动清理资源

  • 通过自定义器进行可定制的客户端创建

入门指南

标准 MCP 客户端

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

标准启动器通过 STDIO(进程内)和/或 SSE(远程)传输同时连接到一个或多个 MCP 服务器。SSE 连接使用基于 HttpClient 的传输实现。每个与 MCP 服务器的连接都会创建一个新的 MCP 客户端实例。你可以选择 SYNCASYNC MCP 客户端(注意:不能混合使用同步和异步客户端)。对于生产部署,我们建议使用基于 WebFlux 的 SSE 连接,并配合 spring-ai-mcp-client-webflux-spring-boot-starter 使用。

WebFlux 客户端

WebFlux 启动器提供了与标准启动器类似的功能,但使用了基于 WebFlux 的 SSE 传输实现。

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

配置属性

通用属性

常见的属性以 spring.ai.mcp.client 为前缀:

属性描述默认值
enabled启用/禁用 MCP 客户端true
nameMCP 客户端实例的名称(用于兼容性检查)spring-ai-mcp-client
versionMCP 客户端实例的版本1.0.0
initialized是否在创建时初始化客户端true
request-timeoutMCP 客户端请求的超时时间20s
type客户端类型(SYNC 或 ASYNC)。所有客户端必须为同步或异步,不支持混合类型SYNC
root-change-notification启用/禁用所有客户端的根变更通知true

Stdio 传输属性

标准 I/O 传输的属性前缀为 spring.ai.mcp.client.stdio

属性描述默认值
servers-configuration包含 MCP 服务器配置的资源,格式为 JSON-
connections命名的 stdio 连接配置的映射-
connections.[name].command为 MCP 服务器执行的命令-
connections.[name].args命令参数列表-
connections.[name].env服务器进程的环境变量映射-

示例配置:

spring:
ai:
mcp:
client:
stdio:
root-change-notification: true
connections:
server1:
command: /path/to/server
args:
- --port=8080
- --mode=production
env:
API_KEY: your-api-key
DEBUG: "true"
yaml

或者,你也可以使用外部 JSON 文件来配置 stdio 连接,使用 Claude Desktop 格式

spring:
ai:
mcp:
client:
stdio:
servers-configuration: classpath:mcp-servers.json
yaml

Claude 桌面格式如下所示:

{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/username/Desktop",
"/Users/username/Downloads"
]
}
}
}
json

目前,Claude Desktop 格式仅支持 STDIO 连接类型。

SSE 传输属性

服务器发送事件(SSE)传输的属性前缀为 spring.ai.mcp.client.sse

属性描述
connections命名的 SSE 连接配置的映射
connections.[name].url与 MCP 服务器进行 SSE 通信的 URL 端点

示例配置:

spring:
ai:
mcp:
client:
sse:
connections:
server1:
url: http://localhost:8080
server2:
url: http://otherserver:8081
yaml

功能

同步/异步客户端类型

starter 支持两种类型的客户端:

  • 同步(Synchronous)- 默认的客户端类型,适用于传统的请求-响应模式,支持阻塞操作

  • 异步(Asynchronous)- 适用于响应式应用,支持非阻塞操作,通过配置 spring.ai.mcp.client.type=ASYNC 来启用

客户端自定义

自动配置通过回调接口提供了广泛的客户端规范定制能力。这些定制器允许您配置 MCP 客户端行为的各个方面,从请求超时到事件处理和消息处理。

自定义类型

以下自定义选项可用:

  • 请求配置 - 设置自定义请求超时

  • 自定义采样处理器 - 服务器通过客户端从 LLM 请求 LLM 采样(completionsgenerations)的标准化方式。此流程允许客户端保持对模型访问、选择和权限的控制,同时使服务器能够利用 AI 能力 —— 无需服务器 API 密钥。

  • 文件系统(根目录)访问 - 客户端向服务器暴露文件系统 roots 的标准化方式。根目录定义了服务器在文件系统中操作的范围,使它们能够了解可以访问哪些目录和文件。服务器可以从支持此功能的客户端请求根目录列表,并在该列表更改时接收通知。

  • 事件处理器 - 当某个服务器事件发生时,客户端的处理器会收到通知:

    • 工具变更通知 - 当可用服务器工具列表发生变化时

    • 资源变更通知 - 当可用服务器资源列表发生变化时

    • 提示变更通知 - 当可用服务器提示列表发生变化时

  • 日志处理器 - 服务器向客户端发送结构化日志消息的标准化方式。客户端可以通过设置最低日志级别来控制日志的详细程度。

你可以根据应用程序的需求,选择实现 McpSyncClientCustomizer 用于同步客户端,或者实现 McpAsyncClientCustomizer 用于异步客户端。

@Component
public class CustomMcpSyncClientCustomizer implements McpSyncClientCustomizer {
@Override
public void customize(String serverConfiurationName, McpClient.SyncSpec spec) {

// Customize the request configuration
spec.requestTimeout(Duration.ofSeconds(30));

// Sets the root URIs that the server connecto this client can access.
spec.roots(roots);

// Sets a custom sampling handler for processing message creation requests.
spec.sampling((CreateMessageRequest messageRequest) -> {
// Handle sampling
CreateMessageResult result = ...
return result;
});

// Adds a consumer to be notified when the available tools change, such as tools
// being added or removed.
spec.toolsChangeConsumer((List<McpSchema.Tool> tools) -> {
// Handle tools change
});

// Adds a consumer to be notified when the available resources change, such as resources
// being added or removed.
spec.resourcesChangeConsumer((List<McpSchema.Resource> resources) -> {
// Handle resources change
});

// Adds a consumer to be notified when the available prompts change, such as prompts
// being added or removed.
spec.promptsChangeConsumer((List<McpSchema.Prompt> prompts) -> {
// Handle prompts change
});

// Adds a consumer to be notified when logging messages are received from the server.
spec.loggingConsumer((McpSchema.LoggingMessageNotification log) -> {
// Handle log messages
});
}
}
java

serverConfiurationName 参数是自定义程序所应用的服务器配置的名称,同时也是为 MCP Client 创建的服务器配置的名称。

MCP 客户端自动配置会自动检测并应用在应用程序上下文中找到的任何自定义器。

传输支持

自动配置支持多种传输类型:

  • 标准输入输出(Stdio)(由 spring-ai-mcp-client-spring-boot-starter 激活)

  • SSE HTTP(由 spring-ai-mcp-client-spring-boot-starter 激活)

  • SSE WebFlux(由 spring-ai-starter-mcp-client-webflux 激活)

与 Spring AI 集成

starter 自动配置了与 Spring AI 的工具执行框架集成的工具回调,允许 MCP 工具作为 AI 交互的一部分使用。

使用示例

将适当的基础依赖项添加到您的项目中,并在 application.propertiesapplication.yml 中配置客户端:

spring:
ai:
mcp:
client:
enabled: true
name: my-mcp-client
version: 1.0.0
request-timeout: 30s
type: SYNC # or ASYNC for reactive applications
sse:
connections:
server1:
url: http://localhost:8080
server2:
url: http://otherserver:8081
stdio:
root-change-notification: false
connections:
server1:
command: /path/to/server
args:
- --port=8080
- --mode=production
env:
API_KEY: your-api-key
DEBUG: "true"
yaml

MCP 客户端 bean 将自动配置并可用于注入:

@Autowired
private List<McpSyncClient> mcpSyncClients; // For sync client

// OR

@Autowired
private List<McpAsyncClient> mcpAsyncClients; // For async client
java

此外,所有 MCP 客户端注册的 MCP Tools 都通过 ToolCallbackProvider 实例以 ToolCallback 列表的形式提供:

@Autowired
private SyncMcpToolCallbackProvider toolCallbackProvider;
ToolCallback[] toolCallbacks = toolCallbackProvider.getToolCallbacks();
java

示例应用

附加资源