当前位置: 首页 > news >正文

实战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 应用能标准化地调用外部工具和服务。

以前的做法:

// 每个工具都要手动写@Tool("查询天气")publicStringgetWeather(Stringcity){returnweatherService.query(city);}

有了 MCP 之后:

// 接入 MCP Server,工具自动注册McpClientmcpClient=DefaultMcpClient.builder().transport(newStdioMcpTransport("npx","-y","@modelcontextprotocol/server-filesystem","/path")).build();

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


集成实战

1. 引入依赖

Maven 加一下就行:

<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-mcp</artifactId><version>1.0.0-beta5</version></dependency>

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

2. 选择传输协议

MCP 支持三种传输方式:

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

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

3. 核心代码

// 1. 创建 MCP ClientMcpClientmcpClient=DefaultMcpClient.builder().transport(newStdioMcpTransport("npx","-y","@modelcontextprotocol/server-filesystem",System.getProperty("user.home"))).build();// 2. 创建 ToolProviderToolProvidertoolProvider=McpToolProvider.builder().mcpClients(mcpClient).build();// 3. 注入到 AI 服务Assistantassistant=AiServices.builder(Assistant.class).toolProvider(toolProvider).chatLanguageModel(OpenAiChatModel.withApiKey("sk-...")).build();// 4. 直接使用Stringresult=assistant.chat("列出当前目录下的文件");

接口定义也很简洁:

interfaceAssistant{Stringchat(Stringmessage);}

4. 多个 MCP Server 怎么办?

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

McpClientfilesystem=DefaultMcpClient.builder().transport(newStdioMcpTransport("npx","-y","@modelcontextprotocol/server-filesystem","/tmp")).key("filesystem").build();McpClientgithub=DefaultMcpClient.builder().transport(newHttpMcpTransport(URI.create("http://localhost:8080/mcp"))).key("github").build();ToolProvidertoolProvider=McpToolProvider.builder().mcpClients(filesystem,github).build();

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

5. 工具过滤

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

// 只暴露指定名称的工具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,配起来也很方便:

@ConfigurationpublicclassMcpConfiguration{@BeanpublicToolProvidertoolProvider(){McpClientmcpClient=DefaultMcpClient.builder().transport(newStdioMcpTransport("npx","-y","@modelcontextprotocol/server-filesystem","/path/to/directory")).build();returnMcpToolProvider.builder().mcpClients(mcpClient).build();}@BeanpublicAssistantassistant(ToolProvidertoolProvider){returnAiServices.builder(Assistant.class).toolProvider(toolProvider).chatLanguageModel(openAiChatModel()).build();}}

几个坑

1. 超时问题

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

DefaultMcpClient.builder().initializationTimeout(Duration.ofSeconds(30)).toolExecutionTimeout(Duration.ofMinutes(2)).build();

2. 异常处理

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

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

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

3. 资源管理

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

try(McpClientclient=builder.build()){// 使用 client}

或者在 Spring 里用@PreDestroy销毁。


常用 MCP Server 推荐

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

Server用途启动命令
server-filesystem文件系统操作npx -y @modelcontextprotocol/server-filesystem /path
server-memory内存存储/缓存npx -y @modelcontextprotocol/server-memory
server-githubGitHub APInpx -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

http://www.jsqmd.com/news/548366/

相关文章:

  • nli-distilroberta-base算法优化:利用LSTM思想增强序列上下文建模
  • 终极指南:如何用jcifs-ng快速实现Java SMB客户端开发
  • MusePublic Art Studio惊艳效果:动态种子演化生成同主题12张连贯艺术组图
  • 第二十四篇:【硬件工程师筑基系列 5-3】PCB 布局核心规则与实战 | 布局定生死,新手也能做出高性能布局
  • Qwen3-Embedding-4B代码实战:用Python快速验证向量生成
  • 收藏!小白程序员必备:从零入门大模型,抢占职场新风口(含学习资源包)
  • SillyTavern角色系统全面解析:打造个性化AI交互体验
  • 百考通:AI赋能让学术研究起步更高效
  • 别再空谈概念了!用ESP32和TensorFlow Lite,手把手教你做个能“思考”的智能垃圾桶(附完整代码)
  • MATLAB六自由度齿轮弯扭耦合动力学代码:含时变啮合刚度、齿侧间隙的振动分析与数值计算
  • FindSomething浏览器插件:3步实现网页敏感信息自动检测
  • mPLUG-Owl3-2B多模态交互工具效果展示:高精度图像理解+自然语言问答真实案例
  • SDMatte在智能硬件配套:嵌入式设备端Web服务裁剪、ARM64交叉编译与内存精简
  • SourceTree克隆失败:如何快速解决无效源路径/URL问题
  • claude code 使用
  • 自动控制原理胡寿松第七版课后习题答案详解完整版
  • 告别OOM!在若依后台用ExportUtil分页导出百万数据到Excel的实战配置
  • GIL-Free Python并发仅剩最后1%难题:我们用37小时逆向分析PyO3内存模型,找到共享引用计数的终极解法
  • OpenClaw+GLM-4.7-Flash:个人自动化助手从零搭建指南
  • 快速体验PyTorch:Universal-Dev-v1.0镜像开箱即用全流程解析
  • Global Mapper转换DSM的投影坐标系
  • 华硕笔记本色彩配置文件一键恢复:G-Helper完整解决方案指南
  • FastAPI 2.0异步流式响应全链路解析:从SSE到Server-Sent Events+Chunked Transfer,如何零延迟推送大模型输出?
  • SEER‘S EYE赋能内容安全审核:Transformer架构的文本风险识别
  • MapReduce 分析
  • 【STM32入门踩坑记录】0、问题汇总(持续更新)
  • 大模型实战 07 额外篇] 从 ReAct 到 Workflow:基于云端 API 构建事件驱动的智能体
  • LFM2.5-1.2B-Thinking-GGUF环境配置避坑指南:解决Python依赖冲突与CUDA版本问题
  • 读2025世界前沿技术发展报告25机载系统
  • 靠谱GEO解决方案企业:优质合作参考