项目背景
- 准备把现有服务直接对外暴露mcp tools,所以最优方式就是在现有java服务上直接支持,而不是单独再起一个python服务支持mcp
- 当前应用是常规springboot tomcat应用,不是webflux技术栈,所以本文的springai指的是
spring-ai-starter-mcp-server-webmvc - 为了提供mcp server,项目事先已经升级到jdk21/springboot3.5了(可以参考之前的文章)
总结
- 相比python,java的mcp sdk开发进展缓慢很多,bug也更多
- spring ai在当前最新的1.1.0中才支持streamable http协议
- 通过springai暴露sse接口没有实际生产使用的能力,bug太多(已经是业内共识了,根因是开源java mcp jdk bug太多),比如这个致命的连接/线程泄露问题
- sse这个协议就不适合实际工程使用,不明白为啥当初选了这么一个东西,学院派的风格
- 使用streamable http协议可以避免很多问题,有投入实际生产使用的基础了
- 现在的bug主要是服务端主动向客户端推送这个场景带来的(要维持长连接),所以直接使用stateless streamable http能避免很多问题(不保持长连接)
- 现在mcp的鉴权还比较薄弱,官房社区支持的oauth2太重(又是学院派的风格),实际应用中使用api秘钥鉴权的方式比较多,所以最好自定义一个http请求头来做鉴权校验
- 最好改下mcp默认的endpoint,避免被人扫到直接调用
个人感想
- mcp这玩意的工程实现是真的差,我的感受基本和这个文章一样https://www.infoq.cn/article/t6c39f5lzki1hw0mr7dm