之前學過了工具調用(spring-ai 1.0.0 學習(十二)——工具調用_springai 1.0 如何判斷調用哪一個tool工具-CSDN博客),今天來看一下MCP
MCP是什么
MCP全稱是模型上下文協議,有點繞,通俗點理解,如果說tool是支持調用系統內部的工具,那么mcp就是支持調用系統外部的工具,比如高德地圖、百度搜索等。
為了方便進行外部調用,就需要一個類似http協議的規范,來約定調用方的報文格式和被調用方如何解析報文,這就是mcp的由來。
今天我們主要看如何使用MCP Client,即如何調用外部應用。
最小化樣例
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client-webflux</artifactId></dependency>
客戶端需引入上述2個包之一,webflux包是基于SSE的WebFlux傳輸,另一個則是STDIO和基于SSE的HTTP。生產環境建議使用webflux。
然后需要在application文件中添加如下配置(SSE)
spring:ai:mcp:client:sse:connections:server1:url: http://localhost:8080server2:url: http://otherserver:8081sse-endpoint: /custom-sse
其中server1、server2是自定義的服務名稱,可自行修改
然后就可以在代碼中使用了
@AutowiredToolCallbackProvider toolCallbackProvider;@GetMapping("/ai/mcp-client")String generation(String userInput){return this.chatClient.prompt().user(userInput).toolCallbacks(toolCallbackProvider).call().content();}
spring-ai會自動將配置文件中的url組裝成ToolCallbackProvider,將其傳遞給大模型即可。
進階知識
內部原理及相關接口和實現類
以基于SSE的Http為例,在spring-ai中,自動化配置會進行下列操作:
用戶添加在application中的spring.ai.mcp.client.sse配置會首先被加載進McpSseClientProperties中
然后每個connection(樣例中的server1、server2)會創建一個HttpClientSseClientTransport來負責通信
然后每個HttpClientSseClientTransport與其命名一起,被封裝為NamedClientMcpTransport
然后NamedClientMcpTransport會與spring.ai.mcp.client下的其他通用配置,根據Type不同(Sync、Async)組成McpSyncClient或McpAsyncClient,創建完成后會向服務器發送請求initialize,初始化服務器相關參數(服務器能力介紹、是否支持tool,resource,prompt等)
最后所有McpSyncClient組成SyncMcpToolCallbackProvider
SyncMcpToolCallbackProvider負責將McpSyncClient轉換為SyncMcpToolCallback,期間會向服務器發送tools/list請求,獲取工具詳細信息(描述、請求格式等)
之后就是在tool篇提到的,將工具定義發送給大模型等。。。