王炸!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)架构,包含以下组件:
-
MCP Host:集成 AI 模型的应用(如 IDE、聊天界面),负责发起请求。
-
MCP Client:协议客户端,管理 Host 与 Server 的通信(如发送请求、解析响应)。
-
MCP Server:轻量级程序,提供特定功能(如文件读写、数据库查询)。
-
数据源/工具:本地文件、数据库、第三方 API 等
核心三兄弟:
- MCP Client(传话筒):负责把 AI 的请求转发给工具,类似快递小哥。
- MCP Server(工具管家):管理你提供的工具(比如查数据库、读文件)。
- 工具:你现有的功能(比如 SpringBoot 里的订单查询接口)。
白话解释:
想象 MCP 是个"中间人",负责协调 AI 和你的系统工具(可以理解为接口之类)之间的对话:
plaintext
用户问AI:"帮我查昨天的订单"
↓
AI 把问题翻译成 MCP 格式:"调用订单查询工具,时间=昨天"
↓
MCP 中间人找到对应的工具执行
↓
工具返回数据,MCP 翻译成自然语言给用户
---------------------------------------------------------------
用户说话
│
↓
AI 翻译成 MCP 格式
│
↓
SpringBoot 收到请求
│
↓
执行对应的Service方法(比如查订单)
│
↓
返回结果给AI → AI 翻译成人话给用户
三、MCP 能干啥?
- 让AI操作你的系统
- 比如用户对AI说:"把订单123退货",AI自动调用你的退款接口。
- 无缝切换AI模型
- 今天用 ChatGPT,明天换 Claude,系统接口不用改!
- 动态扩展功能
- 新增一个工具(比如短信发送),所有支持的 AI 都能立刻用上。
实际场景:
- 客服机器人自动查订单、退换货
- AI 助手自动写周报(读取你的会议记录和邮件)
- 智能 IDE 自动调接口生成代码
四、传统方式与MCP 服务 对比图:
plaintext
传统接口开发流程:
用户请求→ 前端 → 路由分发 → 控制器 → 服务层 → 数据库操作 → 返回DTO-》前端
MCP服务开发流程:
用户自然语言 → MCP协议转换 → 工具路由 → 领域服务 → 数据库操作 → 自然语言生成

流程步骤说明:
-
用户请求阶段
- 用户向MCP Client发送自然语言指令:"帮我查昨天的订单"
- 📍MCP Client作用:用户交互终端,负责自然语言处理
-
指令翻译阶段
-
AI将指令转换为MCP标准格式:
json{ "action": "order_query", "params": {"time": "yesterday"} }
-
🔄 协议转换发生在MCP Client内部
-
-
请求路由阶段
- MCP Client通过HTTPS将结构化数据发送至MCP Server
- 🌐 MCP Server作用:中央调度器,验证请求并匹配服务端点
-
服务执行阶段
- MCP Server识别需调用"订单查询工具",通过RPC调用MCP Host
- ⚙️ MCP Host作用:微服务执行环境,承载具体业务逻辑实现
-
数据处理阶段
-
订单工具在MCP Host执行SQL查询:
sqlSELECT * FROM orders WHERE order_date = CURRENT_DATE - 1;
-
查询结果经数据清洗后返回JSON格式
-
-
响应返回阶段
- MCP Server接收Host返回的原始数据
- MCP Client将结构化数据转换为自然语言:
"您昨天共有5笔订单,总金额2380元,最新订单是XX商品..."
五、改造 SpringBoot 项目的步骤(保姆级教程)
核心步骤:
- 添加MCP 的依赖包
- 修改配置文件
- 改造现有接口
- 注册到MCP服务器
1、添加依赖
由于目前这些依赖还是预览版本,所以在Maven中央仓库中是找不到的,需要我们额外引入仓库地址。
xml
<!-- 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>
其他仓库配置信息
xml
<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
properties
# 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、改造原服务方法
改造方法有两种:
- 工具配置
- 函数Bean
方法一:工具配置
工具配置方式在需要改造的实现类对需要改造的方法加上@Tool
和@ToolParam
注解分别标记方法和参数
java
@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服务器配置上即可。
java
/**
* MCP服务器配置类,负责注册MCP工具
*/
@Configuration
publicclass McpServerConfig {
/**
* 注册工具回调提供者,将BookQueryService中的@Tool方法暴露为MCP工具
*
* @param bookService 图书服务
* @return 工具回调提供者
*/
@Bean
public ToolCallbackProvider bookToolCallbackProvider(BookService bookService) {
return MethodToolCallbackProvider.builder()
.toolObjects(bookService)
.build();
}
}
在聊天客户端配置引入注册工具
java
/**
* 聊天客户端配置类
*/
@Configuration
publicclass ChatClientConfig {
@Autowired
private ToolCallbackProvider toolCallbackProvider;
/**
* 配置ChatClient,注册系统指令和工具函数
*/
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultSystem("你是一个图书管理助手,可以帮助用户查询图书信息。" +
"你可以根据书名模糊查询、根据作者查询和根据分类查询图书。" +
"回复时,请使用简洁友好的语言,并将图书信息整理为易读的格式。")
// 注册工具方法
.defaultTools(toolCallbackProvider)
.build();
}
}
**方法二:**函数Bean
单独声明一个类将查询方法作为函数Bean导出
java
/**
* 图书查询服务,将查询方法作为函数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聊天客户端的时候需要显式地声明。
java
/**
* 聊天客户端配置类
*/
@Configuration
publicclass ChatClientConfig {
/**
* 配置ChatClient,注册系统指令和工具函数
*/
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultSystem("你是一个图书管理助手,可以帮助用户查询图书信息。" +
"你可以根据书名模糊查询、根据作者查询和根据分类查询图书。" +
"回复时,请使用简洁友好的语言,并将图书信息整理为易读的格式。")
// 注册工具方法,这里使用方法名称来引用Spring上下文中的函数Bean
.defaultTools(
"findBooksByTitle",
"findBooksByAuthor",
"findBooksByCategory"
)
.build();
}
}
4、接口测试
服务开发后,声明一个控制器对外暴露进行调用。
java
@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、测试
通过测试工具进行接口请求

注意事项
- 权限控制:别让AI随便删数据!可以用 Spring Security 限制敏感操作。
- 错误处理:AI 不懂"系统异常",记得把错误信息转成人话(比如"系统忙,稍后再试")。
- 提示词优化 :在
@Tool
的 description 里写清楚功能,AI 才知道什么时候该调用它。
总结
改造 MCP 就像给你的 SpringBoot 项目装了个"AI万能插座":
- 省时:一次开发,所有 AI 都能用
- 灵活:加新功能只需暴露接口,不用改 AI 端
- 智能:让用户用自然语言操作你的系统
赶紧试试,让你的项目秒变 AI 神器吧!
最后文章有啥不对,欢迎大佬在评论区指点!!!
如果感觉对你有帮助就点赞推荐或者关注一下吧!!!
