王炸!SpringBoot+MCP 让你的系统秒变AI小助手

感觉本篇对你有帮助可以关注一下我的微信公众号(深入浅出谈java),会不定期更新知识和面试资料、技巧!!!

一、MCP 是什么?

MCP(Model Context Protocol) 官网:Introduction - Model Context Protocol

解释:Model Context Protocol(MCP)是由 Anthropic 推出的开放协议,旨在标准化大型语言模型(LLM)与外部数据源、工具的交互方式。它类似于“AI 领域的 USB-C 接口”,通过统一的通信规范(如 JSON-RPC 2.0)实现跨模型、跨工具的兼容性。

白话解释:MCP就像 AI 和工具之间的“翻译官”,它制定了一套标准对话规则,让不同 AI 模型(比如 ChatGPT、Claude)都能用同样的方式和你的系统“聊天”。比如以前每个 AI 都要学不同的方言才能操作你的数据库,现在它们只要会说 MCP 这个“普通话”就行!

举个栗子:。

你做了一个文件管理系统,用 MCP 改造后,不管是 ChatGPT 还是 Claude,都能用同一套指令帮你查文件、删文件,不用为每个 AI 单独开发接口。

二、MCP 的核心原理(一张图看懂)


解释:MCP 采用客户端-服务器(C/S)架构,包含以下组件:

  1. MCP Host:集成 AI 模型的应用(如 IDE、聊天界面),负责发起请求。

  2. MCP Client:协议客户端,管理 Host 与 Server 的通信(如发送请求、解析响应)。

  3. MCP Server:轻量级程序,提供特定功能(如文件读写、数据库查询)。

  4. 数据源/工具:本地文件、数据库、第三方 API 等

核心三兄弟

  1. MCP Client(传话筒):负责把 AI 的请求转发给工具,类似快递小哥。
  2. MCP Server(工具管家):管理你提供的工具(比如查数据库、读文件)。
  3. 工具:你现有的功能(比如 SpringBoot 里的订单查询接口)。

白话解释:

想象 MCP 是个“中间人”,负责协调 AI 和你的系统工具(可以理解为接口之类)之间的对话:

用户问AI:“帮我查昨天的订单”

AI 把问题翻译成 MCP 格式:“调用订单查询工具,时间=昨天”

MCP 中间人找到对应的工具执行

工具返回数据,MCP 翻译成自然语言给用户 --------------------------------------------------------------- 用户说话


AI 翻译成 MCP 格式


SpringBoot 收到请求


执行对应的Service方法(比如查订单)


返回结果给AI → AI 翻译成人话给用户

三、MCP 能干啥?


  1. 让AI操作你的系统

    • 比如用户对AI说:“把订单123退货”,AI自动调用你的退款接口。
  2. 无缝切换AI模型
    • 今天用 ChatGPT,明天换 Claude,系统接口不用改!
  3. 动态扩展功能
    • 新增一个工具(比如短信发送),所有支持的 AI 都能立刻用上。

实际场景

  • 客服机器人自动查订单、退换货
  • AI 助手自动写周报(读取你的会议记录和邮件)
  • 智能 IDE 自动调接口生成代码

四、传统方式与MCP 服务 对比图:

传统接口开发流程:
用户请求→ 前端 → 路由分发 → 控制器 → 服务层 → 数据库操作 → 返回DTO-》前端 MCP服务开发流程:
用户自然语言 → MCP协议转换 → 工具路由 → 领域服务 → 数据库操作 → 自然语言生成

流程步骤说明:

  1. 用户请求阶段

    • 用户向MCP Client发送自然语言指令:"帮我查昨天的订单"
    • MCP Client作用:用户交互终端,负责自然语言处理
  2. 指令翻译阶段

    • AI将指令转换为MCP标准格式:

      {
      "action": "order_query",
      "params": {"time": "yesterday"}
      }
    • 协议转换发生在MCP Client内部

  3. 请求路由阶段

    • MCP Client通过HTTPS将结构化数据发送至MCP Server
    • MCP Server作用:中央调度器,验证请求并匹配服务端点
  4. 服务执行阶段

    • MCP Server识别需调用"订单查询工具",通过RPC调用MCP Host
    • ⚙️ MCP Host作用:微服务执行环境,承载具体业务逻辑实现
  5. 数据处理阶段

    • 订单工具在MCP Host执行SQL查询:

      SELECT * FROM orders
      WHERE order_date = CURRENT_DATE - 1;
    • 查询结果经数据清洗后返回JSON格式

  6. 响应返回阶段

    • MCP Server接收Host返回的原始数据
    • MCP Client将结构化数据转换为自然语言:

      "您昨天共有5笔订单,总金额2380元,最新订单是XX商品..."

