王炸!SpringBoot+MCP 讓你的系統秒變AI小助手
王炸!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 和你的系統工具(可以理解為接口之類)之間的對話:
用戶問AI:“幫我查昨天的訂單”
↓
AI 把問題翻譯成 MCP 格式:“調用訂單查詢工具,時間=昨天”
↓
MCP 中間人找到對應的工具執行
↓
工具返回數據,MCP 翻譯成自然語言給用戶
---------------------------------------------------------------
用戶說話
│
↓
AI 翻譯成 MCP 格式
│
↓
SpringBoot 收到請求
│
↓
執行對應的Service方法(比如查訂單)
│
↓
返回結果給AI → AI 翻譯成人話給用戶
三、MCP 能干啥?
- 讓AI操作你的系統
- 比如用戶對AI說:“把訂單123退貨”,AI自動調用你的退款接口。
- 無縫切換AI模型
- 今天用 ChatGPT,明天換 Claude,系統接口不用改!
- 動態擴展功能
- 新增一個工具(比如短信發送),所有支持的 AI 都能立刻用上。
實際場景:
- 客服機器人自動查訂單、退換貨
- AI 助手自動寫周報(讀取你的會議記錄和郵件)
- 智能 IDE 自動調接口生成代碼
四、傳統方式與MCP 服務 對比圖:
傳統接口開發流程:
用戶請求→ 前端 → 路由分發 → 控制器 → 服務層 → 數據庫操作 → 返回DTO-》前端
MCP服務開發流程:
用戶自然語言 → MCP協議轉換 → 工具路由 → 領域服務 → 數據庫操作 → 自然語言生成

流程步驟說明:
-
用戶請求階段
- 用戶向MCP Client發送自然語言指令:"幫我查昨天的訂單"
- ??MCP Client作用:用戶交互終端,負責自然語言處理
-
指令翻譯階段
-
AI將指令轉換為MCP標準格式:
{ "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查詢:
SELECT * FROM orders WHERE order_date = CURRENT_DATE - 1; -
查詢結果經數據清洗后返回JSON格式
-
-
響應返回階段
- 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、改造原服務方法
改造方法有兩種:
- 工具配置
- 函數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、測試
通過測試工具進行接口請求

注意事項
- 權限控制:別讓AI隨便刪數據!可以用 Spring Security 限制敏感操作。
- 錯誤處理:AI 不懂“系統異常”,記得把錯誤信息轉成人話(比如“系統忙,稍后再試”)。
- 提示詞優化:在
@Tool的 description 里寫清楚功能,AI 才知道什么時候該調用它。
總結
改造 MCP 就像給你的 SpringBoot 項目裝了個“AI萬能插座”:
- 省時:一次開發,所有 AI 都能用
- 靈活:加新功能只需暴露接口,不用改 AI 端
- 智能:讓用戶用自然語言操作你的系統
趕緊試試,讓你的項目秒變 AI 神器吧!
最后文章有啥不對,歡迎大佬在評論區指點!!!
如果感覺對你有幫助就點贊推薦或者關注一下吧!!!


浙公網安備 33010602011771號