Spring自定義MCP sse-endpoint配置指南
前言
最近調(diào)研了MCP的相關(guān)內(nèi)容,嘗試自定義MCP server的端點(diǎn),并在MCP client里配置自定義的server 端點(diǎn),發(fā)現(xiàn)官方的文檔缺失了一部分,且無法通過yaml直接自定義。經(jīng)過翻看源碼后,成功修改了配置,以下是一些記錄。
一、MCP server配置自定義sse-endpoint
首先,根據(jù)SpringAI官方文檔,在yaml文件中,spring.ai.mcp.server.sse-endpoint為自定義端點(diǎn)


但是,經(jīng)過驗(yàn)證,只配置該選項(xiàng),啟動(dòng)正常,通過postman調(diào)用新配置的sse-endpoint :“http://localhost:8080/demo/sse”,會(huì)提示404 not found。
通過斷點(diǎn),發(fā)現(xiàn)項(xiàng)目啟動(dòng)時(shí),框架通過McpWebMvcServerAutoConfiguration來進(jìn)行自動(dòng)配置


通過源碼,發(fā)現(xiàn)配置的sse-endpoint,并沒有在配置類里引用,無論配置什么地址,都是使用默認(rèn)的/sse作為端點(diǎn)。
而springboot是可以通過自己編寫配置類,來實(shí)現(xiàn)對(duì)jar包內(nèi)的配置類的補(bǔ)充和覆蓋,所以第一時(shí)間就想到了,自己編寫一個(gè)config,實(shí)現(xiàn)獲取yaml里的配置內(nèi)容,代碼如下
/**
* @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();
}
}重新啟動(dòng),可以通過postman訪問自定義的地址了

二、MCP client配置
在server端配置完成后,client也需要同步配置,不然啟動(dòng)會(huì)提示404,找不到server的地址,但在翻閱文檔后,發(fā)現(xiàn)spring提供的client相關(guān)jar,并沒有配置自定義sse-endpoint的方式??,沒有辦法,又需要自定義相關(guān)配置類了,首先,先在yaml里增加對(duì)應(yīng)key

翻看源碼和斷點(diǎn),找到client端的自動(dòng)配置class

按照server端的經(jīng)驗(yàn),編寫自定義config,此處需要注意,因?yàn)閥aml里并不存在sseEndpoint這個(gè)key,我們需要先自定義一個(gè)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:

編寫完成后啟動(dòng),此時(shí)console報(bào)錯(cuò),提示

詢問模型后,發(fā)現(xiàn)是因?yàn)镾pring Boot 中,同名的 Bean 不能重復(fù)注冊(cè), mcpHttpClientTransports 這個(gè) Bean,在兩個(gè)地方都被定義了: 1個(gè)在官方自動(dòng)配置 SseHttpClientTransportAutoConfiguration, 1個(gè)在自己的配置類 MyMcpSseConfig
通過修改啟動(dòng)類,排除官方自動(dòng)配置的class
@SpringBootApplication(exclude = {SseHttpClientTransportAutoConfiguration.class})
再次啟動(dòng),此時(shí)console沒有報(bào)錯(cuò)了,通過postman調(diào)用client的接口,也可以正常調(diào)用server里編寫的tools
總結(jié)
SpringAI還是一個(gè)比較新的內(nèi)容,很多文檔、代碼,可能都存在一些缺漏,而且網(wǎng)上相關(guān)內(nèi)容也較少,尤其是MCP相關(guān)。此文檔作為一個(gè)調(diào)研的記錄
到此這篇關(guān)于Spring自定義MCP sse-endpoint配置指南的文章就介紹到這了,更多相關(guān)Spring MCP sse-endpoint內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nacos框架服務(wù)注冊(cè)實(shí)現(xiàn)流程
這篇文章主要介紹了SpringCloud服務(wù)注冊(cè)之nacos實(shí)現(xiàn)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
java.lang.NoClassDefFoundError錯(cuò)誤解決辦法
這篇文章主要介紹了java.lang.NoClassDefFoundError錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-06-06
深入探究SpringBoot可以同時(shí)處理多少請(qǐng)求
SpringBoot是一款非常流行的Java后端框架,它可以幫助開發(fā)人員快速構(gòu)建高效的Web應(yīng)用程序,但是,許多人對(duì)于SpringBoot能夠同時(shí)處理多少請(qǐng)求的疑問仍然存在,在本篇文章中,我們將深入探討這個(gè)問題,需要的朋友可以參考下2023-07-07
Spring?Boot中Controller層規(guī)劃與最佳實(shí)踐建議
本文將系統(tǒng)性地介紹如何規(guī)劃編寫高質(zhì)量的Controller層代碼,涵蓋RESTful設(shè)計(jì)、參數(shù)處理、異常處理、日志記錄、安全控制等關(guān)鍵方面,并提供可落地的代碼示例和架構(gòu)建議,感興趣的朋友一起看看吧2025-06-06
SpringBoot+Vue3整合SSE實(shí)現(xiàn)實(shí)時(shí)消息推送功能
在日常開發(fā)中,我們經(jīng)常需要實(shí)現(xiàn)實(shí)時(shí)消息推送的功能,這篇文章將基于SpringBoot和Vue3來簡(jiǎn)單實(shí)現(xiàn)一個(gè)入門級(jí)的例子,下面小編就和大家詳細(xì)介紹一下2025-11-11
IDEA 集成 Docker 插件一鍵部署 SpringBoot 應(yīng)用
通過本文介紹的方法,我們期望能幫助開發(fā)者更輕松地在IDEA中實(shí)現(xiàn)Spring Boot應(yīng)用的Docker化部署,為現(xiàn)代軟件開發(fā)提供更便捷的解決方案,感興趣的朋友一起看看吧2023-11-11
Java ArrayList如何實(shí)現(xiàn)生成不重復(fù)隨機(jī)數(shù)
這篇文章主要介紹了Java ArrayList如何實(shí)現(xiàn)生成不重復(fù)隨機(jī)數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

