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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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" } 在 …