手搓MCP客戶端動態調用多MCP服務,調用哪個你說了算!

01 引言

前兩天,有個粉絲朋友咨詢MCP服務如何動態調用,動態加載MCP服務的鏈接?我們都知道MCP客戶端可以配置多個MCP服務的地址:

spring.ai.mcp.client.sse.connections.server1.url=http://localhost:xxxx
spring.ai.mcp.client.sse.connections.server2.url=http://localhost:xxxx
spring.ai.mcp.client.sse.connections.server3.url=http://localhost:xxxx

這樣的MCP服務會自動加載到項目中,類似合成一個服務。一個請求進來,MCP客戶端會在所有的服務中尋找合適的方法。

但是,業務中總會有各種不同的場景。例如,粉絲朋友的需求。SpringBoot一直堅持約定大于配置的方式,Spring AI也不例外,既然提供配置文件的配置,那么JavaBean的配置一樣可行。指定調用只要需要找到調用的時機,自然可以控制。

本篇就帶大家一起解決這份粉絲朋友的問題。

02 MCP動態調用

2.1 代碼追蹤

在研究動態調用之前,我們需要知道配置用在了哪里?

我們直接在.properties.yml配置文件中,

按住Ctrl,然后用鼠標點擊url,就會跳轉到下面的文件:

從方法中可以看到:

最終的配置會保存在SseParameters中,最后放到Map集合中。使用或者獲取服務鏈接的時候,肯定也會通過getConnections()來獲取,這個也是突破問題的關鍵。

2.2 探尋使用位置

上面找到了配置文件對用的Java類:

org.springframework.ai.mcp.client.autoconfigure.properties.McpSseClientProperties

我們可以采用上面相同的方法,看看哪里調用了getConnections(),由于我們的源碼沒有全部下載下來,所以很大程度上可能找不到。所以,斷點提示就變成了我們唯一的出路。

斷點啟動之后,我們看到連接數為0,也就是還沒有加載MCP服務的鏈接呢。如下圖:

我們斷點繼續向下執行(快捷鍵:F8),中間會經歷漫長的Bean的創建過程。我們的目標就是看看是哪一個Bean實例化的時候會獲取連接。

我們就需要注意幾個注解:@Bean@Component等,終于實例化出來了,找到了關鍵類:

org.springframework.ai.mcp.client.autoconfigure.McpClientAutoConfiguration

具體如圖:

我們可以看到namedTransports里面就包含了我們MCP服務,最終放到mcpSyncClients集合中,如下圖:

至此,Spring 啟動隨后完成。

2.3 修改點

我們可以看到mcpSyncClients集合上有@Bean標簽,所以會被Spring管理,所以可以直接從Spring容器中,通過注入的方式獲取到。

但是修改點有在哪里呢?我們先看看MCP調用的案例:

從構建ChatClient到發送請求參數,就只有ChatModelToolCallbackProvider兩個參數。而ChatMode表示采用的大模型的類型,顯然和MCP服務沒有關系,就只有ToolCallbackProvider這個類了。

org.springframework.ai.tool.ToolCallbackProvider的實現有四個:

通過注入的ToolCallbackProvider,我們斷點可以看到它的實現是:

org.springframework.ai.mcp.SyncMcpToolCallbackProvider

從代碼的構造啟可以看到,參數就是我們上面注入的mcpSyncClients

2.4 動態調用

我們只要根據MCP服務的名稱區分不同的McpSyncClient即可。

我們從截圖可以看到:

小編提供了兩個MCP服務,分別是csdn-mcp-server(CSDN文章瀏覽服務)和gzh-mcp-server(種種好推薦服務)。小編沒有傳遞參數,默認會調用gzh-mcp-server

我們看看返回的結果:

請求是一個與csdn-mcp-server匹配度比較高的請求,最終只調用了gzh-mcp-server。所以我們就可以控制調用的MCP服務了。

03 動態加載

動態調用的問題,我們已經解決了。如果這些服務鏈接想從數據庫讀取,又該如何處理呢?

最直接的想法,就是直接將配置文件對應的Bean自己new出來交給Spring管理。

3.1 配置McpSseClientProperties

Bean配置

@Bean
public McpSseClientProperties mcpSseClientProperties() {McpSseClientProperties mcpSseClientProperties = new McpSseClientProperties();Map<String, SseParameters> connections = mcpSseClientProperties.getConnections();connections.put("server1", new SseParameters("http://localhost:8080", null));connections.put("server2", new SseParameters("http://localhost:8082", null));return mcpSseClientProperties;
}

