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模型交互的应用程序。"