Spring自定义MCP sse-endpoint配置指南

 更新时间:2025年09月11日 10:16:01   作者:Gwanda  
本文给大家介绍Spring自定义MCP sse-endpoint配置指南,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

前言

最近调研了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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot使用 druid 连接池来优化分页语句

    SpringBoot使用 druid 连接池来优化分页语句

    这篇文章主要介绍了SpringBoot使用 druid 连接池来优化分页语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java如何随机生成图片验证码

    Java如何随机生成图片验证码

    这篇文章主要为大家详细介绍了Java如何随机生成图片验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • 详解java基础--提示对话框的使用

    详解java基础--提示对话框的使用

    这篇文章主要介绍了java基础--提示对话框的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • MyBatis中批量插入和批量更新的实现方法详解

    MyBatis中批量插入和批量更新的实现方法详解

    这篇文章主要介绍了MyBatis中批量插入和批量更新的实现方法,在日常开发中有时候需要从A数据库提取大量数据同步到B系统,这种情况自然是需要批量操作才行,感兴趣想要详细了解可以参考下文
    2023-05-05
  • Java浮点类数字运算方式

    Java浮点类数字运算方式

    在进行浮点数的加减运算时,直接使用+和-可能会引入精度误差,为了比较浮点数,可以使用Double的compareTo()方法,或者通过定义一个容差值(Epsilon)来判断两个浮点数是否相等,此外,Double.compare()方法也能比较两个double值
    2024-10-10
  • Java 中分形图的几种方法详解

    Java 中分形图的几种方法详解

    这篇文章主要介绍了Java 中几种分形的方法详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • Java项目之java+springboot+ssm实现理财管理系统设计

    Java项目之java+springboot+ssm实现理财管理系统设计

    这篇文章主要介绍了Java项目java+springboot+ssm实现理财管理系统设计,使用了当前较为流行的spring boot,spring,spring mvc,mybatis,shiro框架分页处理使用了pagehelper进行操作,需要的朋友可以参考一下
    2022-03-03
  • java遍历Map的几种方法分析

    java遍历Map的几种方法分析

    这篇文章主要介绍了java遍历Map的几种方法,结合实例形式分析了使用循环与迭代等方法操作Map遍历的相关技巧,需要的朋友可以参考下
    2016-08-08
  • java邮件发送简单实现代码

    java邮件发送简单实现代码

    这篇文章主要为大家详细介绍了java邮件发送简单实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • SpringBoot Session接口验证实现流程详解

    SpringBoot Session接口验证实现流程详解

    这篇文章主要介绍了SpringBoot+Session实现接口验证(过滤器+拦截器)文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09

最新评论