MCP Java SDK源碼分析

MCP Java SDK源碼分析

一、引言

在當今人工智能飛速發展的時代,大型語言模型(LLMs)如GPT - 4、Claude等展現出了強大的語言理解和生成能力。然而,這些模型面臨著一個核心限制,即無法直接訪問外部世界的數據和工具。Model Context Protocol(MCP)作為一個專為大型語言模型設計的開放協議,應運而生,它提供了一個標準化的接口,使LLMs能夠調用外部工具和函數、訪問實時或特定領域的數據以及執行復雜的任務流程。而MCP的Java SDK則為Java開發者提供了一套完整的解決方案,使他們能夠快速構建安全、可擴展的AI應用。

二、MCP概述

2.1 MCP協議核心概念

MCP協議圍繞三個核心功能構建:

  • 工具(Tools):可被LLM調用的函數,通常需要用戶批準。例如,發送電子郵件、查詢數據庫或控制智能家居設備等。這些工具為LLM提供了與外部世界交互的能力,使其能夠完成更復雜的任務。
  • 資源(Resources):可被客戶端讀取的類文件數據,如API響應、文件內容或數據庫查詢結果。資源的管理使得LLM能夠獲取到所需的外部信息,從而更好地完成任務。
  • 提示詞(Prompts):幫助用戶完成特定任務的預設模板,可以指導LLM生成更符合特定需求的回答。合理的提示詞能夠引導LLM輸出更準確、更有用的結果。

2.2 MCP的重要性

在MCP出現之前,開發者通常需要使用自定義的、非標準化的方法來實現AI與外部系統的交互,這導致了集成復雜、維護困難、兼容性差等問題。MCP通過定義統一的協議標準,極大地簡化了這一過程,使得不同的AI組件(如模型推理服務、工具插件)能夠無縫協作。它就像AI應用程序的USB - C端口,為AI模型連接到不同數據源和工具提供了標準化的方式。

三、MCP Java SDK簡介

3.1 發展歷程

MCP Java SDK最初是一個實驗性項目,如今已經發展為與Spring AI團隊和Anthropic的正式合作成果。它是繼Python、TypeScript和Kotlin SDK之后,協議支持的最新語言綁定。Java作為企業級開發的主流語言,MCP Java SDK的出現使企業更容易開發前沿的AI應用。

3.2 功能特性

  • 客戶端與服務端實現:支持同步和異步的MCP通信,能夠適應不同的應用場景。例如,在對響應時間要求較高的場景下可以使用同步通信,而在需要處理大量并發請求的場景下則可以使用異步通信。
  • 協議版本兼容性協商:實現良好的互操作性,確保不同版本的客戶端和服務器之間能夠正常通信。在實際應用中,隨著系統的不斷升級和更新,協議版本的兼容性協商功能能夠保證系統的穩定性和可靠性。
  • 工具與資源管理:可動態發現、注冊并執行工具,實時接收工具和資源列表的變更通知。通過URI模板管理資源,實現結構化訪問和訂閱。這使得開發者可以方便地管理和使用各種工具和資源,提高開發效率。
  • Prompt處理與AI采樣:支持獲取并管理Prompt,以定制AI模型的行為。支持多種采樣策略,優化AI交互效果。不同的采樣策略可以根據具體的應用場景和需求進行選擇,從而提高AI模型的性能。
  • 多種傳輸實現
    • 基于Stdio的傳輸:用于直接進程通信,適用于本地部署的MCP服務器,可以在同一臺機器上啟動MCP服務器進程,與客戶端無縫對接,避免了額外的網絡通信開銷。
    • 基于Java HttpClient的SSE客戶端傳輸:用于基于HTTP的流式通信,能夠實現實時的數據傳輸。
    • 基于Servlet的SSE服務端傳輸:適用于傳統服務器環境的HTTP流式傳輸。
    • 基于Spring的傳輸方式:便于與Spring Boot集成,包括基于Spring WebFlux的SSE傳輸,適用于響應式應用;基于Spring WebMVC的SSE傳輸,適用于基于servlet的應用。

四、MCP Java SDK架構分析