五、改造 SpringBoot 项目的步骤(保姆级教程)

核心步骤:

  • 添加MCP 的依赖包
  • 修改配置文件
  • 改造现有接口
  • 注册到MCP服务器

1、添加依赖


由于目前这些依赖还是预览版本,所以在Maven中央仓库中是找不到的,需要我们额外引入仓库地址。

  <!-- Spring AI 核心依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-core</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <!-- Anthropic 模型支持 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-anthropic-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <!-- MCP 服务器支持 - WebMVC版本 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>

其他仓库配置信息

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <releases>
            <enabled>false</enabled>
        </releases>
    </repository>
    <repository>
        <name>Central Portal Snapshots</name>
        <id>central-portal-snapshots</id>
        <url>https://central.sonatype.com/repository/maven-snapshots/</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

2、项目配置


我们的目的是将一个Spring服务改造成MCP服务,所以这里不需要进行客户端的配置,同理,在引入依赖的时候也不用引入客户端的依赖。

Anthropic 旗下强大的 Claude 大语言模型 key 需要在官网申请 官网地址:https://console.anthropic.com

# Spring AI api-key
spring.ai.anthropic.api-key=这里换成你的api-key # MCP服务端开启
spring.ai.mcp.server.enabled=true # MCP服务端配置
spring.ai.mcp.server.name=book-management-server
spring.ai.mcp.server.version=1.0.0
spring.ai.mcp.server.type=SYNC
spring.ai.mcp.server.sse-message-endpoint=/mcp/message

3、改造原服务方法


改造方法有两种:

  1. 工具配置
  2. 函数Bean

方法一:工具配置

工具配置方式在需要改造的实现类对需要改造的方法加上@Tool@ToolParam注解分别标记方法和参数

@Service
@RequiredArgsConstructor
publicclass BookServiceImpl  implements BookService { @Resource
private BookRepository bookRepository; @Override
@Tool(name = "findBooksByTitle", description = "根据书名模糊查询图书,支持部分标题匹配")
public List<Book> findBooksByTitle(@ToolParam(description = "书名关键词") String title) {
    return bookRepository.findByTitleContaining(title);
  } @Override
@Tool(name = "findBooksByAuthor", description = "根据作者精确查询图书")
public List<Book> findBooksByAuthor(@ToolParam(description = "作者姓名") String author) {
    return bookRepository.findByAuthor(author);
  } @Override
@Tool(name = "findBooksByCategory", description = "根据图书分类精确查询图书")
public List<Book> findBooksByCategory(@ToolParam(description = "图书分类")String category) {
    return bookRepository.findByCategory(category);
  }
}

接着将这个 BookServiceImpl 实现类注册到MCP服务器配置上即可。

/**
 * MCP服务器配置类,负责注册MCP工具
 */
@Configuration
publicclass McpServerConfig { /**
   * 注册工具回调提供者,将BookQueryService中的@Tool方法暴露为MCP工具
   *
   * @param bookService 图书服务
   * @return 工具回调提供者
   */
@Bean
public ToolCallbackProvider bookToolCallbackProvider(BookService bookService) {
    return MethodToolCallbackProvider.builder()
            .toolObjects(bookService)
            .build();
  } }

聊天客户端配置引入注册工具

/**
 * 聊天客户端配置类
 */
@Configuration
publicclass ChatClientConfig { @Autowired
private ToolCallbackProvider toolCallbackProvider; /**
   * 配置ChatClient,注册系统指令和工具函数
   */
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
    return builder
            .defaultSystem("你是一个图书管理助手,可以帮助用户查询图书信息。" +
                    "你可以根据书名模糊查询、根据作者查询和根据分类查询图书。" +
                    "回复时,请使用简洁友好的语言,并将图书信息整理为易读的格式。")
            // 注册工具方法
            .defaultTools(toolCallbackProvider)
            .build();
  }
}