啟動結果

McpSseClientProperties發現了2個,實際只需要一個。也就是說,框架自動實例化McpSseClientProperties和我們的沖突了。

這種方式行不通!!!

既然已經存在,那就直接添加連接呢?因為Spring默認是單例。

3.2 動態加載鏈接

容器啟動后加載鏈接

測試

已經加載成功了。

04 小結

到這里粉絲朋友的問題就全部解決了。同時,也分享給大家,希望對大家有幫助!

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

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

相關文章

Go語言中的優雅并發控制:通道信號量模式詳解

在Go語言的并發編程中&#xff0c;“通過通信共享內存”的設計哲學貫穿始終。當面對高并發場景時&#xff0c;無限制創建goroutine可能導致資源耗盡、CPU過載等問題&#xff0c;通道信號量模式&#xff08;Channel Semaphore Pattern&#xff09; 正是一種基于Go通道特性的優雅…

鴻蒙 NEXT開發中輕松實現人臉識別功能

大家好&#xff0c;我是 V 哥。 今天給大家介紹在 HarmonyOS 原生鴻蒙開發中&#xff0c;實現人臉識別功能&#xff0c;這個功能在常用的 APP 開發中上鏡率還是很高的&#xff0c;在傳統的 Android 或 iOS 開發中&#xff0c;通常我們要借助第三方庫來實現&#xff0c;而在鴻蒙…

華為開發者空間訓練營-優秀作品公布

排名標題總分獎品1手把手教你開發一個地區智能查詢MCP&#xff0c;賦能地理位置類MCP服務的“零輸入”無感交互95華為 freebuds 6i 藍牙耳機2基于華為開發者空間云主機DeepSeek助力電商企業AI海報文案驅動的最佳實踐落地 94華為 freebuds 6i 藍牙耳機32小時基于華為開發者空間和…

基于Python與Tkinter開發的微博多功能自動化助手

文章目錄 摘要 1. 背景與意義 2. 需求分析 3. 核心架構設計 3.1. 技術選型 3.2. 核心思想:UI與邏輯分離的異步架構 4. 深度模塊化剖析 4.1. 微博核心API交互模塊 4.2. 健壯性設計:代理與重試機制 4.3. GUI界面模塊 (WeiboApp 類) 4.4. 異步任務處理模塊 5. 難點分析與解決方案…

效果驅動復購!健永科技RFID牛場智能稱重項目落地

近日&#xff0c;北京某養殖企業持續下單電子耳標識讀器&#xff0c;在牛場智能稱重中落地應用&#xff0c;通過自動、準確地識別牛只并記錄體重數據&#xff0c;顯著提升效率和數據精準度&#xff0c;實現了“效果驅動復購”的良性循環。健永科技RFID技術在北京某養殖企業智能…

計算機網絡:2、TCP和UDP

2、TCP和UDP 簡介 TCP(transmission Control Protocol)&#xff1a;是一種通信標準&#xff0c;它使應用程序和計算設備能夠在網絡上交換消息。它的設計目的是在互聯網上發送數據包&#xff0c;并確保數據和信息在網絡上的成功傳遞。UDP(the User Datagram Protocol)&#xf…

WEB安全篇:瀏覽器攻擊原理及防護

1、XSS&#xff1a;跨站腳本攻擊就是攻擊者想盡一切辦法將可以執行的代碼注入到網頁中。攻擊者在web頁面惡意插入HTML或script標簽&#xff0c;當用戶瀏覽該頁面時&#xff0c;惡意代碼就會被執行&#xff0c;從而達到攻擊的目的。XSS利用的是用戶對指定網站的信任。比如&#…

匯編語言學習2---GNU Debugger (GDB)

學習記錄&#xff0c;在匯編語言 &#xff0c;我們面對的是機器碼&#xff08;以匯編指令形式展現&#xff09;&#xff0c;所以斷點要設置在機器碼被加載到內存中的位置。 GEF插件使用 安裝插件wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/pyecho source ~/.gdbinit-g…

談談架構的內容

一、架構的定義架構是一個界定不清的東西&#xff0c;我們很難講清楚哪些東西是架構&#xff0c;哪些東西不是架構。但軟件行業里其實人人都在搞架構&#xff0c;軟件設計就是架構本身。架構這個詞出現得很早&#xff0c;有些人認為是 NASA&#xff08;也可能是NATO&#xff09…

C#文件(夾)讀取相關(完善中。。。)

