以如下依赖为示例:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
<version>1.1.0</version>
</dependency>
yaml配置
spring:
ai:
mcp:
server:
protocol: STATELESS
name: xxx-streamable-mcp-server
version: 1.0.0
type: SYNC
instructions: "xxx"
resource-change-notification: true
tool-change-notification: true
prompt-change-notification: true
StatelessToolCallbackConverterAutoConfiguration
无状态工具执行服务自动装配类
初始化工具tool
org.springframework.ai.mcp.server.common.autoconfigure.StatelessToolCallbackConverterAutoConfiguration#syncTools
将tool作为参数,创建McpStatelessAsyncServer
org.springframework.ai.mcp.server.common.autoconfigure.McpServerStatelessAutoConfiguration#mcpStatelessSyncServer
io.modelcontextprotocol.server.McpServer.StatelessSyncSpecification#build
io.modelcontextprotocol.server.McpStatelessAsyncServer#McpStatelessAsyncServer(设置handler)
查询工具列表处理类
io.modelcontextprotocol.server.McpStatelessAsyncServer#toolsListRequestHandler
McpServerStatelessWebFluxAutoConfiguration
McpServerStatelessWebFluxAutoConfiguration 作用是将指定的endpoint暴露出去
@AutoConfiguration(
before = {McpServerStatelessAutoConfiguration.class}
)
@ConditionalOnClass({McpSchema.class})
@EnableConfigurationProperties({McpServerStreamableHttpProperties.class})
@Conditional({McpServerStdioDisabledCondition.class, McpServerStatelessAutoConfiguration.EnabledStatelessServerCondition.class})
public class McpServerStatelessWebFluxAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public WebFluxStatelessServerTransport webFluxStatelessServerTransport(@Qualifier("mcpServerObjectMapper") ObjectMapper objectMapper, McpServerStreamableHttpProperties serverProperties) {
return WebFluxStatelessServerTransport.builder().jsonMapper(new JacksonMcpJsonMapper(objectMapper)).messageEndpoint(serverProperties.getMcpEndpoint()).build();
}
@Bean
@ConditionalOnMissingBean(
name = {"webFluxStatelessServerRouterFunction"}
)
public RouterFunction<?> webFluxStatelessServerRouterFunction(WebFluxStatelessServerTransport webFluxStatelessTransport) {
return webFluxStatelessTransport.getRouterFunction();
}
}
RouterFunction用的很巧妙
todo~~