方法二:函数Bean


单独声明一个类将查询方法作为函数Bean导出

/**
 * 图书查询服务,将查询方法作为函数Bean导出
 */
@Service
publicclass BookQueryService { @Resource
private BookService bookService; /**
   * 根据书名查询图书的函数Bean
   */
@Bean
public Function<String, List<Book>> findBooksByTitle() {
    return title -> bookService.findBooksByTitle(title);
  } /**
   * 根据作者查询图书的函数Bean
   */
@Bean
public Function<String, List<Book>> findBooksByAuthor() {
    return author -> bookService.findBooksByAuthor(author);
  } /**
   * 根据分类查询图书的函数Bean
   */
@Bean
public Function<String, List<Book>> findBooksByCategory() {
    return category -> bookService.findBooksByCategory(category);
  } }

这种方式在定义AI聊天客户端的时候需要显式地声明。

/**
 * 聊天客户端配置类
 */
@Configuration
publicclass ChatClientConfig { /**
   * 配置ChatClient,注册系统指令和工具函数
   */
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
    return builder
            .defaultSystem("你是一个图书管理助手,可以帮助用户查询图书信息。" +
                    "你可以根据书名模糊查询、根据作者查询和根据分类查询图书。" +
                    "回复时,请使用简洁友好的语言,并将图书信息整理为易读的格式。")
            // 注册工具方法,这里使用方法名称来引用Spring上下文中的函数Bean
            .defaultTools(
                    "findBooksByTitle",
                    "findBooksByAuthor",
                    "findBooksByCategory"
            )
            .build();
  }
}

4、接口测试


服务开发后,声明一个控制器对外暴露进行调用。

@Resource
private ChatClient chatClient; /**
   * 处理聊天请求,使用AI和MCP工具进行响应
   *
   * @param request 聊天请求
   * @return 包含AI回复的响应
   */
@PostMapping
public ResponseEntity<ChatResponse> chat(@RequestBody ChatRequest request) {
    try {
      // 创建用户消息
      String userMessage = request.getMessage();       // 使用流式API调用聊天
      String content = chatClient.prompt()
              .user(userMessage)
              .call()
              .content();       return ResponseEntity.ok(new ChatResponse(content));
    } catch (Exception e) {
      e.printStackTrace();
      return ResponseEntity.ok(new ChatResponse("处理请求时出错: " + e.getMessage()));
    }
  } }

5、测试


通过测试工具进行接口请求

注意事项

  1. 权限控制:别让AI随便删数据!可以用 Spring Security 限制敏感操作。
  2. 错误处理:AI 不懂“系统异常”,记得把错误信息转成人话(比如“系统忙,稍后再试”)。
  3. 提示词优化:在 @Tool 的 description 里写清楚功能,AI 才知道什么时候该调用它。

总结

改造 MCP 就像给你的 SpringBoot 项目装了个“AI万能插座”:

  • 省时:一次开发,所有 AI 都能用
  • 灵活:加新功能只需暴露接口,不用改 AI 端
  • 智能:让用户用自然语言操作你的系统

赶紧试试,让你的项目秒变 AI 神器吧!

最后文章有啥不对,欢迎大佬在评论区指点!!!

如果感觉对你有帮助就点赞推荐或者关注一下吧!!!

