前言

最近调研了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相关。此文档作为一个调研的记录

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