实战LangChain4j集成MCP Server:让Java AI应用具备工具调用能力

实战LangChain4j集成MCP Server:让Java AI应用具备工具调用能力

说实话,我之前一直觉得 Java 在 AI 领域的生态不如 Python 。直到最近在项目里真正用上了 LangChain4j 集成 MCP,发现这玩意儿是真的香。今天把踩坑过程记录一下,希望能帮到同样在 Java 生态里折腾 AI 应用的同学。


踩坑背景

最近在做一个智能客服系统,需要 AI 能调用内部的各种 API。之前的方案是用 LangChain4j 的 Tool 注解自己写工具,但维护起来太痛苦了------每次新增一个工具就要改代码。

直到我发现了 MCP(Model Context Protocol)这个玩意儿。它本质上就是一个让 AI 和外部工具交互的协议,而 LangChain4j 居然已经支持了!


MCP 是什么?为什么要用它?

MCP 是 Anthropic提出的一个协议,简单说就是让 AI 应用能标准化地调用外部工具和服务。

以前的做法:

java 复制代码
// 每个工具都要手动写
@Tool("查询天气")
public String getWeather(String city) {
    return weatherService.query(city);
}

有了 MCP 之后:

java 复制代码
// 接入 MCP Server,工具自动注册
McpClient mcpClient = DefaultMcpClient.builder()
    .transport(new StdioMcpTransport("npx", "-y", 
        "@modelcontextprotocol/server-filesystem", "/path"))
    .build();

工具变成了可插拔的,新增工具只需要部署一个新的 MCP Server,代码基本不用动。


集成实战

1. 引入依赖

Maven 加一下就行:

xml 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-mcp</artifactId>
    <version>1.0.0-beta5</version>
</dependency>

版本要注意,目前是 beta5,API 可能还会有变化。

2. 选择传输协议

MCP 支持三种传输方式:

协议 适用场景 示例
StdioMcpTransport 本地 MCP Server new StdioMcpTransport("npx", "-y", "@modelcontextprotocol/server-filesystem", "/path")
HttpMcpTransport 远程 MCP Server new HttpMcpTransport(URI.create("http://localhost:8080/mcp"))
SseMcpTransport SSE 流式 new SseMcpTransport(URI.create("http://localhost:8080/sse"))

本地开发用 Stdio 比较多,生产环境建议用 Http。

3. 核心代码

java 复制代码
// 1. 创建 MCP Client
McpClient mcpClient = DefaultMcpClient.builder()
    .transport(new StdioMcpTransport(
        "npx", "-y", 
        "@modelcontextprotocol/server-filesystem",
        System.getProperty("user.home")))
    .build();

// 2. 创建 ToolProvider
ToolProvider toolProvider = McpToolProvider.builder()
    .mcpClients(mcpClient)
    .build();

// 3. 注入到 AI 服务
Assistant assistant = AiServices.builder(Assistant.class)
    .toolProvider(toolProvider)
    .chatLanguageModel(OpenAiChatModel.withApiKey("sk-..."))
    .build();

// 4. 直接使用
String result = assistant.chat("列出当前目录下的文件");

接口定义也很简洁:

java 复制代码
interface Assistant {
    String chat(String message);
}

4. 多个 MCP Server 怎么办?

项目中往往需要同时连接多个 MCP Server,比如文件系统、GitHub API、数据库等。LangChain4j 支持得很好:

java 复制代码
McpClient filesystem = DefaultMcpClient.builder()
    .transport(new StdioMcpTransport("npx", "-y", 
        "@modelcontextprotocol/server-filesystem", "/tmp"))
    .key("filesystem")
    .build();

McpClient github = DefaultMcpClient.builder()
    .transport(new HttpMcpTransport(URI.create("http://localhost:8080/mcp")))
    .key("github")
    .build();

ToolProvider toolProvider = McpToolProvider.builder()
    .mcpClients(filesystem, github)
    .build();

工具会自动合并,调用时不会冲突。

5. 工具过滤

有时候不需要暴露所有工具,可以过滤:

java 复制代码
// 只暴露指定名称的工具
McpToolProvider.builder()
    .mcpClients(mcpClient)
    .filterToolNames("tool1", "tool2")
    .build();