前言閱讀項目編輯器的代碼時&#xff0c;發現好多與文件&#xff08;夾&#xff09;路徑相關代碼。本來自己之前對路徑相關的東西就模模糊糊&#xff0c;希望通過這篇筆記能讓自己模糊的地方明朗一下。" / " 與 " \ "你是否有過這樣的疑惑&#xff1a;Wind…

FPGA DP1.4 With DSC解決方案

引言&#xff1a;迎接高清高刷時代的顯示挑戰隨著8K分辨率、高刷新率、HDR和更廣色域內容的普及&#xff0c;傳統視頻接口的帶寬正面臨極限。DisplayPort 1.4標準雖提供了高達32.4 Gbps的帶寬&#xff08;HBR3速率&#xff09;&#xff0c;但要無壓縮地傳輸8K60Hz 10bpp HDR視頻…

新手向:Python開發簡易網絡服務器

Python網絡服務器開發指南&#xff1a;從零開始的完整實現網絡服務器基礎概念網絡服務器是互聯網基礎設施的核心組件&#xff0c;它本質上是一個持續運行的程序&#xff0c;負責監聽特定端口&#xff08;如HTTP服務的80端口或HTTPS的443端口&#xff09;&#xff0c;處理來自客…

819 機器學習-決策樹2

一、決策樹的算法信息增益&#xff1a;某個屬性帶來的熵增1、決策樹三大經典算法? ID3 → 信息增益 信息增益&#xff1a;某個屬性帶來的熵增? C4.5 → 信息增益率 信息增益率&#xff1a;信息增益自身熵? CART → 基尼指數&#xff08;分類&#xff09;&#xff1b;平方誤…

Objective-C 版本的 LiveEventBus 效果

想要 Objective-C 版本的 LiveEventBus 效果&#xff08;跨頁面/跨模塊通信&#xff0c;支持粘性和非粘性事件&#xff09;。在 iOS 里對應的就是 NSNotificationCenter&#xff0c;但是它 默認不支持粘性事件&#xff0c;所以如果你想要“粘性”&#xff0c;需要自己封裝一層。…

WindowsAPI|每天了解幾個winAPI接口之網絡配置相關文檔Iphlpapi.h詳細分析七

上一篇&#xff1a;WindowsAPI|每天了解幾個winAPI接口之網絡配置相關文檔Iphlpapi.h詳細分析六 如果有錯誤歡迎指正批評&#xff0c;在此只作為科普和參考。 C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um\iphlpapi.h 文章目錄CreateIpNetEntry&#xff1…

STM32F407VGT6從零建立一個標準庫工程模板+VSCode或Keil5

一、前言 下載平臺:STM32F407ZGT6 代碼使用平臺:VSCode 編譯器:arm-none-aebi-gcc ---- 默認你已經安裝 程序下載工具:STlink ---- 默認你擁有 批處理工具:make ---- 默認你已經安裝 使用此方法可以不借助其它插件&#xff0c;例如:STM32EIDE。這個方法已經經過驗證可以在STM3…

佩京VR黨建工作站-黨建VR系統-VR黨建展廳

VR黨建工作站是一種依托VR虛擬現實技術的數字化黨建文化學習工具。它通過將豐富的學習內容植入到智慧黨建科技產品中&#xff0c;構建出沉浸式的學習場景&#xff0c;從而創新了體驗式學習模式&#xff0c;促進了黨員的自主學習。VR黨建工作站核心功能&#xff1a;1、了解實時新…

Kotlin 協程之Channel的概念和基本使用

前言 在 專欄 之前的文章中&#xff0c;我們已經知道了協程的啟動、掛起、取消、異常以及常用的協程作用域等基礎應用。 這些基礎應用適合的場景是一次性任務&#xff0c;執行完就結束了的場景。 launch / async 適合的場景 網絡請求數據庫查詢文件讀寫并行計算任務等等 而…

安裝使用Conda

文章目錄Linux安裝 Conda&#xff08;Miniconda 或 Anaconda&#xff09;?Miniconda (輕量版)激活配置Windows安裝配置 Conda?添加清華鏡像源加速創建并激活 Conda 環境驗證步驟?安裝項目依賴運行項目Linux安裝 Conda&#xff08;Miniconda 或 Anaconda&#xff09;? Mini…

面向智能空戰的深度強化學習技術綜述

CSDN大禮包《大模型課程》 CSDN大禮包《深度強化學習課程》 CSDN大禮包《人工智能平臺設計開發課程》