JAVAer 狂喜!10 分钟用 Spring AI 搭专属 MCP Server,手把手教程来了

大家好,我是小肥肠,专注 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文章出来以后会放出来。

  1. 新建父类工程xfc-mcp,新增子模块xfc-mcp-server,在父类pom文件中新建依赖管理。
xml 复制代码
<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>
  1. 在子类模块(后称作xfc-mcp-server模块)中新增具体依赖项
xml 复制代码
<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>
  1. 在xfc-mcp-server模块中新增spplication.properties文件:
ini 复制代码
spring.application.name=mcp
spring.main.banner-mode=off
logging.pattern.console=
  1. 在xfc-mcp-server模块中编写天气查询服务,由于我本期教程只是打个样,就做了一个虚拟的天气查询服务,目的只是带领大家把流程走通。
java 复制代码
@Service
public 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 的整数值作为温度返回

  1. 在xfc-mcp-server模块中编写启动类。
java 复制代码
@SpringBootApplication
public 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。

  1. 打包xfc-mcp-server,找到侧边工具栏Maven选项,依次运行cleanpackage命令。
  1. 将打包好的jar包挪出来,我把jar包放到了E盘根目录,填写MCP Server配置文件后保存,下图中我的天气查询MCP Server就配置好了。

配置代码为:

json 复制代码
"weather-service": {
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "java",
      "args": [
        "-jar",
        "E:/xfc-mcp-server-1.0-SNAPSHOT.jar"
      ]
    }
  1. 在聊天框中输入"昆明今天多少度",就能查看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%都是环境的坑,请大家务必严格按照我教程中的配置来搭建。虽然这次只是用虚拟天气查询打了个样,但只要吃透了这里面的逻辑,之后遇到其他需求也能轻松上手。

如果这篇保姆级教程对你有帮助,欢迎点个赞/收藏/转发------你的支持是我熬夜肝干货的最大动力!

相关推荐
资讯分享周几秒前
扣子空间PPT生产力升级:AI智能生成与多模态创作新时代
人工智能·powerpoint
DCTANT25 分钟前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.34 分钟前
SpringBoot -- 自动配置原理
java·spring boot·后端
叶子爱分享1 小时前
计算机视觉与图像处理的关系
图像处理·人工智能·计算机视觉
鱼摆摆拜拜1 小时前
第 3 章:神经网络如何学习
人工智能·神经网络·学习
一只鹿鹿鹿1 小时前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程
张较瘦_1 小时前
[论文阅读] 人工智能 | 深度学习系统崩溃恢复新方案:DaiFu框架的原位修复技术
论文阅读·人工智能·深度学习
cver1231 小时前
野生动物检测数据集介绍-5,138张图片 野生动物保护监测 智能狩猎相机系统 生态研究与调查
人工智能·pytorch·深度学习·目标检测·计算机视觉·目标跟踪
学技术的大胜嗷2 小时前
离线迁移 Conda 环境到 Windows 服务器:用 conda-pack 摆脱硬路径限制
人工智能·深度学习·yolo·目标检测·机器学习
还有糕手2 小时前
西南交通大学【机器学习实验10】
人工智能·机器学习