// 或者用自定义逻辑
McpToolProvider.builder()
    .mcpClients(mcpClient)
    .filter((client, tool) -> tool.name().startsWith("custom-"))
    .build();

6. Spring Boot 集成

项目里用的是 Spring Boot,配起来也很方便:

java 复制代码
@Configuration
public class McpConfiguration {

    @Bean
    public ToolProvider toolProvider() {
        McpClient mcpClient = DefaultMcpClient.builder()
            .transport(new StdioMcpTransport(
                "npx", "-y",
                "@modelcontextprotocol/server-filesystem",
                "/path/to/directory"))
            .build();

        return McpToolProvider.builder()
            .mcpClients(mcpClient)
            .build();
    }

    @Bean
    public Assistant assistant(ToolProvider toolProvider) {
        return AiServices.builder(Assistant.class)
            .toolProvider(toolProvider)
            .chatLanguageModel(openAiChatModel())
            .build();
    }
}

几个坑

1. 超时问题

MCP Server 有时候响应比较慢,特别是文件操作这种 I/O 密集型的。建议调整超时:

java 复制代码
DefaultMcpClient.builder()
    .initializationTimeout(Duration.ofSeconds(30))
    .toolExecutionTimeout(Duration.ofMinutes(2))
    .build();

2. 异常处理

默认情况下,如果某个 MCP Server 挂了,不会影响其他的:

java 复制代码
McpToolProvider.builder()
    .mcpClients(mcpClient)
    .failIfOneServerFails(false)  // 默认 false,某个失败不影响其他
    .build();

如果想让任何一个失败就直接报错,可以设成 true

3. 资源管理

McpClient 继承了 AutoCloseable,用完记得关:

java 复制代码
try (McpClient client = builder.build()) {
    // 使用 client
}

或者在 Spring 里用 @PreDestroy 销毁。


常用 MCP Server 推荐

目前用下来这几个比较实用:

Server 用途 启动命令
server-filesystem 文件系统操作 npx -y @modelcontextprotocol/server-filesystem /path
server-memory 内存存储/缓存 npx -y @modelcontextprotocol/server-memory
server-github GitHub API npx -y @modelcontextprotocol/server-github
server-brave-search 搜索工具 npx -y @modelcontextprotocol/server-brave-search

写在最后

用了一段时间下来,LangChain4j + MCP 这个组合确实香。最大的感受是:工具变成了可插拔的,不用每个工具都写一遍 Tool 注解和实现代码。

当然目前版本还是 beta,API 可能会变,生产环境使用要留意版本更新。

如果也在 Java 里做 AI 应用,强烈建议试试这个方案。有问题欢迎评论区交流。


实测环境:LangChain4j 1.0.0-beta5,OpenAI GPT-4o,Spring Boot 3.x

相关推荐
IT大白鼠1 天前
AIGC+教育:个性化学习、AI助教、内容生产,教育行业的变革路径
人工智能·学习·aigc
qq_254674411 天前
Alpine Linux 基于 Debian 等系统的常规 Nginx
开发语言
AI医影跨模态组学1 天前
NPJ Precis Oncol(IF=8)哈尔滨医科大学附属肿瘤医院韩鹏等团队:一种可解释的深度学习生物标志物用于胃癌预后评估及辅助化疗获益预测
人工智能·深度学习·论文·医学·医学影像·影像组学
国产化创客1 天前
IoT设备AI智能体ESP-Claw
人工智能·物联网·智能硬件
AI科技1 天前
一键重置重新编曲伴奏创作,妙笔生歌给予原创音乐人写歌更多的试错空间
人工智能
飞Link1 天前
纵向洞察引擎:利用多模态 AI 进行早期儿科风险预测的技术路径探索
人工智能
故事和你911 天前
洛谷-数据结构2-1-二叉堆与树状数组1
开发语言·数据结构·c++·算法·动态规划·图论
@杰克成1 天前
Java学习24
java·学习·idea
挨踢ren1 天前
C++虚函数:从基础到高阶
java·开发语言·jvm
AI学长1 天前
数据集-草莓成熟度分类数据集-3类草莓未熟(白/绿色)、半熟(粉/浅红色)、完熟(深红色)
人工智能·机器学习·图像分类·草莓成熟度分类数据集