springframework ai 初始化tool,代码链分析
以如下依赖为示例dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server-webflux/artifactIdversion1.1.0/version/dependencyyaml配置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: trueStatelessToolCallbackConverterAutoConfiguration无状态工具执行服务自动装配类初始化工具toolorg.springframework.ai.mcp.server.common.autoconfigure.StatelessToolCallbackConverterAutoConfiguration#syncTools将tool作为参数创建McpStatelessAsyncServerorg.springframework.ai.mcp.server.common.autoconfigure.McpServerStatelessAutoConfiguration#mcpStatelessSyncServerio.modelcontextprotocol.server.McpServer.StatelessSyncSpecification#buildio.modelcontextprotocol.server.McpStatelessAsyncServer#McpStatelessAsyncServer设置handler查询工具列表处理类io.modelcontextprotocol.server.McpStatelessAsyncServer#toolsListRequestHandlerMcpServerStatelessWebFluxAutoConfigurationMcpServerStatelessWebFluxAutoConfiguration 作用是将指定的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~~