一、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 协议的工具(无论这些工具是用什么语言编写的)。

它主要包含两个核心部分:

  1. MCP 客户端:用于连接到一个或多个 MCP 服务器。

  2. 与 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 服务器已经作为一个独立的服务运行(例如,一个部署在云上提供数据库访问能力的服务),或者你希望工具服务器与客户端分离。

Logo

更多推荐