聊聊langchain4j的MCP

本文主要研究一下langchain4j对Model Context Protocol (MCP) 的支持

MCP

MCP协议规定了两种传输方式:

  • HTTP:客户端请求一个SSE(Server-Sent Events)通道以从服务器接收事件,然后通过HTTP POST请求发送命令。这种方式适用于需要跨网络通信的场景,通常用于分布式系统或需要高并发的场景。
  • stdio:客户端可以将MCP服务器作为本地子进程运行,并通过标准输入/输出直接与其通信。这种方式适用于本地集成和命令行工具,适合简单的本地批处理任务。

如果需要让ChatModel或AI service运行由MCP服务器提供的工具,则需要创建一个MCP tool provider

McpToolProvider

McpTransport

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();

对于HTTP方式则如下:

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();

McpClient

McpClient mcpClient = new DefaultMcpClient.Builder()
    .transport(transport)
    .logMessageHandler(new MyLogMessageHandler())
    .build();

基于McpTransport创建McpClient,可以指定logMessageHandler来打印相关信息,可以通过client.listResources()、client.listResourceTemplates()来返回MCP的resources

provider

ToolProvider toolProvider = McpToolProvider.builder()
    .mcpClients(List.of(mcpClient))
    .build();

基于McpClient来创建McpToolProvider

AiService

Bot bot = AiServices.builder(Bot.class)
    .chatLanguageModel(model)
    .toolProvider(toolProvider)
    .build();

AiServices.builder提供了方法来设置toolProvider

示例

public static void main(String[] args) throws Exception {

    ChatLanguageModel model = OpenAiChatModel.builder()
        .apiKey(System.getenv("OPENAI_API_KEY"))
        .modelName("gpt-4o-mini")
        .logRequests(true)
        .logResponses(true)
        .build();

    McpTransport transport = new StdioMcpTransport.Builder()
        .command(List.of("/usr/local/bin/docker", "run", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "-i", "mcp/github"))
        .logEvents(true)
        .build();

    McpClient mcpClient = new DefaultMcpClient.Builder()
        .transport(transport)
        .build();

    ToolProvider toolProvider = McpToolProvider.builder()
        .mcpClients(List.of(mcpClient))
        .build();

    Bot bot = AiServices.builder(Bot.class)
        .chatLanguageModel(model)
        .toolProvider(toolProvider)
        .build();

    try {
        String response = bot.chat("Summarize the last 3 commits of the LangChain4j GitHub repository");
        System.out.println("RESPONSE: " + response);
    } finally {
        mcpClient.close();
    }
}

这里使用stdio的方式来连接docker部署的GitHub MCP server,通过chat告诉LLM去总结LangChain4j这个github仓库最近的3个commits

返回结果示例如下:

Here are the summaries of the last three commits in the LangChain4j GitHub repository:

1. **Commit [36951f9](https://github.com/langchain4j/langchain4j/commit/36951f9649c1beacd8b9fc2d910a2e23223e0d93)** (Date: 2025-02-05)
   - **Author:** Dmytro Liubarskyi
   - **Message:** Updated to `upload-pages-artifact@v3`.
   - **Details:** This commit updates the GitHub Action used for uploading pages artifacts to version 3.

2. **Commit [6fcd19f](https://github.com/langchain4j/langchain4j/commit/6fcd19f50c8393729a0878d6125b0bb1967ac055)** (Date: 2025-02-05)
   - **Author:** Dmytro Liubarskyi
   - **Message:** Updated to `checkout@v4`, `deploy-pages@v4`, and `upload-pages-artifact@v4`.
   - **Details:** This commit updates multiple GitHub Actions to their version 4.

3. **Commit [2e74049](https://github.com/langchain4j/langchain4j/commit/2e740495d2aa0f16ef1c05cfcc76f91aef6f6599)** (Date: 2025-02-05)
   - **Author:** Dmytro Liubarskyi
   - **Message:** Updated to `setup-node@v4` and `configure-pages@v4`.
   - **Details:** This commit updates the `setup-node` and `configure-pages` GitHub Actions to version 4.

All commits were made by the same author, Dmytro Liubarskyi, on the same day, focusing on updating various GitHub Actions to newer versions.

源码

ToolProvider

langchain4j/src/main/java/dev/langchain4j/service/tool/ToolProvider.java

@FunctionalInterface
public interface ToolProvider {

    /**
     * Provides tools for the request to the LLM.
     *
     * @param request {@link ToolProviderRequest} contains {@link UserMessage} and chat memory id (see {@link MemoryId}).
     * @return {@link ToolProviderResult} contains tools that should be included in the request to the LLM.
     */
    ToolProviderResult provideTools(ToolProviderRequest request);
}

langchain4j定义了ToolProvider接口,每次调用AI服务时,它都会被调用,并为该次调用提供相应的工具,其provideTools返回ToolProviderResult

McpToolProvider

public class McpToolProvider implements ToolProvider {

    private final List<McpClient> mcpClients;
    private final boolean failIfOneServerFails;
    private static final Logger log = LoggerFactory.getLogger(McpToolProvider.class);

    private McpToolProvider(Builder builder) {
        this.mcpClients = new ArrayList<>(builder.mcpClients);
        this.failIfOneServerFails = Utils.getOrDefault(builder.failIfOneServerFails, false);
    }

    @Override
    public ToolProviderResult provideTools(final ToolProviderRequest request) {
        ToolProviderResult.Builder builder = ToolProviderResult.builder();
        for (McpClient mcpClient : mcpClients) {
            try {
                List<ToolSpecification> toolSpecifications = mcpClient.listTools();
                for (ToolSpecification toolSpecification : toolSpecifications) {
                    builder.add(
                            toolSpecification, (executionRequest, memoryId) -> mcpClient.executeTool(executionRequest));
                }
            } catch (Exception e) {
                if (failIfOneServerFails) {
                    throw new RuntimeException("Failed to retrieve tools from MCP server", e);
                } else {
                    log.warn("Failed to retrieve tools from MCP server", e);
                }
            }
        }
        return builder.build();
    }

    //......
}    

McpToolProvider要求构造器传入McpToolProvider.Builder,provideTools会遍历mcpClients,之后遍历mcpClient.listTools(),构建每个tool对应的executor(mcpClient.executeTool(executionRequest))

小结

langchain4j提供了langchain4j-mcp模块来支持MCP协议,它通过McpToolProvider来实现ToolProvider接口,以tool的方式来对接mcp。

doc

### 关于LangChain4j与MCP的集成 LangChain4j 是一个专门为 Java 开发者设计的框架,旨在简化大型语言模型 (LLM) 的集成过程[^1]。该框架提供了多种工具和抽象层,使得开发者可以更轻松地将 LLM 功能嵌入到他们的应用程序中。对于希望利用多云平台 (Multi-Cloud Platform, MCP) 提供的服务并结合 LangChain4j 来开发智能应用的企业来说,理解两者的集成方法至关重要。 #### 1. **LangChain4j 的核心能力** LangChain4j 主要通过提供统一 API 抽象以及丰富的工具箱来支持 LLM 的快速集成[^2]。这使其成为一种灵活的选择,尤其适合那些已经在使用 Java 生态系统的团队。以下是其主要特点: - 支持主流的大语言模型(如 GPT、ChatGLM 等)。 - 提供 ChatLanguageModel 和 StreamingChatLanguageModel 接口以适应不同的应用场景需求[^3]。 - 友好的 Spring Boot Starter 集成模式,便于配置和初始化[^4]。 #### 2. **MCP 平台概述** 多云平台通常指代企业级解决方案,允许用户跨多个云计算提供商管理资源和服务。这种架构的优势在于提高灵活性、降低成本以及增强数据安全性。如果计划在 MCP 上部署基于 LangChain4j 构建的应用,则需考虑以下几个方面: ##### a. 多环境适配 由于 MCP 涵盖不同供应商的技术栈,因此可能需要调整 LangChain4j 的依赖项或扩展模块以兼容特定云端服务的要求。例如,在某些情况下,您可能需要用自定义实现替换默认的语言模型客户端。 ##### b. 数据存储优化 许多 MCP 解决方案都内置了分布式数据库或者对象存储选项。为了充分利用这些优势,建议采用 LangChain4j 中的数据持久化机制并与目标存储系统对接。比如可以通过 JDBC 或 RESTful APIs 实现无缝连接。 ##### c. 容器编排支持 现代 MCP 往往依托 Kubernetes 这样的容器编排引擎运行工作负载。在这种环境下部署 LangChain4j 应用时,请确保遵循最佳实践,包括合理设置资源配置参数、启用健康检查探针等操作。 #### 3. **具体集成步骤** 下面给出一段简单的代码片段演示如何开始使用 langchain4j-spring-boot-starter 创建基础项目结构,并初步探索与外部服务协同工作的可能性: ```java // Maven dependency example for LangChain4j with Spring Boot starter <dependency> <groupId>com.langchain4j</groupId> <artifactId>langchain4j-openai-spring-boot-starter</artifactId> <version>{latest-version}</version> </dependency> @SpringBootApplication public class LangChainApp { @Autowired private LanguageModel languageModel; public static void main(String[] args){ SpringApplication.run(LangChainApp.class,args); String response = this.languageModel.generate("Tell me about LangChain4j and its capabilities."); System.out.println(response); } } ``` 上述例子展示了如何加载 OpenAI 的预训练模型并通过调用 `generate` 方法生成回复内容。实际生产环境中还需要进一步完善错误处理逻辑以及其他必要的业务功能。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值