王炸!SpringBoot+MCP 让你的系统秒变AI小助手的更多相关文章

  1. 基于nginx+xxl-job+springboot高可用分布式任务调度系统

    技术.原理讲解: <分布式任务调度平台XXL-JOB--源码解析一:项目介绍> <分布式任务调度平台XXL-JOB--源码解析二:基于docker搭建admin调度中心和execut ...

  2. Jeewx-Boot 1.1 版本发布,基于SpringBoot的开源微信管家系统

    项目介绍 JeewxBoot是一款基于SpringBoot的开源微信管家系统,采用SpringBoot2.1.3 + Mybatis + Velocity 框架技术.支持微信公众号.微信第三方平台(扫 ...

  3. 黄聪:win7 64位系统PS、AI、PSD缩略图预览补丁

    MysticThumbs支持Windows 7 / Vista / XP,32位和64位.除了预览PSD以外,还支持DDS.SGI缩略图显示. Mystic Thumbs是一款用来支持win7 64位 ...

  4. 物联网 软硬件系统 树莓派 单片机 esp32 小程序 网页 开发 欢迎相互交流学习~

    物联网软硬件开发 知识分享 多年学生项目开发经验 物联网 软硬件系统 树莓派 单片机 esp32 小程序 网页 开发 欢迎相互交流学习~ http://39.105.218.125:9000/

  5. SpringBoot实现电子文件签字+合同系统

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  6. SpringBoot+MongoDB实现物流订单系统

    码字不易,点赞收藏,养成习惯!原创作者公众号:bigsai.更多精彩期待与您分享!项目收录在github的MongoDB案例中,文章收录在回车课堂中如果没基础请看看前两篇(墙裂推荐)MongoDB从立 ...

  7. SpringBoot + SpringSecurity + Quartz + Layui实现系统权限控制和定时任务

    1. 简介   Spring Security是一个功能强大且易于扩展的安全框架,主要用于为Java程序提供用户认证(Authentication)和用户授权(Authorization)功能.    ...

  8. springboot项目配置logback日志系统

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: < ...

  9. springboot+ELK+logback日志分析系统demo

    之前写的有点乱,这篇整理了一下搭建了一个简单的ELK日志系统 借鉴此博客完成:https://blog.csdn.net/qq_22211217/article/details/80764568 设置 ...

  10. 使用winsw将springboot打包的jar注册系统本地服务

    1.下载winsw 下载地址:https://github.com/kohsuke/winsw/releases 我这里下载的是2.3.0版. 下载sample-minimal.xml和WinSW.N ...

随机推荐

  1. KUKA库卡机器人KR120维修故障参考方案

    随着智能制造的飞速发展,KUKA库卡机器人KR120以其稳定的特点,在自动化生产线上扮演着举足轻重的角色.然而,任何机械设备在长期运行过程中都难免会遇到故障.本文将针对KUKA库卡机器人KR120维修 ...

  2. SpringBoot整合富文本编辑器(UEditor)

    UEditro是一款比较好用的富文本编辑器,所谓的富文本编辑器就是和服务器交互的数据不是普通的字符串文件,而是一些内容包含比较广的字符串,一般是指的html页面,目前比较好用的是百度的UEditor, ...

  3. 【博客搭建】Latex数学书写笔记

    [博客搭建]Latex 数学书写笔记 Latex 是一种文档书写语言,支持大量的特殊字符,包括书写数学公式,并且很多 Markdown 环境都支持该语言. 布局实现 靠左:使用内联数学块$...$. ...

  4. 大量小文件不适合存储于HDFS的原因

    1.小文件过多,会过多占用namenode的内存,并浪费block. - 文件的元数据(包括文件被分成了哪些blocks,每个block存储在哪些服务器的哪个block块上),都是存储在namenod ...

  5. 算子var_threshold

    算子var_threshold 名称 var_threshold - 通过局部均值和标准差分析对图像进行阈值处理. 签名 var_threshold(Image : Region : MaskWidt ...

  6. Linux重启php-fpm

    前言 PHP-FPM 是一款简单好用的 PHP FastCGI 进程管理工具. 它可以和 Apache.Nginx 或其他服务器一起构建完整的 PHP 环境. 接下来我们看看在更改了 php.ini ...

  7. 探秘Transformer系列之(15)--- 采样和输出

    探秘Transformer系列之(15)--- 采样和输出 目录 探秘Transformer系列之(15)--- 采样和输出 0x00 概述 0x01 Generator 1.1 Linear 1.2 ...

  8. 关于IPMP

    国际项目经理资质认证(International Project Manager Professional,简称IPMP)是国际项目管理协会(International Project Managem ...

  9. 使用 PHP cURL 实现 HTTP 请求类

    类结构 创建一个 HttpRequest 类,其中包括初始化 cURL 的方法.不同类型的 HTTP 请求方法,以及一些用于处理响应头和解析响应内容的辅助方法. 初始化 cURL 首先,创建一个私有方 ...

  10. Cannot attach the file *.mdf as database

    使用ASP.NET MVC 4 和 Entity Framwork 6(Code First)爬的一个坑,无意间把App_Data下的*.mdf文件删除了,然后程序编译正常,但是运行异常RT,留爪. ...