SpringAI學習筆記-MCP客戶端簡單示例

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服務器交互。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88227.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

postgresql|數據庫|系統性能監控視圖pg_stat與postgresql數據庫的調優(備忘)

一、 寫作初衷 通常,我們使用navicat這樣的數據庫圖形管理工具,只能看到用戶層面的表,視圖,而系統層面的表,視圖,函數是無法看到的,這些表,視圖和函數好像也可以稱之為內模式;而這些視圖,函數的作用是非常大的,其中pg_stat 族系統視圖可以得到數據庫的詳細運行信息…

網絡安全護網實戰:攻擊手段解析與防御策略

在網絡安全領域&#xff0c;護網行動中對各類攻擊方式和漏洞原理的掌握至關重要。本文將詳細解析常見的攻擊方式及其背后的漏洞原理&#xff0c;幫助大家提升護網技能。一、常見攻擊方式及漏洞原理1. SQL注入漏洞? 定義&#xff1a;將惡意的數據庫語句注入到后臺數據庫去執行&…

使用alist+RaiDrive+webdav將百度夸克網盤變為本地電腦磁盤方法教程

由于每天都要操作網盤不下十幾次&#xff0c;頻繁啟動網盤比較麻煩。 使用百度夸克網盤的webdav服務可以將百度夸克網盤掛載到本地電腦上&#xff0c;就像操作本地電腦硬盤一樣操作網盤&#xff0c;非常方便。我們以alistraidrive為例演示。 首先打開百度網盤pan.baidu.com&a…

C# 入門學習教程(二)

文章目錄一、操作符詳解1、操作符概覽2、操作符的本質3、操作符的優先級4、同級操作符的運算順序5、 各類操作符的示例二、表達式&#xff0c;語句詳解1. 表達式的定義2. 各類表達式概覽3. 語句的定義4. 語句詳解一、操作符詳解 C# 中的操作符是用于執行程序代碼運算的符號&am…

Linux內核深度解析:IPv4策略路由的核心實現與fib_rules.c源碼剖析

深入探索Linux網絡棧的規則引擎,揭秘策略路由如何通過多級路由表實現復雜流量控制 在Linux網絡棧中,路由決策遠不止簡單的目的地址匹配。策略路由(Policy Routing)允許根據源地址、TOS值、端口等復雜條件選擇不同的路由路徑。本文將深入剖析實現這一功能的核心源碼——net/…

【UE5】虛幻引擎的運行邏輯

UE5的運行邏輯可以分為引擎啟動流程和游戲運行流程兩個部分。引擎啟動流程一、平臺入口&引擎主流程初始化1、系統入口不同的平臺會有不同的入口。在Windows平臺&#xff0c;入口是Launch模塊下的\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp文件中的W…

大數據學習1:Hadoop單機版環境搭建

1.基礎知識介紹 Flume采集日志。Sqoop采集結構化數據&#xff0c;比如采集數據庫。 存儲到HDFS上。 YARN資源調度&#xff0c;每臺服務器上分配多少資源。 Hive是基于Hadoop的一個數據倉庫工具&#xff0c;提供SQL查詢功能&#xff0c;能將SQL語句轉變成MapReduce任務來執行…

深入理解PHP中的命名空間和自動加載機制

首先&#xff0c;讓我們來討論命名空間。PHP的命名空間是一種對代碼進行邏輯分組的機制&#xff0c;它允許開發者將函數、類和常量封裝在不同的命名空間中。這樣做的好處在于可以避免全局范圍內的名稱沖突。例如&#xff0c;你可能在你的項目中使用了一個名為"Database&qu…

學習:JS[3]數組的增刪改查+函數+作用域

一.操作數組1.改2.增arr.push(新增的內容):將一個或多個元素添加到數組的結尾arr.unshift(新增的內容):方法將一個或多個元素添加到數組的開頭,并返回該數組的長度3.刪除arr.pop():方法從數組中刪除最后一個元素,不帶參數,并返回元素的值arr.shift():方法從數組中刪除第一個元素…

從0到1搭建ELK日志收集平臺

ELK是什么 ELK 是指 Elasticsearch、Logstash 和 Kibana 這三種工具的組合&#xff0c;通常用于日志分析、數據搜索和可視化。它們分別承擔不同的功能&#xff0c;形成了強大的數據處理和分析平臺&#xff1a; Elasticsearch&#xff1a;一個分布式搜索引擎&#xff0c;擅長實時…