4.1 整體架構

MCP Java SDK遵循分層架構,具有清晰的關注點分離,主要分為客戶端/服務器層、會話層和傳輸層。

MCP的Java SDK架構圖

4.1.1 客戶端/服務器層
  • McpClient:處理客戶端操作,負責和MCP服務器建立連接并進行通信。它能自動匹配服務器的協議版本,確認可用功能,并負責數據傳輸和JSON - RPC交互。此外,它還能發現和使用各種工具、管理資源,并與提示系統進行交互。除了核心功能外,MCP客戶端還支持一些額外特性,比如根管理、采樣控制,以及同步或異步操作。為了適應不同場景,它提供了多種數據傳輸方式,包括標準輸入/輸出、基于Java HttpClient和WebFlux的SSE傳輸。
  • McpServer:管理服務器端協議操作,為客戶端提供各種工具、資源和功能支持。它負責處理客戶端的請求,包括解析協議、提供工具、管理資源以及處理各種交互信息。同時,它還能記錄日志、發送通知,并且支持多個客戶端同時連接,保證高效的通信和協作。它可以通過多種方式進行數據傳輸,比如標準輸入/輸出、Servlet、WebFlux和WebMVC,滿足不同應用場景的需求。
4.1.2 會話層(McpSession)

通過DefaultMcpSession實現管理通信模式和狀態。會話層負責維護客戶端和服務器之間的通信狀態,確保通信的穩定性和可靠性。例如,它可以處理連接超時、重試邏輯等問題。

4.1.3 傳輸層(McpTransport)

處理JSON - RPC消息序列化和反序列化,支持多種傳輸實現。核心模塊中的StdioTransport通過標準輸入/輸出進行通信;專用傳輸模塊中的HTTP SSE傳輸則包括基于Java HttpClient、Spring WebFlux和Spring WebMVC的實現。傳輸層的作用是將客戶端和服務器之間的消息進行序列化和反序列化,以便在不同的網絡環境中進行傳輸。

4.2 關鍵接口分析

  • McpTransport:定義消息發送和連接關閉的方法。它是傳輸層的核心接口,不同的傳輸實現都需要實現該接口,以確保消息能夠正確地發送和接收。
  • McpServerTransportProvider:服務器端傳輸提供者,負責創建和管理傳輸。它為服務器端提供了傳輸層的支持,使得服務器能夠根據不同的需求選擇合適的傳輸方式。
  • McpClientSession:客戶端會話接口,管理通信狀態。它負責維護客戶端和服務器之間的會話狀態,確保通信的連續性和穩定性。
  • McpClient和McpServer:分別提供客戶端和服務器的同步和異步API。這些API為開發者提供了方便的編程接口,使得他們可以輕松地實現客戶端和服務器的功能。

五、MCP Java SDK源碼關鍵部分分析

5.1 McpClient接口源碼

public interface McpClient {// 通過ClientMcpTransport創建一個同步client。static SyncSpec sync(ClientMcpTransport transport) {return new SyncSpec(transport);}// 創建一異步clientstatic AsyncSpec async(ClientMcpTransport transport) {return new AsyncSpec(transport);}/*** 同步客戶端規范,使用建造者模式,提供流式API設置自定義配置,主要配置如下;*  1. 客戶端與服務器之間的傳輸層*  2. 請求超時時間*  3. 客戶端功能協商*  4. 客戶端版本實現跟蹤*  5. 資源訪問限制*  6. 工具、資源、提示詞變更處理*/class SyncSpec {// 里面細節不在分析,主要完成以上6個方面內容public McpSyncClient build() {McpClientFeatures.Sync syncFeatures = new McpClientFeatures.Sync(this.clientInfo, this.capabilities,this.roots, this.toolsChangeConsumers, this.resourcesChangeConsumers, this.promptsChangeConsumers,this.loggingConsumers, this.samplingHandler);McpClientFeatures.Async asyncFeatures = McpClientFeatures.Async.fromSync(syncFeatures);return new McpSyncClient(new McpAsyncClient(transport, this.requestTimeout, asyncFeatures));}}/*** 異步客戶端規范,同 同步客戶端*/class AsyncSpec {}
}

