Spring AI MCP Server的SSE端点打不开?3个解决方案,最快换1行依赖搞定
【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai
摘要:用Spring AI的MCP Server以SSE方式暴露服务时,应用启动一切正常,浏览器或Postman访问/sse却连个回音都没有——这是MCP Server配置里最迷惑人的坑之一。本文按社区验证过的经验,给出复现方式、三条自查项、webmvc与webflux两套完整配置,帮你在10分钟内定位问题。
先说结论:换掉一行依赖,多数情况就通了
我踩到这个坑的时候,服务日志干净得像没发生任何事,唯独/sse端点"进不去"。多人验证下来的发现是:大多数情况下,问题出在"编程模型"和"版本"两个地方,而不是端点路径或工具本身。
三个解法一句话版:
- 嫌麻烦 → 换用webmvc依赖,最省事(推荐首选)
- 想留在webflux → 补上reactive配置,让应用跑在响应式容器里
- 想一步到位 → 直接抄第5节的完整配置
下面按"先复现 → 再自查 → 最后抄配置"的顺序展开。
复现步骤:启动一切正常,端点却石沉大海
复现这个现象不需要特殊条件,按社区讨论里最常见的搭法就行:
- 引入MCP Server的SSE相关starter
- 服务正常启动,日志无任何异常
- 用浏览器或Postman访问
localhost:8080/sse
现象对比如下:
| 对比项 | SSE(HTTP/SSE传输) | stdio(标准输入输出传输) |
|---|---|---|
| 服务启动 | 正常 | 正常 |
| 端点访问 | 无任何响应,也没有报错 | 本地进程直连,正常工作 |
| 日志输出 | 干净,查不到异常 | 正常 |
| 迷惑程度 | 高(像是"服务没起来") | 低 |
这里插一句官方架构视角,SSE传输走的是Web Container里的SSE Server Transports,而stdio走的是StdioServerTransport,两条路完全独立——这也解释了为什么stdio正常时容易让人误判"SSE也没坏,只是网络问题":
排查清单:3条自查项,按顺序过一遍
把排查当成"由外到内"剥洋葱,从最容易错的配置层往下走。
1. 版本混用自查:M6和M7能不能共存?
不能。社区里有人同时引入了两组starter,一组是spring-ai-mcp-server-webmvc-spring-boot-starter的1.0.0-M6,另一组是spring-ai-starter-mcp-server-webmvc的1.0.0-M7。两个里程碑版本的自动配置类互相打架,装配出的端点行为就不受控制了。
自查方法:搜一遍pom里的spring-ai依赖,确认同一条MCP链路上的坐标版本完全一致。推理过程很简单:MCP Server端点能注册成功与否,取决于自动配置类有没有被正确加载,而版本混用恰恰是自动配置"半加载"的典型诱因。
2. 编程模型不匹配自查:你的Boot应用是响应式还是非响应式的?
SSE在webflux依赖下跑在响应式栈(Project Reactor + Netty)上,"响应式编程模型"说白了就是:整个应用以非阻塞方式处理请求,和传统的"一个请求一个线程"不是一回事。
而默认的新建Spring Boot应用是非响应式的——如果只引了webflux的MCP依赖,没有让整个应用切到reactive模式,端点就会"注册了但没人接"。自查方法:确认依赖里webflux相关坐标是否齐全,以及启动时实际生效的Web服务器是不是ReactiveWebServerFactory。
3. 配置缺失自查:响应式开关有没有打开?
上面两条都排除后,检查配置里有没有显式声明应用类型。reactive这一行是webflux路线的"总开关",漏掉它,症状就是本次要解决的"能启动、访问不了、无报错"。
方案决策:三个方案怎么选?
| 维度 | 方案A:换用webmvc | 方案B:webflux补reactive配置 | 方案C:完整webflux示例 |
|---|---|---|---|
| 改动量 | 仅1个依赖坐标 | 1个依赖 + 1行yaml | yaml + pom整套 |
| 适用场景 | 普通非响应式Boot项目(多数人的情况) | 已经在响应式栈上的项目 | 新项目或想一次性对齐完整配置 |
| 难度 | 低 | 低 | 中 |
| 潜在代价 | Spring Boot Gateway转发可能受影响 | OpenFeign客户端在当前版本下可能不兼容 | 需自行核对各字段与版本匹配 |
| 社区验证度 | 高 | 中 | 中 |
推荐:先试方案A。当前版本下社区反馈最多的有效路径就是webmvc;确实要响应式再走B/C。
可直接抄:三份配置各管一件事
以下代码块基于社区验证版本整理,依赖坐标与配置项属于事实信息,可直接复用;版本号请按自己项目实际替换。
方案A场景用这份:只动一行依赖,其余不动。
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId> </dependency>方案B场景用这份:webflux依赖保持不变,yaml里把应用类型切到reactive。
spring: main: web-application-type: reactive方案C场景用这份:yaml与pom的完整组合,含BOM统一版本管理,避免第3节自查项1的混用问题。
spring.ai.mcp.server.enabled=true spring.ai.mcp.server.stdio=false spring.ai.mcp.server.name=webflux-mcp-server spring.ai.mcp.server.version=1.0.0 spring.ai.mcp.server.type=ASYNC spring.ai.mcp.server.instructions=This reactive server provides weather information tools and resources spring.ai.mcp.server.sse-message-endpoint=/mcp/messages spring.ai.mcp.server.sse-endpoint=/sse spring.ai.mcp.server.capabilities.tool=true spring.ai.mcp.server.capabilities.resource=true spring.ai.mcp.server.capabilities.prompt=true spring.ai.mcp.server.capabilities.completion=true<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>1.1.0-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-server-webflux</artifactId> </dependency> </dependencies>避坑速查:动配置前对照一遍checklist
- 版本一致性:pom里所有spring-ai相关依赖同一版本号,禁止M6/M7混引
- 依赖互斥:webmvc与webflux的MCP Server starter二选一,不同时引入
- Feign兼容性:走webflux + reactive路线时,OpenFeign客户端在当前版本下可能不工作,先用社区验证过的结论做风险预估
- Gateway兼容性:走webmvc路线时,留意Spring Cloud Gateway转发链路是否受影响
- 配置对齐:换方案后重启,确认/sse首次访问能建立长连接、日志出现连接建立记录
配置项含义有疑惑时,可参考仓库内官方文档目录:MCP Server Boot Starter文档、SSE Server文档。
一句话收尾
默认先选webmvc,响应式栈项目再切reactive路线,SSE端点问题基本都能收住。随着框架持续迭代,SSE传输方式本身在逐步让位于Streamable HTTP,新项目可留意官方文档的协议推荐,避免在即将演进的传输方式上投入过多定制。
【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考