Qt:圖片切割

void MainWindow::on_action_slice_triggered() {QDialog *dialog new QDialog(this);dialog->setWindowTitle("切割");dialog->setFixedSize(200, 150);QVBoxLayout *vbox new QVBoxLayout;QHBoxLayout *hbox new QHBoxLayout;QLabel *label new QLabel(&…

BabelDOC,一個專為學術PDF文檔設計的翻譯和雙語對比工具

你是否也有這樣的困境&#xff0c;面對一篇學術論文&#xff0c;即使英語水平不錯&#xff0c;仍需反復查詞典&#xff0c;尤其是遇到專業術語和復雜長句&#xff0c;翻譯軟件又常常不能很好地處理學術PDF的排版&#xff0c;導致翻譯結果混亂不堪。 現在&#xff0c;解決你煩惱…

Python之面向對象和類

一.類1.類的定義&#xff1a;class 類名&#xff1a;“”“注釋 ”“”pass2.實例的創建&#xff1a;實例 類名(parameterlist)parameterlist&#xff1a;定義類時__init__()方法的參數&#xff0c;如果該方法只有一個self參數&#xff0c;parameterlist可以省略class Goose()…

【力扣 困難 C】329. 矩陣中的最長遞增路徑

目錄 題目 解法一 題目 待添加 解法一 int max(int a, int b) {return a > b ? a : b; }int search(int** matrix, int m, int n, int i, int j, int (*dp)[n]) {if (dp[i][j]) {return dp[i][j];}int len 0;if (i > 0 && matrix[i - 1][j] > matrix[i]…

Blueprints - UE5的增強輸入系統

一些學習筆記歸檔&#xff1b;增強輸入系統由兩部分組成&#xff1a;Input Action和Input Mapping ContextInput Action是輸入操作的映射&#xff08;操作中比如有移動、跳躍等&#xff09;&#xff0c;Input Mapping Context是輸入情境的映射&#xff08;對各種操作的具體按鍵…

Python 【技術面試題和HR面試題】? 動態類型、運算符、輸入處理及算法編程問答

1.技術面試題 &#xff08;1&#xff09;TCP與UDP的區別是什么&#xff1f; 答&#xff1a; ①連接性&#xff1a;TCP 面向連接&#xff0c;3次握手及4次揮手&#xff0c;建立端到端的虛鏈路像&#xff1b;UDP 無連接&#xff0c;直接發送&#xff0c;無需預先建立連接 。 ②傳…

etcd-cpp-apiv3 二次封裝

接口介紹頭文件#include <etcd/Client.hpp> #include <etcd/KeepAlive.hpp> #include <etcd/Response.hpp> #include <etcd/SyncClient.hpp> #include <etcd/Value.hpp> #include <etcd/Watcher.hpp>下面從功能介紹幾個類的概念Value &…

【網絡與系統安全】強制訪問控制——Biba模型

一、模型定義與目標 提出背景&#xff1a;1977年由Ken Biba提出&#xff0c;是首個完整性安全模型&#xff0c;與BLP模型形成對偶&#xff08;BLP關注機密性&#xff0c;Biba關注完整性&#xff09;。核心目標&#xff1a;防止低完整性信息污染高完整性信息&#xff0c;避免未授…

從架構抽象到表達范式:如何正確理解系統架構中的 4C 模型20250704

&#x1f9e9; 從架構抽象到表達范式&#xff1a;如何正確理解系統架構中的 4C 模型&#xff1f; “4C”到底是架構的組成結構&#xff0c;還是架構圖的表現方式&#xff1f;這類看似細節的問題&#xff0c;其實直擊了我們在系統設計中認知、表達與落地之間的張力。 &#x1f5…

Debian10安裝Mysql5.7.44 筆記250707

Debian10安裝Mysql5.7.44 筆記250707 1?? 參考 1 在Debian 10 (Buster) 上安裝 MySQL 5.7.44 的步驟如下&#xff1a; 1. 添加 MySQL APT 倉庫 MySQL 官方提供了包含特定版本的倉庫&#xff1a; # 下載倉庫配置包 wget https://dev.mysql.com/get/mysql-apt-config_0.8.28…