Spring AI / Model Context Protocol (MCP) / MCP Server Boot Starters / Stateless Streamable-HTTP MCP
Spring AI
参考资料
模型上下文协议(MCP)
MCP 服务端启动启动器
无状态 Streamable-HTTP MCP 服务端
无状态 Streamable-HTTP MCP 服务端
无状态 Streamable-HTTP MCP 服务端专为简化部署而设计,其会话状态不在请求之间维护。这些服务端非常适合微服务架构和云原生部署。
设置 spring.ai.mcp.server.protocol=STATELESS 属性
使用 Streamable-HTTP 客户端连接到无状态服务端。
无状态服务端不支持向 MCP 客户端发送消息请求(例如,elicitation、sampling、ping)。
无状态 WebMVC 服务端
使用 spring-ai-starter-mcp-server-webmvc 依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
并设置 spring.ai.mcp.server.protocol 属性为 STATELESS。
spring.ai.mcp.server.protocol=STATELESS
- 使用 Spring MVC 传输协议的无状态操作
- 无会话状态管理
- 简化的部署模型
- 针对云原生环境进行了优化
无状态 WebFlux 服务端
使用 spring-ai-starter-mcp-server-webflux 依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
并设置 spring.ai.mcp.server.protocol 属性为 STATELESS。
- 使用 WebFlux 传输协议的响应式无状态操作
- 无会话状态管理
- 非阻塞请求处理
- 针对高吞吐量场景进行了优化
配置属性
通用属性
所有通用属性均以 spring.ai.mcp.server 为前缀:
| 属性 | 描述 | 默认值 |
|---|---|---|
enabled |
启用/禁用无状态 MCP 服务端 | true |
protocol |
MCP 服务端协议。必须设置为 STATELESS 以启用无状态服务端 |
- |
tool-callback-converter |
启用/禁用将 Spring AI ToolCallback 转换为 MCP 工具规范 |
true |
name |
用于标识的服务端名称 | mcp-server |
version |
服务端版本 | 1.0.0 |
instructions |
可选的客户端交互说明 | null |
type |
服务端类型(SYNC/ASYNC) |
SYNC |
capabilities.resource |
启用/禁用资源功能 | true |
capabilities.tool |
启用/禁用工具功能 | true |
capabilities.prompt |
启用/禁用提示功能 | true |
capabilities.completion |
启用/禁用补全功能 | true |
expose-mcp-client-tools |
是否将下游 MCP 工具(由 MCP 客户端提供)作为此 MCP 服务端的工具重新暴露 | false |
tool-response-mime-type |
按工具名称指定的响应 MIME 类型 | - |
request-timeout |
请求超时持续时间 | 20 秒 |
MCP 注解属性
MCP 服务端注解提供了一种使用 Java 注解实现 MCP 服务端处理程序的声明式方式。
服务端 mcp-annotations 属性以 spring.ai.mcp.server.annotation-scanner 为前缀:
| 属性 | 描述 | 默认值 |
|---|---|---|
enabled |
启用/禁用 MCP 服务端注解自动扫描 | true |
无状态连接属性
所有连接属性均以 spring.ai.mcp.server.stateless 为前缀:
| 属性 | 描述 | 默认值 |
|---|---|---|
mcp-endpoint |
自定义 MCP 端点路径 | /mcp |
disallow-delete |
禁止删除操作 | false |
特性和功能
MCP 服务端启动启动器允许服务端向客户端暴露工具、资源和提示。它会根据服务端类型,自动将注册为 Spring Bean 的自定义能力处理器转换为同步/异步规范:
工具
允许服务端暴露可供语言模型调用的工具。MCP 服务端启动启动器提供:
-
变更通知支持
-
Spring AI 工具会根据服务端类型自动转换为同步/异步规范
-
通过 Spring Bean 自动生成工具规范:
@Bean public ToolCallbackProvider myTools(...) { List<ToolCallback> tools = ... return ToolCallbackProvider.from(tools); }或使用低级 API:
@Bean public List<McpStatelessServerFeatures.SyncToolSpecification> myTools(...) { List<McpStatelessServerFeatures.SyncToolSpecification> tools = ... return tools; }自动配置会自动检测并注册所有工具回调,来源包括:
- 单独的
ToolCallbackBean ToolCallback列表 BeanToolCallbackProviderBean
工具会按名称去重,每个工具名称首次出现时被使用。
您可以通过将tool-callback-converter设置为false来禁用所有工具回调的自动检测和注册。
工具上下文支持不适用于无状态服务端。
- 单独的
资源
为服务端提供了一种向客户端暴露资源的标准方式。
-
静态和动态资源规范
-
可选的变更通知
-
支持资源模板
-
在同步和异步资源规范之间自动转换
-
通过 Spring Bean 自动生成资源规范:
@Bean public List<McpStatelessServerFeatures.SyncResourceSpecification> myResources(...) { var systemInfoResource = new McpSchema.Resource(...); var resourceSpecification = new McpStatelessServerFeatures.SyncResourceSpecification(systemInfoResource, (context, request) -> { try { var systemInfo = Map.of(...); String jsonContent = new JsonMapper().writeValueAsString(systemInfo); return new McpSchema.ReadResourceResult( List.of(new McpSchema.TextResourceContents(request.uri(), "application/json", jsonContent))); } catch (Exception e) { throw new RuntimeException("Failed to generate system info", e); } }); return List.of(resourceSpecification); }
提示
为服务端提供了一种向客户端暴露提示模板的标准方式。
-
变更通知支持
-
模板版本化
-
在同步和异步提示规范之间自动转换
-
通过 Spring Bean 自动生成提示规范:
@Bean public List<McpStatelessServerFeatures.SyncPromptSpecification> myPrompts() { var prompt = new McpSchema.Prompt("greeting", "A friendly greeting prompt", List.of(new McpSchema.PromptArgument("name", "The name to greet", true))); var promptSpecification = new McpStatelessServerFeatures.SyncPromptSpecification(prompt, (context, getPromptRequest) -> { String nameArgument = (String) getPromptRequest.arguments().get("name"); if (nameArgument == null) { nameArgument = "friend"; } var userMessage = new PromptMessage(Role.USER, TextContent.builder("Hello " + nameArgument + "! How can I assist you today?").build()); return GetPromptResult.builder(List.of(userMessage)).description("A personalized greeting message").build(); }); return List.of(promptSpecification); }
补全
为服务端提供了一种向客户端暴露补全功能的标准方式。
-
支持同步和异步补全规范
-
通过 Spring Bean 自动注册:
@Bean public List<McpStatelessServerFeatures.SyncCompletionSpecification> myCompletions() { var completion = new McpStatelessServerFeatures.SyncCompletionSpecification( new McpSchema.PromptReference( "ref/prompt", "code-completion", "Provides code completion suggestions"), (exchange, request) -> { // 返回补全建议的实现 return new McpSchema.CompleteResult(List.of("python", "pytorch", "pyside"), 10, true); } ); return List.of(completion); }
使用示例
无状态服务端配置
spring:
ai:
mcp:
server:
protocol: STATELESS
name: stateless-mcp-server
version: 1.0.0
type: ASYNC
instructions: "此无状态服务端针对云部署进行了优化"
streamable-http:
mcp-endpoint: /api/mcp
创建带有 MCP 服务端的 Spring Boot 应用
@Service
public class WeatherService {
@Tool(description = "根据城市名称获取天气信息")
public String getWeather(String cityName) {
// 实现
}
}
@SpringBootApplication
public class McpServerApplication {
private static final Logger logger = LoggerFactory.getLogger(McpServerApplication.class);
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
}
自动配置会自动将工具回调注册为 MCP 工具。您可以有多个生成 ToolCallbacks 的 Bean,自动配置会将它们合并。
更多推荐

所有评论(0)