Spring AI 框架中集成 MCP的方法
SpringAI MCP介紹
Spring AI MCP 為模型上下文協(xié)議提供 Java 和Spring 框架集成、它使 SpringAI 應(yīng)用程序能夠通過標(biāo)準(zhǔn)化的接口與不同的數(shù)據(jù)源和工是進(jìn)行交互,支持同步和異步通信模式。整體架構(gòu)如下:

Spring Al 通過以下 Spring Boot 啟動(dòng)器提供 MCP 集成:
客戶端啟動(dòng)器
- spring-ai-starter-mcp-client 核心啟動(dòng)器提供 STDIO 和基于 HTTP 的 SSE 支持。
- spring-ai-starter-mcp-client-webflux 基于WebFlux的SSE流式傳輸實(shí)現(xiàn)
服務(wù)端啟動(dòng)器
- spring-ai-starter-mcp-server 核心服務(wù)器具有 STDIO 傳輸支持
- spring-ai-starter-mcp-server-webmvc 基于Spring MVC的SSE流式傳輸實(shí)現(xiàn)
- spring-ai-starter-mcp-server-webflux 基于WebFlux的SSE流式傳輸實(shí)現(xiàn)
基于stdio標(biāo)準(zhǔn)流
MCP 服務(wù)端
基于 stdio 的實(shí)現(xiàn)是最常見的 MCP客戶端方案,它通過標(biāo)準(zhǔn)輸入輸出流與 MCP 服務(wù)器進(jìn)行通信,這種方式簡單直觀,能夠直接通過進(jìn)程間通信實(shí)現(xiàn)數(shù)據(jù)交互,避免了額外的網(wǎng)絡(luò)通信開銷,特別適用于本地部署的MCP服務(wù)器,可以在司一臺(tái)機(jī)器上啟動(dòng) MCP 服務(wù)器進(jìn)程,與客戶端無縫對(duì)接。
引入依賴
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>
配置MCP服務(wù)端
spring:
application:
name: mcp-server
main:
web-application-type: none # 必須禁用web應(yīng)用類型
banner-mode: off # 禁用banner
ai:
mcp:
server:
stdio: true # 啟用stdio模式
name: mcp-server # 服務(wù)器名稱
version: 0.0.1 # 服務(wù)器版本實(shí)現(xiàn)MCP工具
@Tool 是 SpingAI MCP框架中用于快速暴露業(yè)務(wù)能力為AI 工具的核心注解,該注解實(shí)現(xiàn)Java方法與MCP協(xié)議工具的自動(dòng)銀蛇,并且可以通過注解的屬性description,有助于人工智能模型根據(jù)用戶輸入的信息決定是否調(diào)用這些工具,并返回相應(yīng)的結(jié)果.
@Service
public class OpenMeteoService {
@Tool(description = "根據(jù)經(jīng)緯度獲取天氣預(yù)報(bào)")
public String getAirQuality(
@ToolParameter(description = "緯度,例如:39.9042") String latitude,
@ToolParameter(description = "經(jīng)度,例如:116.4074") String longitude) {
// 模擬數(shù)據(jù),實(shí)際應(yīng)用中應(yīng)調(diào)用真實(shí)API
return "當(dāng)前位置(緯度:" + latitude + ",經(jīng)度:" + longitude + ")的天氣信息:\n 多云轉(zhuǎn)陰";
}
}這個(gè)工具方法主要是用來根據(jù)經(jīng)緯度獲取天氣預(yù)報(bào)的,這里為了方便演示,寫了模擬數(shù)據(jù)
注冊(cè)MCP工具
最后向 MCP 服務(wù)注冊(cè)剛剛寫的工具:
@Bean
public ToolCallbackProvider serverTools(OpenMeteoService openMeteoService) {
return MethodToolCallbackProvider.builder().toolObjects(openMeteoService).build();
}這段代碼定義了一個(gè) Spring 的 Bean,用于將查詢天氣服務(wù) OpenMeteoService 中所有用 @Tool 注解標(biāo)記的方法注冊(cè)為工具,供 AI 模型調(diào)用。
ToolCallbackProvider 是Spring Al 中的一個(gè)接口,用于定義工具發(fā)現(xiàn)機(jī)制,主要負(fù)責(zé)將那些使用
@Tool 注解標(biāo)記的方法轉(zhuǎn)換為工具回調(diào)對(duì)象,并提供給 ChatClient 或ChatModel 使用,以便 AI 模型能夠在對(duì)話過程中調(diào)用這些工具。
MCP 客戶端
引入依賴
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>
配置MCP服務(wù)器
因?yàn)榉?wù)端是通過 stdio 實(shí)現(xiàn)的,需要在 application.yml 中配置MCP服務(wù)器的一些參數(shù):
spring:
ai:
mcp:
client:
stdio:
# 指定MCP服務(wù)器配置文件
servers-configuration: classpath:/mcp-servers-config.json
mandatory-file-encoding: UTF-8其中 mcp-servers-config.json 的配置如下:
{
"mcpServers": {
"weatherServer": {
"command": "java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-Dlogging.pattern.console=",
"-jar",
"/Users/gulihua/Documents/mcp-server/target/mcp-server-0.0.1-SNAPSHOT.jar"
],
"env": {}
}
}
}這個(gè)配置文件設(shè)置了MCP客戶端的基本配置,包括 Java 命令參數(shù),服務(wù)端 jar 包的絕對(duì)路徑等,上述的 JSON 配置文件也可以直接寫在 apllication.yaml 里,效果是一樣的。
mcp:
client:
stdio:
connections:
server1:
command: java
args:
- -Dspring.ai.mcp.server.stdio=true
- -Dspring.main.web-application-type=none
- -Dlogging.pattern.console=
- -jar
- /Users/gulihua/Documents/mcp-server/target/mcp-server-0.0.1-SNAPSHOT.jar客戶端我們使用問里巴巴的通義千問模型,所以引入 spring-ai-alibaba-starter 依賴,如果使用的是其他的模型,也可以使用對(duì)應(yīng)的依賴項(xiàng),比加 openAI 引入 sprine-ai-openai-spring-boot-starter 這個(gè)依賴就行了
配置大模型的密鑰等信息:
spring:
ai:
dashscope:
api-key: ${通義千問的key}
chat:
options:
model: qwen-max初始化聊天客戶端
@Bean
public ChatClient initChatClient(ChatClient.Builder chatClientBuilder,
ToolCallbackProvider mcpTools) {
return chatClientBuilder
.defaultTools(mcpTools)
.build();
}該代碼定義了一個(gè) spring pean,用于初始化一個(gè)AI聊天客戶端,里面有兩個(gè)參數(shù),chatcient.Buinider 是 SpnngAI 提供的AI聊天客戶端構(gòu)建器,用于構(gòu)建 ChatCient實(shí)例,是由 Spring AI 自動(dòng)注入的,另一個(gè)是 ToolCallbackProvider,用于從MCP客服端發(fā)現(xiàn)并獲取AI工具。
然后就可以通過這個(gè) chatclient 去調(diào)用了:
chatClient.prompt() .user(request.getContent()) .call() .content();
基于SSE
MCP服務(wù)端
除了基于 stdio 的實(shí)現(xiàn)外,Spring Al還提供了基于 Server-Sent vents(SSE)的 MCP客戶端方案。相較于 stdio方式,SSE 更適用于遠(yuǎn)程部署的 MCP 服務(wù)器,客戶端可以通過標(biāo)準(zhǔn) HTTP 協(xié)議與服務(wù)器建立連接,實(shí)現(xiàn)單向的實(shí)時(shí)數(shù)據(jù)推送。基于 SSE的 MCP 服務(wù)器支持被多個(gè)客戶端的遠(yuǎn)程調(diào)用。
引入依賴
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>
配置MCP服務(wù)端
server:
port: 8090
spring:
application:
name: mcp-server
ai:
mcp:
server:
name: mcp-server # MCP服務(wù)器名稱
version: 0.0.1 # 服務(wù)器版本號(hào)除了引入的依賴包不一樣,以及配置文件不同,其他的不需要修改。
MCP 客戶端
引入依賴
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>
配置MCP服務(wù)器
因?yàn)榉?wù)端是通過SSE實(shí)現(xiàn)的,需要在 application.yml 中配置MCP服務(wù)器的URL端口:
spring:
ai:
mcp:
client:
enabled: true
name: mcp-client
version: 1.0.0
request-timeout: 30s
type: ASYNC # 類型同步或者異步
sse:
connections:
server1:
url: http://localhost:8090和MCP服務(wù)端的修改一樣,除了依賴和配置的修改,其他的也不需要調(diào)整
注意
除了上面基礎(chǔ)的用法和配置,還應(yīng)該考慮以下幾個(gè)方面:
- 工具設(shè)計(jì)
- 每個(gè)工具方法應(yīng)具備明確的功能定義及參數(shù)說明。
- 使用 @Tool 注解提供清晰、完整的工具描述,便于自動(dòng)生成文檔或展示給前端。
- 使用 @ToolParameter 注解詳細(xì)說明每個(gè)參數(shù)的用途,提升使用者的理解與正確性。
- 錯(cuò)誤處理
- 應(yīng)全面捕獲并妥善處理可能出現(xiàn)的異常,防止服務(wù)崩潰。
- 返回結(jié)構(gòu)化、具備可讀性的錯(cuò)誤信息,便于客戶端識(shí)別錯(cuò)誤原因并進(jìn)行相應(yīng)處理。
- 性能優(yōu)化
- 對(duì)于可能耗時(shí)的任務(wù),建議使用異步處理機(jī)制,避免阻塞主線程,
- 設(shè)置合理的超時(shí)時(shí)間,防止客戶端長時(shí)間等待,提高系統(tǒng)響應(yīng)性和穩(wěn)定性。
- 安全性考慮
- 對(duì)涉及敏感資源或關(guān)鍵操作的工具方法,應(yīng)添加嚴(yán)格的權(quán)限校驗(yàn)邏輯
- 禁止在工具方法中執(zhí)行高風(fēng)險(xiǎn)操作(如執(zhí)行任意系統(tǒng)命令),以防止安全洞。
- 部署策略
- Stdio 模式:適用于嵌入式場(chǎng)景,可作為客戶端的子進(jìn)程運(yùn)行,便于集成與資源控制。
- SSE模式:更適合部署為獨(dú)立服務(wù),支持多個(gè)客戶端同時(shí)訪問,適用于需要持續(xù)通信的遠(yuǎn)程調(diào)用場(chǎng)景。
到此這篇關(guān)于Spring AI 框架中如何集成 MCP?的文章就介紹到這了,更多相關(guān)Spring AI集成 MCP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)的漢字轉(zhuǎn)五筆功能實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)的漢字轉(zhuǎn)五筆功能,結(jié)合具體實(shí)例形式分析了java基于字符串遍歷與編碼轉(zhuǎn)換等操作實(shí)現(xiàn)五筆編碼獲取的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Java中的HttpServletRequest接口詳細(xì)解讀
這篇文章主要介紹了Java中的HttpServletRequest接口詳細(xì)解讀,是一個(gè)接口,全限定名稱為Jakarta.Serclet.http.HttpServletRequest2023-11-11
HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下
IDEA右鍵新建時(shí)沒有Java Class選項(xiàng)的解決過程
今天遇到在IntelliJ IDEA中無法新建JavaClass文件的問題,經(jīng)過查詢和實(shí)踐,找到了兩種解決辦法,第一種是避免將包名設(shè)置為Java的關(guān)鍵字,例如將"abstract"改為"abstract_";第二種是通過Project Structure設(shè)置Sources目錄,將包含Java類的目錄標(biāo)記為Sources2025-11-11
SpringBoot如何整合mybatis-generator-maven-plugin 1.4.0
這篇文章主要介紹了SpringBoot整合mybatis-generator-maven-plugin 1.4.0的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-01-01
JavaWeb之Servlet注冊(cè)頁面的實(shí)現(xiàn)示例
注冊(cè)頁面是很多網(wǎng)站都會(huì)是使用的到,本文主要介紹了JavaWeb之Servlet注冊(cè)頁面的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

