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;
    }
    

    自动配置会自动检测并注册所有工具回调,来源包括:

    • 单独的 ToolCallback Bean
    • ToolCallback 列表 Bean
    • ToolCallbackProvider Bean
      工具会按名称去重,每个工具名称首次出现时被使用。
      您可以通过将 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,自动配置会将它们合并。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