Spring自定义MCP sse-endpoint配置指南
作者:Gwanda
前言
最近调研了MCP的相关内容,尝试自定义MCP server的端点,并在MCP client里配置自定义的server 端点,发现官方的文档缺失了一部分,且无法通过yaml直接自定义。经过翻看源码后,成功修改了配置,以下是一些记录。
一、MCP server配置自定义sse-endpoint
首先,根据SpringAI官方文档,在yaml文件中,spring.ai.mcp.server.sse-endpoint为自定义端点
但是,经过验证,只配置该选项,启动正常,通过postman调用新配置的sse-endpoint :“http://localhost:8080/demo/sse”,会提示404 not found。
通过断点,发现项目启动时,框架通过McpWebMvcServerAutoConfiguration来进行自动配置
通过源码,发现配置的sse-endpoint,并没有在配置类里引用,无论配置什么地址,都是使用默认的/sse作为端点。
而springboot是可以通过自己编写配置类,来实现对jar包内的配置类的补充和覆盖,所以第一时间就想到了,自己编写一个config,实现获取yaml里的配置内容,代码如下
/** * @className: MyMcpServerConfig * @author: huajie * @date: 2025/4/29 * @Description: **/ @Configuration public class MyMcpServerConfig { @Bean @Primary public WebMvcSseServerTransportProvider webMvcSseServerTransportProvider( ObjectProvider<ObjectMapper> objectMapperProvider, McpServerProperties serverProperties) { ObjectMapper objectMapper = objectMapperProvider.getIfAvailable(ObjectMapper::new); return new WebMvcSseServerTransportProvider(objectMapper, serverProperties.getSseMessageEndpoint(), serverProperties.getSseEndpoint()); } @Bean public RouterFunction<ServerResponse> mvcMcpRouterFunction(WebMvcSseServerTransportProvider transportProvider) { return transportProvider.getRouterFunction(); } }
重新启动,可以通过postman访问自定义的地址了
二、MCP client配置
在server端配置完成后,client也需要同步配置,不然启动会提示404,找不到server的地址,但在翻阅文档后,发现spring提供的client相关jar,并没有配置自定义sse-endpoint的方式😡,没有办法,又需要自定义相关配置类了,首先,先在yaml里增加对应key
翻看源码和断点,找到client端的自动配置class
按照server端的经验,编写自定义config,此处需要注意,因为yaml里并不存在sseEndpoint这个key,我们需要先自定义一个SseClientProperties,替换源码里的McpSseClientProperties
@Configuration public class MyMcpSseConfig { private final SseClientProperties sseClientProperties; public MyMcpSseConfig(SseClientProperties sseClientProperties) { this.sseClientProperties = sseClientProperties; } @Bean // @Primary public List<NamedClientMcpTransport> mcpHttpClientTransports(SseClientProperties sseProperties, ObjectProvider<ObjectMapper> objectMapperProvider) { ObjectMapper objectMapper = objectMapperProvider.getIfAvailable(ObjectMapper::new); List<NamedClientMcpTransport> sseTransports = new ArrayList<>(); for (Map.Entry<String, SseClientProperties.Connection> serverParameters : sseProperties.getConnections().entrySet()) { String url = serverParameters.getValue().getUrl(); String sseEndpoint = serverParameters.getValue().getSseEndpoint(); var transport = new HttpClientSseClientTransport(HttpClient.newBuilder(), url, sseEndpoint, objectMapper); sseTransports.add(new NamedClientMcpTransport(serverParameters.getKey(), transport)); } return sseTransports; } }
源码里的McpSseClientProperties:
编写完成后启动,此时console报错,提示
询问模型后,发现是因为Spring Boot 中,同名的 Bean 不能重复注册, mcpHttpClientTransports 这个 Bean,在两个地方都被定义了: 1个在官方自动配置 SseHttpClientTransportAutoConfiguration, 1个在自己的配置类 MyMcpSseConfig
通过修改启动类,排除官方自动配置的class
@SpringBootApplication(exclude = {SseHttpClientTransportAutoConfiguration.class})
再次启动,此时console没有报错了,通过postman调用client的接口,也可以正常调用server里编写的tools
总结
SpringAI还是一个比较新的内容,很多文档、代码,可能都存在一些缺漏,而且网上相关内容也较少,尤其是MCP相关。此文档作为一个调研的记录
到此这篇关于Spring自定义MCP sse-endpoint配置指南的文章就介绍到这了,更多相关Spring MCP sse-endpoint内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!