從源碼中可以看出,McpClient接口提供了創建同步和異步客戶端的方法。同步客戶端規范類SyncSpec使用建造者模式,允許開發者通過流式API設置自定義配置,包括傳輸層、請求超時時間、功能協商等。最終通過build方法創建出McpSyncClient實例,而McpSyncClient底層本質上使用的還是McpAsyncClient。

5.2 McpAsyncClient核心依賴分析

McpAsyncClient核心依賴于DefaultMcpSession類,該類主要負責管理客戶端和服務器之間雙向JSON - RPC通信。DefaultMcpSession類通過維護通信狀態、處理消息的序列化和反序列化等操作,確保客戶端和服務器之間的通信能夠正常進行。

5.3 McpServer源碼分析

5.3.1 核心功能概述

McpServer是MCP架構中的基礎組件,負責為客戶端提供工具、資源和功能,實現服務器端的協議操作。它的主要職責包括暴露客戶端可以發現和執行的工具、管理基于URI的資源訪問模式、提供提示模板并處理提示請求、支持與客戶端的能力協商、管理并發客戶端連接以及提供結構化日志和通知等。

5.3.2 工具注冊與構建

McpServer提供了同步和異步的API來創建服務器實例。以下是同步服務器注冊工具的示例代碼:

// 同步服務器注冊工具
McpServer.sync(transportProvider).serverInfo("server-name","1.0.0").tools(new McpServerFeatures.SyncToolSpecification(new McpSchema.Tool("tool-name","tool description", jsonSchema),(exchange, request) -> {// 工具實現邏輯return new CallToolResult(/* 結果數據 */);})).build();

從代碼中可以看出,通過McpServer.sync(transportProvider)方法可以創建一個同步服務器的構建器。serverInfo方法用于設置服務器的名稱和版本信息。tools方法用于注冊工具,它接受一個SyncToolSpecification對象,該對象包含了工具的元數據(如工具名稱、描述、JSON模式)和工具的實現邏輯。最后,調用build方法完成服務器的構建。

5.3.3 服務器能力協商

McpServer支持與客戶端進行能力協商,以確定雙方支持的功能和協議版本。在服務器初始化時,會與客戶端交換版本信息和支持的功能,確保雙方能夠兼容。例如,服務器可以通過設置capabilities方法來聲明自己支持的功能:

McpSyncServer syncServer = McpServer.sync(transportProvider).serverInfo("server-name","1.0.0").capabilities(McpSchema.ServerCapabilities.builder().tools(true)//.resources(true,true)//.prompts(true).logging().build()).build();

在上述代碼中,通過capabilities方法設置了服務器的能力,如支持工具調用、資源管理、提示處理和日志記錄等。

5.4 transport包下關鍵類分析

5.4.1 StdioTransport

StdioTransport是傳輸層的核心實現之一,它通過標準輸入輸出進行通信,無需網絡。這種傳輸方式非常適合本地進程間的通信,例如客戶端可以將MCP服務器作為本地子進程運行,并通過標準輸入/輸出直接與其通信。以下是創建StdioTransport的示例代碼:

McpTransport transport = new StdioMcpTransport.Builder().command(List.of("/usr/bin/npm", "exec", "@modelcontextprotocol/server-everything@0.6.2")).logEvents(true) // only if you want to see the traffic in the log.build();

從代碼中可以看出,通過StdioMcpTransport.Builder可以創建一個StdioTransport的實例。command方法用于設置要執行的命令,logEvents方法用于開啟日志記錄,方便調試和監控。

5.4.2 HttpClientTransport

HttpClientTransport是基于Java HttpClient的HTTP SSE客戶端傳輸實現。它適用于需要跨網絡通信的場景,通常用于分布式系統或需要高并發的場景。客戶端可以請求一個SSE(Server - Sent Events)通道以從服務器接收事件,然后通過HTTP POST請求發送命令。以下是創建HttpClientTransport的示例代碼:

McpTransport transport = new HttpMcpTransport.Builder().sseUrl("http://localhost:3001/sse").logRequests(true) // if you want to see the traffic in the log.logResponses(true).build();

在上述代碼中,通過HttpMcpTransport.Builder創建HttpClientTransport實例。sseUrl方法用于設置SSE的URL地址,logRequestslogResponses方法用于開啟請求和響應的日志記錄。

5.4.3 SpringWebFluxTransport

SpringWebFluxTransport是響應式HTTP服務的傳輸實現,需要Spring WebFlux依賴。它適用于構建響應式的MCP服務器和客戶端,能夠處理高并發的請求。例如,在Spring Boot項目中,可以使用SpringWebFluxTransport來實現基于WebFlux的SSE傳輸。以下是WebFluxSseServerTransportProvider的部分源碼分析:

@Bean
public WebFluxSseServerTransportProvider customerTransportProvider(ObjectMapper objectMapper) {return new WebFluxSseServerTransportProvider(objectMapper,"/customer/mcp/message",  // HTTP消息端點"/customer/mcp/sse"       // Server - Sent Events端點);
}public WebFluxSseServerTransportProvider(ObjectMapper objectMapper, String baseUrl, String messageEndpoint,String sseEndpoint) {Assert.notNull(objectMapper, "ObjectMapper must not be null");Assert.notNull(baseUrl, "Message base path must not be null");Assert.notNull(messageEndpoint, "Message endpoint must not be null");Assert.notNull(sseEndpoint, "SSE endpoint must not be null");this.objectMapper = objectMapper;this.baseUrl = baseUrl;this.messageEndpoint = messageEndpoint;this.sseEndpoint = sseEndpoint;this.routerFunction = RouterFunctions.route().GET(this.sseEndpoint, this::handleSseConnection).POST(this.messageEndpoint, this::handleMessage).build();
}

從代碼中可以看出,WebFluxSseServerTransportProvider用于創建基于WebFlux的SSE傳輸提供者。它通過RouterFunctions定義了處理SSE連接和HTTP消息的路由規則。handleSseConnection方法用于處理SSE連接,handleMessage方法用于處理HTTP消息。

六、MCP Java SDK應用場景

6.1 企業級應用集成

企業在構建復雜的業務邏輯時,可能需要將AI能力集成到現有的Java應用程序中,例如進行智能數據分析、預測等。MCP Java SDK可以幫助企業將內部的業務系統通過標準MCP形式發布為AI Agent能夠接入的工具,實現AI與現有業務系統的無縫集成。

6.2 云計算服務

云服務提供商可以使用MCP Java SDK來提供基于AI的服務,如機器學習模型部署、在線推理等。通過MCP協議,云服務可以與不同的AI模型和數據源進行交互,為用戶提供更強大的AI服務。

6.3 移動和Web應用程序

開發人員可以借助SDK在移動和Web應用中實現語音識別、圖像處理等AI功能。MCP Java SDK的多種傳輸實現和靈活的通信模式使得它能夠適應移動和Web應用的不同網絡環境和性能要求。

6.4 物聯網(IoT)

在IoT場景下,Java SDK可以幫助設備與云端AI服務進行交互,實現智能決策和控制。例如,通過MCP協議,物聯網設備可以調用云端的AI模型進行數據分析和預測,從而實現智能化的管理和控制。

七、總結與展望

7.1 總結

MCP的Java SDK為Java開發者提供了一個強大的工具,使得他們能夠輕松地將AI能力集成到Java應用程序中。通過標準化的接口和分層架構,SDK實現了AI模型與外部工具和數據源的無縫集成,提高了開發效率和系統的可維護性。其豐富的功能特性和多種傳輸實現,能夠滿足不同應用場景的需求。

7.2 展望

隨著人工智能技術的不斷發展,MCP協議和其Java SDK也將不斷完善和擴展。未來,我們可以期待看到更多的工具和資源集成到MCP生態系統中,為開發者提供更多的選擇和便利。同時,SDK的性能和穩定性也將進一步提高,以適應更復雜和大規模的應用場景。此外,MCP與其他技術的融合也將成為一個重要的發展方向,例如與區塊鏈技術結合,實現更加安全和可信的AI交互。## 五、MCP Java SDK源碼關鍵部分分析(續)

綜上所述,McpServer和transport包下的這些關鍵類在MCP Java SDK中起著重要的作用,它們共同實現了MCP協議的服務器端功能和消息傳輸功能,為Java開發者提供了強大的工具來構建與AI模型交互的應用程序。"

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

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

相關文章

[Linux]內核如何對信號進行捕捉

要理解Linux中內核如何對信號進行捕捉,我們需要很多前置知識的理解: 內核態和用戶態的區別CPU指令集權限內核態和用戶態之間的切換 由于文章的側重點不同,上面這些知識我會在這篇文章盡量詳細提及,更詳細內容還得請大家查看這篇…

設計模式-觀察者模式、命令模式

觀察者模式Observer(觀察者)—對象行為型模式定義:定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一主題對象,在它的狀態發生變化時,會通知所有的觀察者.先將 Observer A B C 注冊到 Observable ,那么當 Observable 狀態…

【Unity筆記01】基于單例模式的簡單UI框架

單例模式的UIManagerusing System.Collections; using System.Collections.Generic; using UnityEngine;public class UIManager {private static UIManager _instance;public Dictionary<string, string> pathDict;public Dictionary<string, GameObject> prefab…

深入解析 OPC UA:工業自動化與物聯網的關鍵技術

在當今快速發展的工業自動化和物聯網&#xff08;IoT&#xff09;領域&#xff0c;數據的無縫交換和集成變得至關重要。OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;作為一種開放的、跨平臺的工業通信協議&#xff0c;正在成為這一領域的…

MCP 協議的未來發展趨勢與學習路徑

MCP 協議的未來發展趨勢 6.1 MCP 技術演進與更新 MCP 協議正在快速發展&#xff0c;不斷引入新的功能和改進。根據 2025 年 3 月 26 日發布的協議規范&#xff0c;MCP 的最新版本已經引入了多項重要更新&#xff1a; 1.HTTP Transport 正式轉正&#xff1a;引入 Streamable …

硬件嵌入式學習路線大總結(一):C語言與linux。內功心法——從入門到精通,徹底打通你的任督二脈!

嵌入式工程師學習路線大總結&#xff08;一&#xff09; 引言&#xff1a;C語言——嵌入式領域的“屠龍寶刀”&#xff01; 兄弟們&#xff0c;如果你想在嵌入式領域闖出一片天地&#xff0c;C語言就是你手里那把最鋒利的“屠龍寶刀”&#xff01;它不像Python那樣優雅&#xf…

MCP server資源網站去哪找?國內MCP服務合集平臺有哪些?

在人工智能飛速發展的今天&#xff0c;AI模型與外部世界的交互變得愈發重要。一個好的工具不僅能提升開發效率&#xff0c;還能激發更多的創意。今天&#xff0c;我要給大家介紹一個寶藏平臺——AIbase&#xff08;<https://mcp.aibase.cn/>&#xff09;&#xff0c;一個…

修改Spatial-MLLM項目,使其專注于無人機航拍視頻的空間理解

修改Spatial-MLLM項目&#xff0c;使其專注于無人機航拍視頻的空間理解。以下是修改方案和關鍵代碼實現&#xff1a; 修改思路 輸入處理&#xff1a;將原項目的視頻文本輸入改為單一無人機航拍視頻/圖像輸入問題生成&#xff1a;自動生成空間理解相關的問題&#xff08;無需用戶…

攻防世界-Reverse-insanity

知識點 1.ELF文件逆向 2.IDApro的使用 3.strings的使用 步驟 方法一&#xff1a;IDA 使用exeinfo打開&#xff0c;發現是32位ELF文件&#xff0c;然后用ida32打開。 找到main函數&#xff0c;然后F5反編譯&#xff0c;得到flag。 tip&#xff1a;該程序是根據隨機函數生成…

【openp2p】 學習1:P2PApp和優秀的go跨平臺項目

P2PApp下面給出一個基于 RESTful 風格的 P2PApp 管理方案示例,供二次開發或 API 對接參考。核心思路就是把每個 P2PApp 當成一個可創建、查詢、修改、啟動/停止、刪除的資源來管理。 一、P2PApp 資源模型 P2PApp:id: string # 唯一標識name: string # …

邊緣設備上部署模型的限制之一——顯存占用:模型的參數量只是冰山一角

邊緣設備上部署模型的限制之一——顯存占用&#xff1a;模型的參數量只是冰山一角 在邊緣設備上部署深度學習模型已成為趨勢&#xff0c;但資源限制是其核心挑戰之一。其中&#xff0c;顯存&#xff08;或更廣義的內存&#xff09;占用是開發者們必須仔細考量的重要因素。許多…

腦機新手指南(二十一)基于 Brainstorm 的 MEG/EEG 數據分析(上篇)

一、腦機接口與神經電生理技術概述 腦機接口&#xff08;Brain-Computer Interface, BCI&#xff09;是一種在大腦與外部設備之間建立直接通信通道的技術&#xff0c;它通過采集和分析大腦信號來實現對設備的控制或信息的輸出。神經電生理信號作為腦機接口的重要數據來源&…

[Linux]內核態與用戶態詳解

內核態和用戶態是針對CPU狀態的描述。在內核態可以執行一切特權代碼&#xff0c;在用戶態只能執行那些受限級別的代碼。如果需要調用特權代碼需要進行內核態切換。 一、內核態和用戶態概況 內核態&#xff1a; 系統中既有操作系統的程序&#xff0c;也有普通用戶程序。為了安…

如何查看每個磁盤都安裝了哪些軟件或程序并卸載?

步驟如下&#xff1a; 1、點擊電腦桌面左下角&#xff1a; 2、選擇【應用和功能】 3、點擊下拉框&#xff0c;選擇想要查看的磁盤&#xff0c;下方顯示的就是所有C磁盤下安裝的軟件和程序 卸載方法&#xff1a; 點擊對應的應用&#xff0c;然后點擊卸載即可&#xff1a;

記錄一次莫名奇妙的跨域502(badgateway)錯誤

這里圖片加載不了&#xff0c;原文請訪問&#xff1a;原文鏈接 公司的項目&#xff0c;這幾天添加了一個統計功能&#xff0c; 本地測試沒太大問題&#xff0c;上線后有一個問題&#xff0c;具體現象描述如下&#xff1a; 統計首頁接口大約有5-6個&#xff0c;也就是同時需要…

Linux之線程

Linux之線程 線程之形線程接口線程安全互斥鎖條件變量&信號量生產者與消費者模型線程池 線程之形 進程是資源分配的基本單位&#xff0c;而線程是進程內部的一個執行單元&#xff0c;也是 CPU 調度的基本單位。 線程之間共享進程地址空間、文件描述符與信號處理&#xff0…

snail-job的oracle sql(oracle 11g)

官網版本的oracle sql中有自增主鍵&#xff0c;oracle 11g并不支持&#xff0c;所以改成新建索引和觸發器的方式自增主鍵。&#xff08;tip&#xff1a;snail-job的最新版本1.0.0必須使用JDK17&#xff0c; jdk8會報錯&#xff0c;所以最后沒用起來&#xff09; /*SnailJob Dat…

Windows VMWare Centos Docker部署Nginx并配置對Springboot應用的訪問代理

前置博文 Windows VMWare Centos環境下安裝Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot應用https://blog.csdn.net/u013224722/article/details/148958480 # 將已存在的容器設置為宿主機重啟后…

暑期數據結構第一天

暑期數據結構第一天 數據元素與數據對象 數據元素--組成數據的基本單位 與數據的關系&#xff1a;是集合的個體 數據對象--性質相同的數據元素的集合 與數據的關系&#xff1a;集合的子集 邏輯結構 &#xff08;1&#xff09;線性結構&#xff0c;所有結點都最多有一個直…

vsCode 擴展中 package.nls.json 文件的作用國際化支持

package.nls.json 代表英文語言文件 {"command.favourite.addtofavourite": "Add to Favourite","command.favourite.deletefavourite": "Remove from Favourite","command.favourite.moveup": "Move Up" } 在 …