langchain4j-(10)-MCP
MCP(Model Context Protocol)是由Anthropic提出的开放协议,旨在标准化大语言模型与外部工具间的通信。它通过统一接口解决了功能集成困难、开发效率低下等问题,使开发者无需为每个工具单独编写集成代码。MCP支持STDIO和SSE两种传输方式,适用于本地脚本集成或远程服务调用。LangChain4j已提供MCP客户端支持,使Java应用能动态发现和使用各类工具,实现跨语言互
一、MCP出现之前的痛点
如果没有类似MCP的技术大模型查询个时间需要对接好多不同的接口,想想就费劲
-
功能集成困难:像联网搜索、发送邮件、发布博客等功能,单个实现难度不大,但要将它们全部集成到一个系统中却非常棘手 。这是因为不同功能背后的服务和技术接口可能差异很大,缺乏统一的标准和方式去整合这些功能,导致开发人员在集成时需要花费大量时间和精力去处理兼容性、数据交互等问题。
-
开发效率低下:以日常开发中的 IDE 为例,若要实现 AI 查询本地数据库、搜索 GitHub Issue 判断问题、通过 AI 发送 PR 意见到即时通讯软件以及查询修改云服务配置等功能,由于没有统一的规范,开发人员需要针对每个功能单独开发复杂的交互逻辑和接口对接,这使得开发周期变长,效率降低。
二、为什么需要MCP
-
提供统一标准:MCP 可以作为一种统一的标准,就像万能接口一样。当其他服务都遵循 MCP 标准时,不同功能和服务之间的交互变得更加规范和有序。开发人员在集成各种功能时,不需要再针对每个服务单独处理接口对接和兼容性问题,大大减少了开发的复杂度和工作量。
-
提升开发效率:统一标准的存在,使得开发人员能够更高效地进行系统开发和功能集成。例如在 IDE 开发场景中,借助 MCP 标准,AI 可以更便捷地与本地数据库、GitHub、即时通讯软件、云服务等进行交互,快速实现多种功能,从而提升整个开发过程的效率,缩短开发周期。
-
促进系统整合:MCP 有助于打破不同功能和服务之间的壁垒,促进各种系统和功能更紧密地整合在一起,实现更强大、更全面的应用系统,满足用户多样化的需求。
三、MCP是什么
MCP 即 Model Context Protocol(模型上下文协议 ), 是一个由 Anthropic 提出的开放协议。它的核心目标是标准化 LLM 与外部工具、数据源(如数据库、API、文件系统)之间的通信方式。
可以把它想象成 LLM 世界的 USB 协议或 驱动程序模型:
-
之前:每个应用(如 Claude Desktop、LangChain)都需要为每个工具(如计算器、数据库)编写特定的集成代码,工作重复且不通用。
-
之后:工具提供商只需编写一个标准的 MCP 服务器(Server)。任何支持 MCP 的客户端(Client)(如 Claude Desktop、LangChain4j)都可以直接连接并使用这些工具,无需重复开发。
MCP用于大模型之间的通讯。
-
统一接口标准:它类似一种万能接口标准。在开发过程中,众多不同的功能和服务,比如联网搜索、发送邮件、查询云服务配置等,背后涉及的技术和接口各不相同,集成起来困难重重。而当这些服务都遵循 MCP 标准时,就能像接入统一的规范接口一样,大大降低集成难度,提升开发效率。
-
助力功能整合:以日常开发的 IDE 为例,若要实现 AI 辅助开发的多种功能,如通过 AI 查询本地数据库数据、搜索 GitHub Issue 判断问题、借助 AI 发送 PR 意见到即时通讯软件等,MCP 可以帮助这些功能更好地整合到一起,让 AI 更顺畅地与不同类型的服务进行交互,实现不同功能模块之间高效的数据传输与协作 。
四、langchain4j对MCP的支持--
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-mcp</artifactId>
</dependency>
langchain4j-mcp
项目让 LangChain4j 具备了 MCP 客户端(Client) 的能力。这意味着:
一个用 Java 编写的 LangChain4j 应用程序,现在可以动态地发现、加载并使用任何遵循 MCP 协议的工具(无论这些工具是用什么语言编写的)。
它主要包含两个核心部分:
-
MCP 客户端:用于连接到一个或多个 MCP 服务器。
-
与 LangChain4j 的集成:将 MCP 服务器提供的工具无缝转换为 LangChain4j 框架内的
Tool
对象,以便智能体(Agent)直接调用。
MCP在技术栈中的位置和作用如下图:
1、主要特性与优势
-
工具无关性:您的 Java 应用不再需要为每个工具添加依赖项和编写集成代码。只需连接到一个提供所需工具的 MCP 服务器即可。
-
语言互操作性:您可以利用由 Python、JavaScript、Rust 等语言编写的强大工具生态,而无需将其重写为 Java。
-
动态性:可以动态地添加或移除 MCP 服务器,从而在运行时改变应用程序可用的工具集。
-
标准化:遵循开放标准,减少供应商锁定风险。
-
简化开发:如果您是工具开发者,只需编写一个 MCP 服务器,您的工具就能被所有支持 MCP 的客户端使用。
2、 简单代码示例
以下是一个如何使用 langchain4j-mcp
连接到一个 MCP 服务器并使用其工具的示例。
假设有一个本地运行的 MCP 服务器,它提供了一个 calculator
工具。
// 1. 创建 MCP 客户端配置,连接到本地服务器
McpClientConfig config = McpClientConfig.builder()
.transport(StdioTransport.builder()
.command("python") // 假设服务器是 Python 脚本
.args(Arrays.asList("/path/to/your/mcp_server.py"))
.build())
.build();
// 2. 创建 MCP 客户端
McpClient client = McpClient.create(config);
// 3. 从客户端获取工具并转换为 LangChain4j 可用的工具
List<ToolSpecification> toolSpecs = client.getToolSpecifications();
List<ChatMemoryProvider> tools = client.getTools(); // 获取可执行工具
// 4. 创建 LangChain4j 智能体,并注入 MCP 工具
OpenAiChatModel model = OpenAiChatModel.withApiKey("your-key");
Agent agent = Agent.builder()
.chatLanguageModel(model)
.tools(tools) // 使用从 MCP 客户端获取的工具
.build();
// 5. 现在可以让 Agent 使用这些工具了!
String answer = agent.execute("请问 123 乘以 456 等于多少?");
System.out.println(answer); // 代理会调用 MCP 服务器的计算器工具并返回结果
五、STDIO and SSE
STDIO 和 SSE 是 MCP 协议中两种主要的传输层(Transport Layer) 方式,它们定义了客户端和服务器之间实际的数据传输机制。
下图直观地展示了这两种通信模式的核心区别:
5.1、 STDIO(标准输入/输出)
这是一种进程间通信(IPC) 的方式,也是最常见、最简单的 MCP 连接模式。
工作原理
-
MCP 客户端作为一个进程,启动 MCP 服务器作为另一个子进程。
-
客户端通过子进程的标准输入(STDIN) 向服务器发送请求(JSON-RPC 消息)。
-
服务器通过标准输出(STDOUT) 向客户端返回响应。
-
服务器的标准错误(STDERR) 通常用于输出日志信息,而非协议通信。
特点
-
紧密耦合:客户端和服务器的生命周期通常绑定在一起。客户端启动服务器,客户端退出时服务器也会被终止。
-
简单直接:无需网络配置,非常适合本地工具集成。
-
高性能:由于是进程间直接通信,延迟通常很低。
-
常用场景:
-
连接到一个用 Python、Node.js 等脚本语言编写的本地工具服务器。
-
在桌面应用程序(如 Claude Desktop)中集成工具。
-
McpClientConfig config = McpClientConfig.builder()
.transport(StdioTransport.builder()
.command("node") // 使用 Node.js 运行时
.args(Arrays.asList("/path/to/mcp-server.js"))
.build())
.build();
5.2、SSE(Server-Sent Events)
SSE 是一种基于 HTTP 的网络通信协议,允许服务器主动向客户端推送数据。
工作原理
-
MCP 服务器作为一个独立的 HTTP 服务器 运行,并暴露一个特定的端点(如
/messages
)。 -
MCP 客户端通过向该端点发送 HTTP POST 请求 来传输请求(JSON-RPC 消息)。
-
服务器通过保持一个长时间的 HTTP 连接,以 SSE 的格式(
data: {json}\n\n
)流式地返回响应。 -
这本质上是一个双向通信:客户端通过 POST 请求体“上行”,服务器通过 SSE 流“下行”。
特点
-
松散耦合:客户端和服务器是独立的进程,甚至可以运行在不同的机器上。它们可以独立启动和停止。
-
基于网络:允许远程连接,扩大了工具服务的范围。
-
单向流:SSE 是服务器到客户端的单向推送,但通过结合 POST 请求实现了双向通信。
-
常用场景:
-
连接到一个已经作为服务运行的远程 MCP 服务器。
-
在微服务架构中,将 MCP 工具服务器部署为独立的服务。
-
需要工具服务器长时间运行并服务多个客户端的情况。
-
McpClientConfig config = McpClientConfig.builder()
.transport(SseTransport.builder()
.url("http://localhost:8000/messages") // MCP 服务器的 SSE 端点
.build())
.build();
5.3、总结对比
特性 |
STDIO |
SSE |
---|---|---|
通信本质 |
进程间通信(IPC) |
网络通信(HTTP) |
耦合度 |
紧耦合(客户端管理服务器进程) |
松耦合(独立进程) |
部署 |
本地,同一台机器 |
可本地,可远程 |
配置复杂度 |
简单,无需网络 |
需配置 URL 和端口 |
生命周期 |
客户端控制服务器生命周期 |
客户端与服务器生命周期独立 |
典型用例 |
本地脚本、桌面应用集成 |
远程工具服务、微服务 |
5.4、如何选择?
-
选择 STDIO:如果你的 MCP 服务器是一个本地脚本或工具,并且由你的应用程序直接启动和管理(例如,一个用于操作本地文件系统的 Python 脚本)。
-
选择 SSE:如果 MCP 服务器已经作为一个独立的服务运行(例如,一个部署在云上提供数据库访问能力的服务),或者你希望工具服务器与客户端分离。
更多推荐
所有评论(0)