MCP客戶端是AI與外部世界交互的橋梁。在AI系統中,大模型雖然具備強大的認知能力,卻常常受限于數據孤島問題,無法直接訪問外部工具和數據源。MCP協議應運而生,作為標準化接口解決這一核心挑戰。該協議采用客戶端-服務端架構,將AI模型的智能計算能力與外部系統的專業功能解耦,形成可擴展的協作生態。MCP客戶端作為架構的關鍵組件,使得AI應用能夠像使用"萬能遙控器"一樣,通過MCP客戶端安全調用各類專業工具,而無需關心底層實現細節。其設計充分體現了AI系統與外部環境交互的三個基本原則:
- 標準化:通過統一協議消除工具集成中的適配成本。
- 安全性:在保持模型隔離的同時實現受控的外部訪問。
- 靈活性:支持多樣化的傳輸機制和運行時環境。
MCP客戶端是MCP架構中的關鍵組件,負責與MCP服務端進行交互,以利用MCP服務端提供的工具、資源及能力。MCP客戶端實現協議的客戶端部分,通過遵循MCP協議的結構化方式,發送請求并接收來自MCP服務端的響應。MCP客戶端能夠在不同的環境中靈活運行,利用MCP服務端提供的多種傳輸機制,確保與MCP服務端的穩定、高效通信。通過與MCP服務端的協同工作,MCP客戶端能夠擴展AI模型的功能,實現與外部工具和資源的無縫集成。
- 核心職責包括:
- 協議版本協商 :確保與服務器的兼容性。
- 能力協商 :確定可用功能(如工具支持范圍)。
- 消息傳輸與JSON-RPC通信 :實現結構化數據交互。
- 工具發現與執行 :動態識別并調用外部工具。
- 資源訪問與管理 :協調模型與外部數據源的交互。
- 提示系統交互 :支持與模型提示(Prompt)系統的集成。
- 可選功能 :
- 根管理(Roots Management)。
- 采樣支持(如模型輸出概率控制)。
- 同步與異步操作模式。
- 傳輸選項 :
- 基于標準輸入/輸出的傳輸(適用于進程間通信)。
- 基于Java HttpClient的SSE客戶端傳輸(支持事件流)。
- 基于WebFlux的SSE客戶端傳輸(用于響應式HTTP流處理)。
MCP客戶端簡單示例
-
項目依賴
<dependencies><!-- SpringBootStarterWeb依賴包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.4.5</version></dependency><!-- JavaxServlet依賴包 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency><!-- SpringAI依賴包 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-spring-boot-autoconfigure</artifactId><version>1.0.0-M6</version></dependency> </dependencies>
-
項目配置
- 這里主要配置MCP服務端的SSE連接。
spring:profiles:active: devapplication:name: ai-demo-mcp-clientmain:allow-bean-definition-overriding: trueai:mcp:client:enabled: truename: ai-demo-mcp-clienttype: syncversion: 1.0.0sse:connections:ai-demo-platform-mcp-server:url: http://localhost:10102server:port: 10103
-
項目代碼
- Spring AI中通過SyncMcpToolCallback適配MCP工具到統一接口。通過SyncMcpToolCallbackProvider將McpSyncClient列表轉換為Spring AI標準的ToolCallback數組。SyncMcpToolCallbackProvider作為適配器,實現了MCP協議工具到Spring AI工具接口的橋接。
- ToolCallback中通過ToolDefinition實現MCP協議的能力聲明,返回工具的結構化定義。ToolDefinition獲取工具的名稱(name)、描述(description)和輸入模式(inputSchema)等。所有工具通過統一的call()方法執行,符合MCP的JSON-RPC規范。
@RestController("aiDemoClient") @RequestMapping("ai/demo/client") public class AiDemoClientRest {private static final Map<String, ToolCallback> TOOL_CACHE = new HashMap<>();public AiDemoClientRest(List<McpSyncClient> mcpSyncClientList) {SyncMcpToolCallbackProvider syncMcpToolCallbackProvider = new SyncMcpToolCallbackProvider(mcpSyncClientList);ToolCallback[] toolCallbacks = syncMcpToolCallbackProvider.getToolCallbacks();for (ToolCallback toolCallback : toolCallbacks) {TOOL_CACHE.put(toolCallback.getToolDefinition().name(), toolCallback);}StringBuilder stringBuilder = new StringBuilder();TOOL_CACHE.values().forEach(toolCallback -> {ToolDefinition toolDefinition = toolCallback.getToolDefinition();stringBuilder.append(String.format("name %s desc %s input %s",toolDefinition.name(), toolDefinition.description(), toolDefinition.inputSchema())).append("\n");});System.out.println(stringBuilder);}@GetMapping("001")public String demo001() {return TOOL_CACHE.get("addInteger").call("{\"arg0\":2,\"arg1\":6}");}@GetMapping("002")public String demo002() {return TOOL_CACHE.get("addDouble").call("{\"arg0\":2.0,\"arg1\":6.0}");}}
-
通過上述配置和代碼,即可與MCP服務器交互。