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遵循分層架構,具有清晰的關注點分離,主要分為客戶端/服務器層、會話層和傳輸層。
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地址,logRequests
和logResponses
方法用于開啟請求和響應的日志記錄。
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模型交互的應用程序。"