AI應用開發的高級特性——MCP模型上下文協議,打通AI與外部服務的邊界。
**************************************************************************************************************
一、需求分析
當你的AI具備了RAG的能力,具備了調用工具的能力,我想在上海找一家特別小資的約會圣地?
1、直接利用AI大模型自身的能力:大模型本身就有一定的訓練知識,可以識別出位置信息和地點,但不夠準確詳盡。
2、利用RAG知識庫:把約會地點整理成知識庫,讓AI利用他來回答,但是需要人工提供足夠的信息。
3、利用工具調用:開發一個根據位置查詢附近店鋪的工具,可以利用第三方地圖API(比如高德),這樣得到的信息更準確。
如上我們肯定會選擇第3種方式來實現。既然選擇調用第三方API,更實用輕松便捷的就是MCP協議。
二、MCP
什么是MCP
MC(Model Context Protocol,模型上下文協議)是一種開放標準,目的是增強AI與外部系統的交互能力。MCP為AI提供了與外部工具、資源和服務交互的標準化方式,讓AI能夠訪問最新數據、執行復雜操作,并與現有系統集成。
根據MCP官方定義,MCP是一種開放協議,標準化了應用程序如何向大模型提供上下文的方式。可以將MCP想象成AI應用的USB接口。就像USB為設備連接各種設備提供了標準化方式一樣,MCP為AI模型連接不同的數據源和工具提供了標準化方法。
🙋?♀?🌰
方便理解MCP的作用:首先是增強AI的能力,通過MCP協議,AI應用可以輕松接入提供的服務來實現更多功能。比如搜索網頁,調用第三方、執行計算得等。
其次,MCP是個協議或者標準,本身不具備提供服務的能力,只是定義好了一套規范,讓服務者和服務使用者去遵守。就像HTTP協議一樣,現在前后端發送請求基本都是用HTTP協議,像get/post請求類別,401、404狀態碼,這些標準能有效降低開發者的理解成本。
此外,標準化還有其他好處。官方把查詢地圖的能力直接做成一個服務,誰要用誰就接入,就省去了開發成本,如果大家陸續開放自己的服務,不就相當于打造了一個服務市場。
標準可以打造生態。就像前端NPM包、后端maven倉庫,Docker鏡像源。或者安卓市場、App Store。
MCP三大作用:
- 輕松增強AI能力
- 統一標準,降低使用和理解成本
- 打造服務生態
MCP架構
1、宏觀架構
MCP核心是“客戶端 - 服務器”架構,其中MCP客戶端主機可以鏈接到多個服務器。客戶端主機是指希望訪問MCP服務的程序,比如Claude Desktop、IDE、AI工具或部署在服務器上的項目。
2、SDK 3層架構
如果要在程序中使用MCP或者開發MCP服務,可以引入MCP官方的SDK,比如Java SDK。
官方文檔了解MCP SDK的架構,主要分3層:
分別來看每一層的作用:
- 客戶端/服務器層:McpClient處理客戶端操作,而McpServer管理服務器端協議操作。兩者都使用McpSession進行通信管理。
- 會話層(McpSession):通過DefaultMcpSession實現管理通信模式和狀態。
- 傳輸層(McpTransport):處理JSON-RPC消息序列化和反序列化,支持多種傳輸實現,比如Stdio標準IO流傳輸和HTTPSSE遠程傳輸。
客戶端和服務端需要先經過流程建立鏈接,之后才能正常交換信息:
3、MCP 客戶端
MCP Client是MCP架構中的關鍵組件,主要負責和MCP服務器建立連接并進行通信。他能自動匹配服務器的協議版本,確認可用功能、負責數據傳輸和JSON-RPC交互。此外,還能發現和使用各種工具、管理資源和提示詞系統進行交互。
除了核心功能,MCP客戶端還支持一些額外特性,比如根管理、采樣控制,以及同步或異步操作,為了使用不同場景,他提供了多種數據傳輸方式,包括:
- Stdio標準輸入/輸出:適用于本地調用
- 基于Java HttpClient和WebFlux的SSE傳輸:適用于遠程調用
客戶端可以通過不同傳輸方式調用不同MCP服務,可以是本地的,也可以是遠程的。
4、MCP 服務
MCP Server也是整個MCP架構的關鍵組件,主要用來為客戶端提供各種工具,資源和功能支持。
負責處理客戶端的請求,包括解析協議提供工具,管理資源以及處理各種交互信息。同事,還能記錄日志,發送通過,并且支持多個客戶端同時連接,保證高效的通信和協作。
和客戶端一樣,他也可以通過多種方式進行數據傳輸,比如Stdio標準輸入/輸出、基于Servlet/WebFlux/WebMV的SSE傳輸,滿足不同應用場景。
這種設計是的客戶端和服務端完全解耦,任何語言開發的客戶端都可以調用MCP服務。
MCP核心概念
官方給出6大核心概念:
- Resources資源:讓服務端向客戶端提供各種數據,比如文本,文件,數據庫記錄,API響應等,客戶端可以決定什么時候使用這些資源。使AI能夠訪問最新信息和外部知識,為模型提供更豐富的上下文。
- Prompts提示詞:服務端可以定義可復用的提示詞模板和工作流,供客戶端和用戶直接使用。他的作用是標準化常見AI交互模式,比如能作為UI元素(如斜杠命令,快捷鍵操作)呈現給用戶,從而簡化用戶與LLM的交互過程。
- Tools工具:MCP中最實用的特性,服務端可以提供給客戶端可調用的函數,使AI模型能夠執行計算、查詢信息或者外部系統哦交互,極大擴展了AI的能力范圍。
- Sampling采樣:允許服務端通過客戶端向大模型發送生成內容的請求(反向請求)。使MCP服務能夠實現復雜的只能代理行為,同時保持用戶對整個過程的控制和數據隱私保護。
- Roots根目錄:MCP協議的安全機制,定義了服務器可以訪問文件系統位置,限制訪問范圍,為MCP服務提供安全邊界,當值惡意文件訪問。
- Transports傳輸:定義客戶端和服務器間的通信方式,包括Stdio(本地進程間通信)和SSE(網絡實時通信),確保不同環境下的可靠信息交換。
開發MCP服務,主要關注 Resources資源、Prompt提示詞、Tools工具(重中之重),三個改變。
MCP 官方文檔 中提到,大多數客戶端也支持Tools工具調用能力:
實際開發中,實際應用關注Tools工具即可。
三、使用 MCP
3種使用MCP方式:
- 云平臺使用MCP
- 軟件客戶端使用MCP
- 程序中使用MCP
不管哪一種,原理類似。有2種可選的使用模式:本地下載MCP服務端代碼運行(類似引入了一個SDK),或者直接使用已部署的MCP服務(類似調用別人的API)
MCP服務市場
開發者可以在這些平臺上找到各種現成的MCP服務
- MCP.so:主流,提供豐富的MCP服務目錄
- GitHub Awesome MCP Server:開源MCP服務集合
- 阿里云百煉MCP服務市場
- Spring AI Alibaba的MCP服務市場
- Glama.ai MCP服務
多數MCP服務市場僅提供本地下載MCP服務端代碼并運行的使用方式,部署MCP服務也需要成本
阿里云百煉平臺提供了云端部署的MCP服務,在線填寫配置后可以使用,輕松和平臺上的AI應用集成。
云平臺使用 MCP
以阿里云百煉為例,參考阿里官方MCP文檔,可以直接使用官方預置的MCP服務,或者部署自己的MCP服務到阿里云平臺上。
官方提供了現成的MCP服務:
進入智能體應用,在左側可以點擊添加MCP服務,然后選擇想要使用的MCP服務即可,比如高德地圖MCP服務,提供地理信息查詢等。
測試輸入Prompt:聽說上海靜安區有很多寶藏小吃和游玩圣地,范圍5公里,,幫我規劃一下吧。
AI會根據需求調用不同的工具,比如地點轉換為坐標,查找某坐標附近的點:
調用工具后,AI會利用工具的輸出結果進一步分析并生成回復。這個流程就像(Tool Calling)
軟件客戶端使用 MCP
不同客戶端軟件對MCP支持成都不同,可以在官方文檔中查看個客戶端的支持特性。
接下來,使用目前較為主流的AI客戶端Cursor為例,調用MCP服務。采用本地運行的方式。
1、環境
首先安裝本地運行MCP服務需要用到工具,具體安轉什么工具取決于MCP服務的配置要求。
🙋?♀?🌰
在MCP市場找到高德地圖MCP,發現Server Config中定義了使用npx命令行工具來安裝和運行服務端代碼
大多數MCP服務都支持與npx工具運行,所以推薦安裝Node.js和NPX,可去Node官方下載安裝。
從配置中我們發現,使用地圖MCP需要API Key,在地圖開放平臺創建應用并添加API Key
2、Cursor接入MCP
在右上角進入Cursor Settings設置界面,然后選擇MCP,添加全局MCP Server:
從MCP市場中找到MCPServer Config,并粘貼到mcp.json配置中,注意要將API key更改為自己的
保存配置,軟件會自動識別并啟動服務。
3、測試使用MCP
提供Prompt:“去上海靜安區的寶藏小店和打卡圣地游玩推薦。”
觀察效果 ,發現AI可能會調用多次MCP
圖示結果
云服務使用MCP調用次數不穩定,可能產生AI和API調用產生費用,所以不建議使用。
如果要使用其他客戶端,接入方式類似,比如:
- Cherry Studio:查看軟件官方文檔了解集成方法
- Claude Desktop:參考MCP 官方的用戶快速入門指南
程序中使用MCP
利用Spring AI框架,在程序中使用MCP并完成我們的需求,實現一個完成“旅游攻略”的AI助手。
首先了解Spring AI MCP客戶端的基本使用方法。建議參考Spring AI Alibaba的文檔。
1、在Maven中央倉庫找到依賴
<!-- https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-mcp-client-spring-boot-starter -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><version>1.0.0-M6</version>
</dependency>
2、在resouces目錄下新建mcp-servers.json配置,定義需要用到的MCP服務:
{"mcpServers": {"amap-maps": {"command": "npx","args": ["-y","@amap/amap-maps-mcp-server"],"env": {"AMAP_MAPS_API_KEY": "改成你的 API Key"}}}
}
??注意:在Windows環境下,命令配置需要添加.cmd后綴(如npx.cmd),否則會報錯找不到命令。
3、修改Spring配置文件,編寫MCP客戶端配置。由于是本地運行MCP服務,所以使用stdio模式,并且要執行MCP服務配置文件的位置。
spring:ai:mcp:client:stdio:servers-configuration: classpath:mcp-servers.json
這樣,MCP客戶端程序啟動時,會額外啟動一個子進程來運行MCP服務,從而能夠實現調用。
4、寫一個利用MCP完成對話的方法。通過自動注入的ToolCallbackProvider獲取到配置中定義的MCP服務提供的所有工具,并提供給ChatClient。
@Resource
private ToolCallbackProvider toolCallbackProvider;public String doChatWithMcp(String message, String chatId) {ChatResponse response = chatClient.prompt().user(message).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))// 開啟日志,便于觀察效果.advisors(new MyLoggerAdvisor()).tools(toolCallbackProvider).call().chatResponse();String content = response.getResult().getOutput().getText();logger.info("content: {}", content);return content;
}
代碼中可以看出,MCP調用的本質就是類似工具調用,并不是讓AI服務器主動去調用MCP服務,而是告訴AI“MCP服務提供了哪些工具”,如果AI想要使用這些工具完成任務,就會告訴我們的后端程序在執行工具后將結果返回給AI,最后由AI總結回復。
5、測試運行
@Test
void doChatWithMcp() {String chatId = UUID.randomUUID().toString();// 測試地圖 MCPString message = "上海靜安區的寶藏小店,推薦打卡。";String answer = loveApp.doChatWithMcp(message, chatId);
}
可以在地圖開放品改控制查看API key的使用量,注意控制調用次數。
四、Spring AI MCP 開發模式
Spring AI在MCP官方Java SDK的基礎上額外封裝了一層,提供了和Spring Boot整合的SDK,支持客戶端和服務端的普通調用和響應式調用。
MCP客戶端開發
客戶端開發主要基于Spring AI MCP Client Boot Starter,能夠自動完成客戶端的初始化,管理多個客戶端實例,自動清理資源等。
1、引入資源
Spring AI 提供了2種客戶端SDK,分別支持非響應式和響應式編程,可以根據需要選擇對應的依賴包:
- spring-ai-starter-mcp-client:核心啟動器,提供stdio和基于http的SSE支持
- spring-ai-starter-mcp-client-webflux:基于WebFlux響應式的SSE傳輸實現
比如下面依賴(具體以官方為準)
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>
2、配置連接
引入依賴后,需要配置與服務器的連接,Spring AI支持兩種配置方式:
1、直接寫入配置文件,這種方式同時吃吃stdio和SSE連接方式
spring:ai:mcp:client:enabled: truename: my-mcp-clientversion: 1.0.0request-timeout: 30stype: SYNCsse:connections:server1:url: http://localhost:8080stdio:connections:server1:command: /path/to/serverargs:- --port=8080env:API_KEY: your-api-key
更多配置屬性可參考Spring AI官方文檔
2、引入Claude Desktop 格式的JSON文件,目前僅支持stdio連接方式
spring:ai:mcp:client:stdio:servers-configuration: classpath:mcp-servers.json
配置文件格式:
{"mcpServers": {"filesystem": {"command": "npx","args": ["-y","@modelcontextprotocol/server-filesystem","/Users/username/Desktop","/Users/username/Downloads"]}}
}
3、使用服務
啟動項目是,Spring AI 會自動注入一些MCP相關的Bean。
1、如果想完全自主控制MCP客戶端的行為,可以使用McpClient Bean,支持同異步:
// 同步客戶端
@Autowired
private List<McpSyncClient> mcpSyncClients;// 異步客戶端
@Autowired
private List<McpAsyncClient> mcpAsyncClients;
查看McpSyncClient的源碼,發現提供了很多和MCP服務端交互的方法,比如獲取工具信息,調用工具等等:
注意,每個MCP服務連接都會創建一個獨立的客戶端實例。
2、如果你想利用MCP服務提供的工具來增強AI的能力,可以使用自動注入的ToolCallbackProvider Bean,從中獲取到ToolCallback工具對象,。
// 和 Spring AI 的工具進行整合
@Autowired
private SyncMcpToolCallbackProvider toolCallbackProvider;
ToolCallback[] toolCallbacks = toolCallbackProvider.getToolCallbacks();
綁定給ChatClient對象即可:
ChatResponse response = chatClient.prompt().user(message).tools(toolCallbackProvider).call().chatResponse();
4、其他特新
1、Spring AI同時支持同步和異步客戶端類型,可根據應用需求選擇合適的模式,只需要更改配置即可:
spring.ai.mcp.client.type=ASYNC
2、開發者可以通過編寫自定義Client Bean來定制客戶端行為,比如設置請求超時時間設置文件系統根目錄的訪問范圍,自定義時間處理器,添加特色的日志處理邏輯。
官方提供的代碼示例:
@Component
public class CustomMcpSyncClientCustomizer implements McpSyncClientCustomizer {@Overridepublic void customize(String serverConfigurationName, McpClient.SyncSpec spec) {// 自定義請求超時配置spec.requestTimeout(Duration.ofSeconds(30));// 設置此客戶端可訪問的根目錄URIspec.roots(roots);// 設置處理消息創建請求的自定義采樣處理器spec.sampling((CreateMessageRequest messageRequest) -> {// 處理采樣CreateMessageResult result = ...return result;});// 添加在可用工具變更時通知的消費者spec.toolsChangeConsumer((List<McpSchema.Tool> tools) -> {// 處理工具變更});// 添加在可用資源變更時通知的消費者spec.resourcesChangeConsumer((List<McpSchema.Resource> resources) -> {// 處理資源變更});// 添加在可用提示詞變更時通知的消費者spec.promptsChangeConsumer((List<McpSchema.Prompt> prompts) -> {// 處理提示詞變更});// 添加接收服務器日志消息時通知的消費者spec.loggingConsumer((McpSchema.LoggingMessageNotification log) -> {// 處理日志消息});}
}
MCP服務端開發
服務端開發主要基于Spring AI MCP Server Boot Starter,能夠自動配置MCP服務端組件。使開發者能夠輕松創建MCP服務,向AI客戶端提供工具,資源和提示詞模板,從而擴展AI模型的能力范圍。
1、引入依賴
- spring-ai-starter-mcp-server:提供stdio傳輸支持,不需要額外的web依賴
- spring-ai-starter-mcp-server-webmvc:提供基于SpringMCV的SSE傳輸和可選的stdio傳輸(推薦)
- springi-ai-strater-mcp-server-webflux:提供基于Spring WebFlux的響應式SSE傳輸和可選的stdio傳輸
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>
2、配置服務
# 使用 spring-ai-starter-mcp-server
spring:ai:mcp:server:name: stdio-mcp-serverversion: 1.0.0stdio: truetype: SYNC # 同步
開發SSE服務,配置如下:
# 使用 spring-ai-starter-mcp-server-webmvc
spring:ai:mcp:server:name: webmvc-mcp-serverversion: 1.0.0type: SYNC # 同步sse-message-endpoint: /mcp/message # SSE 消息端點路徑sse-endpoint: /sse # SSE 端點路徑
如果開發響應式(異步)服務,配置如下:
# 使用 spring-ai-starter-mcp-server-webflux
spring:ai:mcp:server:name: webflux-mcp-serverversion: 1.0.0type: ASYNC # 異步sse-message-endpoint: /mcp/messages # SSE 消息端點路徑sse-endpoint: /sse # SSE 端點路徑
更多配置參見Spring AI 官方文檔
spring:ai:mcp:server:enabled: true # 啟用/禁用 MCP 服務stdio: false # 啟用/禁用 stdio 傳輸name: my-mcp-server # 服務名稱version: 1.0.0 # 服務版本type: SYNC # 服務類型(SYNC/ASYNC)resource-change-notification: true # 啟用資源變更通知prompt-change-notification: true # 啟用提示詞變更通知tool-change-notification: true # 啟用工具變更通知sse-message-endpoint: /mcp/message # SSE 消息端點路徑sse-endpoint: /sse # SSE 端點路徑# 可選 URL 前綴base-url: /api/v1 # 客戶端訪問路徑將是/api/v1/sse 和 /api/v1/mcp/message
3、開發服務
MCP服務開發都是類似的,直接泗洪@Tool注解表姐服務類中的方法。
@Service
public class WeatherService {@Tool(description = "獲取指定城市的天氣信息")public String getWeather(@ToolParameter(description = "城市名稱,如北京、上海") String cityName) {// 實現天氣查詢邏輯return "城市" + cityName + "的天氣是晴天,溫度22°C";}
}
然后Spring Boot項目啟動時注冊一個ToolCallbackProvider Bean:
@SpringBootApplication
public class McpServerApplication {@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}
}
MCP 工具類
Spring AI提供了一系列輔助MCP開發的工具類,用于MCP和ToolCallback之間互相轉換。
也就是說,開發者可以直接將之前開發的工具轉換為MCP服務,極大提高代碼的復用性