大家好,我是小肥肠,专注 AI 干货知识分享,今天将给大家分享的是Spring AI搭建 MCP Server教程,让你10分钟搭建一个自己的专属MCP Server,本期教程干货满满,一次看不完可以点击收藏做个记号下次看。如果你正在学习AI相关知识,欢迎关注小肥肠领取免费学习资料哦~
1. 写在开头
最近在捣鼓 AI 开发时发现市面上的 MCP Server 虽然种类挺多,但落到具体细分小众业务场景里面就需要自己亲手开发。作为一个拥有9年研发经验的JAVAer看到 Spring AI 把 MCP 集成玩得风生水起后也决定下场实操一番。
我搭建过程也是蜿蜒曲折,折腾好几天总算是搭起来了,先是换JAVA版本,我之前一直美滋滋的用JAVA8,这次也是被强行升级到JAVA17,还有 Maven 版本的更和 IDE 的更新,总之这次算是我的开发工具全面升级了。装备换完,开发 MCP Server再基于Client调用也就10分钟的事情,如果你对本期教程感兴趣就继续往下看,正文开始咯~
2. MCP Server 的传输模式
MCP Server 的传输模式各有千秋,其中 stdio、sse 和 Streamable HTTP 较为常用。Streamable HTTP 适合复杂网络交互,而 stdio 和 sse 应用更为高频,他俩一个主打本地交互的便捷,一个专注实时数据推送,这也是本文要重点讲解的内容,下面就来深入了解它们的原理与适用场景。
2.1. 标准输入输出(stdio)模式
stdio 模式主打一个本地交互的便捷。它利用操作系统自带的标准输入(stdin)和标准输出(stdout)流在进程间传递数据。MCP 客户端像启动一个小弟进程那样启动 MCP 服务器,然后通过标准输入流把消息传给服务器,服务器处理完再通过标准输出流把响应发回来。数据呢,是以 JSON格式序列化,一行一个完整的 JSON 对象,就像排队报数一样,采用 JSON Lines/JSONL 格式通信。
这种模式简单高效很适合在本地开发测试,或者对同时处理很多请求要求不高的场景。但它也有短板,它的模式为同步阻塞模型,即得等前一条消息传完才能处理下一条,遇到大量并发请求或者复杂交互场景,就有点力不从心了。
2.2. 服务器发送事件(SSE)模式
sse 模式则专注于实时数据推送。它是基于HTTP/1.1的长连接技术,实现服务器向客户端的单向实时通信。客户端通过 HTTP POST 端点发送请求,服务器就通过 SSE 长连接主动给客户端 投喂 数据。服务器推送的数据都按 SSE 格式,每个事件都带着 data: 这个前缀标识。像实时通知、股票行情更新这些场景,大量客户端连接但只需要服务器推送数据 ,sse 模式就派上用场了 。
sse是异步事件驱动模型,支持实时或接近实时的交互,在 分布式 系统或者高并发场景里表现不错,不过它也有局限,只支持服务器向客户端的单向通信,而且断线了不能自动重连或者恢复会话。
3. MCP Server搭建实战
由于篇幅限制,这篇文章先教大家搭建stido模式,下篇将会献上sse传输模式搭建,感兴趣的可以点点关注,防止我更新以后你找不到我。
3.1. 配置要求
基于Spring ai构建MCP Server需要保障你的开发工具满足以下条件:
环境要求 | 版本要求 | 推荐版本 | 说明 |
---|---|---|---|
JDK | 17+ | JDK 17.0.12 | 必须使用Java 17或更高版本,推荐使用最新的LTS版本 |
Maven | 3.6.x | Maven 3.9.6 | 构建工具版本要求,推荐使用最新的3.x稳定版 |
Spring Boot | 3.x | Spring Boot 3.2.3 | 框架版本要求,需要使用3.x系列版本 |
IDE | - | IntelliJ IDEA 2024 | 版本越新越好 |
3.2. 基于stdio模式访问天气查询MCP Server
3.2.1. 基于Spring AI编写天气查询MCP Server
基于stdio模式访问MCP Server搭建较为简单,因为我想写系列流程,我就用模块的方式来搭建,源码等SSE文章出来以后会放出来。
- 新建父类工程xfc-mcp,新增子模块xfc-mcp-server,在父类pom文件中新建依赖管理。
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-boot.version>3.2.0</spring-boot.version> <spring-ai.version>1.0.0-M6</spring-ai.version></properties><dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-bom</artifactId> <version>${spring-ai.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>
- 在子类模块(后称作xfc-mcp-server模块)中新增具体依赖项
<dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-core</artifactId> </dependency> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency></dependencies>
- 在xfc-mcp-server模块中新增spplication.properties文件:
spring.application.name=mcpspring.main.banner-mode=offlogging.pattern.console=
4. 在xfc-mcp-server模块中编写天气查询服务,由于我本期教程只是打个样,就做了一个虚拟的天气查询服务,目的只是带领大家把流程走通。
@Servicepublic class WeatherService { @Tool(description = "通过城市名字获取温度") public String getWeather(@ToolParam(description = "城市名称") String cityName) { return cityName + "今天的温度是" + (new java.util.Random().nextInt(9) + 1) * 10; }}
上述代码通过 @Service
注解声明为 Spring Bean。提供了一个工具方法 getWeather
,该方法接收城市名参数,通过随机数生成 10-90 的整数值作为温度返回
- 在xfc-mcp-server模块中编写启动类。
@SpringBootApplicationpublic class McpServerApplication { public static void main(String[] args) { SpringApplication.run(McpServerApplication.class, args); } @Bean public ToolCallbackProvider toolCallbackProvider(WeatherService weatherService) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService) .build(); }}
3.2.2. 基于Cline调用天气查询MCP Server
在上期教程Manus平替方案:用DeepSeek+MCP Server构建AI自主工作流,我讲了怎么安装Cline和集成MCP Server,这里不再赘述流程,直接将怎么集成我们开发好的MCP Server。
- 打包xfc-mcp-server,找到侧边工具栏Maven选项,依次运行clean、package命令。
- 将打包好的jar包挪出来,我把jar包放到了E盘根目录,填写MCP Server配置文件后保存,下图中我的天气查询MCP Server就配置好了。
配置代码为:
"weather-service": { "disabled": false, "timeout": 60, "type": "stdio", "command": "java", "args": [ "-jar", "E:/xfc-mcp-server-1.0-SNAPSHOT.jar" ] }
3. 在聊天框中输入"昆明今天多少度",就能查看MCP Server调用结果。
在上述代码中类中定义了一个 Bean 方法 toolCallbackProvider
,它将 WeatherService
实例注册到 MethodToolCallbackProvider
中,用于构建工具回调提供者,使 WeatherService
中的工具方法(如 getWeather
)能被外部系统(如 AI 助手)发现和调用,实现工具方法的自动注册和回调功能。
4. 资料领取
觉得大模型不好用,可能是你不会写提示词,小肥肠为你准备了海量提示词模板、DeepSeek相关教程以及Coze基础教程,只需关注gzh后端小肥肠,点击底部【资源】菜单即可领取。
如果你也对 AI 领域体感兴趣,想学习Coze、Dify 智能体 、 MCP 、Spring AI开发相关内容,欢迎找我哦~
5. 结语
到这儿,stdio 模式下用 Spring AI 搭建 MCP Server 就算讲完了。整体不难,但是里面的坑很多,80%都是环境的坑,请大家务必严格按照我教程中的配置来搭建。虽然这次只是用虚拟天气查询打了个样,但只要吃透了这里面的逻辑,之后遇到其他需求也能轻松上手。
如果这篇保姆级教程对你有帮助,欢迎点个赞/收藏/转发——你的支持是我熬夜肝干货的最大动力!