Spring AI
参考文档
模型上下文协议 (MCP)
MCP 服务端启动器
MCP 服务端启动器
模型上下文协议 (MCP) 服务端是能够通过标准化协议接口向 AI 应用程序暴露特定功能的程序。每个服务端都为特定领域提供聚焦的功能。
Spring AI MCP 服务端启动器为在 Spring Boot 应用中设置 MCP 服务端提供了自动配置。它们实现了 MCP 服务端功能与 Spring Boot 自动配置系统的无缝集成。
MCP 服务端启动器提供以下功能:
- 自动配置 MCP 服务端组件,包括工具(Tools)、资源(Resources)和提示(Prompts)
- 支持不同的 MCP 协议版本,包括 STDIO、SSE、Streamable-HTTP 和无状态(Stateless)服务端
- 支持同步和异步两种操作模式
- 多种传输层选项
- 灵活的工具、资源和提示规范
- 变更通知能力
- 基于注解的服务端开发,具备自动 Bean 扫描和注册功能
MCP 服务端启动器
MCP 服务端支持多种协议和传输机制。使用专用的启动器和正确的 spring.ai.mcp.server.protocol 属性来配置您的服务端:
STDIO
| 服务端类型 | 依赖 | 属性 |
|---|---|---|
| 标准输入/输出 (STDIO) | spring-ai-starter-mcp-server |
spring.ai.mcp.server.stdio=true |
WebMVC
| 服务端类型 | 依赖 | 属性 |
|---|---|---|
| SSE WebMVC (自 2.0.0 版本起已弃用,请使用 STREAMABLE) | spring-ai-starter-mcp-server-webmvc |
spring.ai.mcp.server.protocol=SSE |
| Streamable-HTTP WebMVC | spring-ai-starter-mcp-server-webmvc |
spring.ai.mcp.server.protocol=STREAMABLE |
| 无状态 WebMVC | spring-ai-starter-mcp-server-webmvc |
spring.ai.mcp.server.protocol=STATELESS |
WebFlux (响应式)
| 服务端类型 | 依赖 | 属性 |
|---|---|---|
| SSE WebFlux (自 2.0.0 版本起已弃用,请使用 STREAMABLE) | spring-ai-starter-mcp-server-webflux |
spring.ai.mcp.server.protocol=SSE |
| Streamable-HTTP WebFlux | spring-ai-starter-mcp-server-webflux |
spring.ai.mcp.server.protocol=STREAMABLE |
| 无状态 WebFlux | spring-ai-starter-mcp-server-webflux |
spring.ai.mcp.server.protocol=STATELESS |
服务端能力
根据服务端和传输类型的不同,MCP 服务端可以支持多种能力,例如:
- 工具 - 允许服务端向语言模型暴露可调用的工具
- 资源 - 为服务端向客户端暴露资源提供标准化方式
- 提示 - 为服务端向客户端暴露提示模板提供标准化方式
- 实用功能/补全 - 为服务端提供提示和资源 URI 的参数自动补全建议提供标准化方式
- 实用功能/日志 - 为服务端向客户端发送结构化日志消息提供标准化方式
- 实用功能/进度 - 通过通知消息为长时间运行的操作提供可选的进度跟踪
- 实用功能/Ping - 为服务端报告其状态提供可选的健康检查机制
所有能力默认启用。禁用某项能力将阻止服务端向客户端注册和暴露相应的功能。
服务端协议
MCP 提供了几种协议类型,包括:
- STDIO - 进程内(例如,服务端在宿主应用内部运行)协议。通过标准输入和标准输出进行通信。设置
spring.ai.mcp.server.stdio=true以启用 STDIO。 - SSE - 用于实时更新的服务器发送事件协议。服务端作为一个独立进程运行,可以处理多个客户端连接。
- Streamable-HTTP - Streamable HTTP 传输允许 MCP 服务端作为独立进程运行,使用 HTTP POST 和 GET 请求处理多个客户端连接,并可选择使用服务器发送事件 (SSE) 流式传输多个服务端消息。它取代了 SSE 传输。设置
spring.ai.mcp.server.protocol=STREAMABLE以启用 STREAMABLE 协议。 - 无状态 - 无状态 MCP 服务端专为简化部署而设计,不在请求之间维护会话状态。它们非常适合微服务架构和云原生部署。设置
spring.ai.mcp.server.protocol=STATELESS以启用 STATELESS 协议。
同步/异步服务端 API 选项
MCP 服务端 API 支持命令式(即同步)和响应式(例如异步)编程模型。
-
同步服务端 - 使用
McpSyncServer实现的默认服务端类型。它专为应用中的简单请求-响应模式而设计。在您的配置中设置spring.ai.mcp.server.type=SYNC以启用此服务端类型。激活后,它会自动处理同步工具规范的配置。注意:SYNC 服务端将仅注册同步的 MCP 注解方法。异步方法将被忽略。
-
异步服务端 - 异步服务端实现使用
McpAsyncServer,并针对非阻塞操作进行了优化。要启用此服务端类型,请配置您的应用程序spring.ai.mcp.server.type=ASYNC。此服务端类型会自动设置带有 Project Reactor 支持的异步工具规范。注意:ASYNC 服务端将仅注册异步的 MCP 注解方法。同步方法将被忽略。
MCP 服务端注解
MCP 服务端启动器为基于注解的服务端开发提供全面支持,允许您使用声明式 Java 注解而非手动配置来创建 MCP 服务端。
关键注解
@McpTool- 将方法标记为 MCP 工具,并支持自动生成 JSON 模式@McpResource- 通过 URI 模板提供对资源的访问@McpPrompt- 为 AI 交互生成提示消息@McpComplete- 为提示提供自动补全功能
特殊参数
注解系统支持特殊的参数类型,这些类型提供额外的上下文:
McpMeta- 访问来自 MCP 请求的元数据@McpProgressToken- 为长时间运行的操作接收进度令牌McpSyncServerExchange/McpAsyncServerExchange- 用于高级操作的完整服务端上下文McpTransportContext- 用于无状态操作的轻量级上下文CallToolRequest- 为灵活工具提供动态模式支持
简单示例
java
@Component
public class CalculatorTools {
@McpTool(name = "add", description = "将两个数字相加")
public int add(
@McpToolParam(description = "第一个数字", required = true) int a,
@McpToolParam(description = "第二个数字", required = true) int b) {
return a + b;
}
@McpResource(uri = "config://{key}", name = "配置")
public String getConfig(String key) {
return configData.get(key);
}
}
向 McpTransportContext 添加数据
默认情况下,McpTransportContext 是空的 (McpTransportContext.EMPTY)。这是设计使然,目的是保持 MCP 服务端的传输无关性。
如果您需要工具中的传输特定元数据(例如,HTTP 头、远程主机等),请在您的传输提供者上配置一个 TransportContextExtractor。
对于 WebMVC:
java
@Bean
public WebMvcStreamableServerTransportProvider transport() {
return WebMvcStreamableServerTransportProvider.builder()
.contextExtractor(serverRequest -> {
String authorization = serverRequest.headers().firstHeader("Authorization");
return McpTransportContext.create(Map.of("authorization", authorization));
})
.build();
}
对于 WebFlux (响应式):
java
@Bean
public WebFluxStreamableServerTransportProvider transport() {
return WebFluxStreamableServerTransportProvider.builder()
.contextExtractor(serverRequest -> {
String authorization = serverRequest.headers().firstHeader("Authorization");
return McpTransportContext.create(Map.of("authorization", authorization));
})
.build();
}
配置完成后,可以在您的工具中通过 McpSyncRequestContext(或 McpAsyncRequestContext)访问此上下文。
java
@McpTool
public String accessProtectedResource(McpSyncRequestContext requestContext) {
McpTransportContext context = requestContext.transportContext();
String authorization = (String) context.get("authorization");
return "成功访问受保护资源。";
}
自动配置
借助 Spring Boot 自动配置,带注解的 Bean 会被自动检测并注册:
java
@SpringBootApplication
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
}
自动配置将:
- 扫描带有 MCP 注解的 Bean
- 创建相应的规范
- 将它们注册到 MCP 服务端
- 根据配置处理同步和异步实现
配置属性
配置服务端注解扫描器:
yaml
spring:
ai:
mcp:
server:
type: SYNC # 或 ASYNC
annotation-scanner:
enabled: true
其他资源
- 服务端注解参考 - 服务端注解完整指南
- 特殊参数 - 高级参数注入
- 示例 - 综合示例和使用案例
示例应用程序
- Weather Server (SSE WebFlux) - 使用 WebFlux 传输的 Spring AI MCP 服务端启动器
- Weather Server (STDIO) - 使用 STDIO 传输的 Spring AI MCP 服务端启动器
- Weather Server Manual Configuration - 不使用自动配置,而是使用 Java SDK 手动配置服务端的 Spring AI MCP 服务端启动器
- Streamable-HTTP WebFlux/WebMVC 示例 - 待办
- 无状态 WebFlux/WebMVC 示例 - 待办
其他资源
- MCP 服务端注解 - 使用注解进行声明式服务端开发
- 特殊参数 - 高级参数注入和上下文访问
- MCP 注解示例 - 综合示例和使用案例
- Spring AI 文档
- 模型上下文协议规范
- Spring Boot 自动配置