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

张开发
2026/4/26 9:29:04 15 分钟阅读

分享文章

实战LangChain4j集成MCP Server:让Java AI应用具备工具调用能力
实战LangChain4j集成MCP Server让Java AI应用具备工具调用能力说实话我之前一直觉得 Java 在 AI 领域的生态不如 Python 。直到最近在项目里真正用上了 LangChain4j 集成 MCP发现这玩意儿是真的香。今天把踩坑过程记录一下希望能帮到同样在 Java 生态里折腾 AI 应用的同学。踩坑背景最近在做一个智能客服系统需要 AI 能调用内部的各种 API。之前的方案是用 LangChain4j 的 Tool 注解自己写工具但维护起来太痛苦了——每次新增一个工具就要改代码。直到我发现了 MCPModel Context Protocol这个玩意儿。它本质上就是一个让 AI 和外部工具交互的协议而 LangChain4j 居然已经支持了MCP 是什么为什么要用它MCP 是 Anthropic提出的一个协议简单说就是让 AI 应用能标准化地调用外部工具和服务。以前的做法// 每个工具都要手动写Tool(查询天气)publicStringgetWeather(Stringcity){returnweatherService.query(city);}有了 MCP 之后// 接入 MCP Server工具自动注册McpClientmcpClientDefaultMcpClient.builder().transport(newStdioMcpTransport(npx,-y,modelcontextprotocol/server-filesystem,/path)).build();工具变成了可插拔的新增工具只需要部署一个新的 MCP Server代码基本不用动。集成实战1. 引入依赖Maven 加一下就行dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-mcp/artifactIdversion1.0.0-beta5/version/dependency版本要注意目前是 beta5API 可能还会有变化。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 ClientMcpClientmcpClientDefaultMcpClient.builder().transport(newStdioMcpTransport(npx,-y,modelcontextprotocol/server-filesystem,System.getProperty(user.home))).build();// 2. 创建 ToolProviderToolProvidertoolProviderMcpToolProvider.builder().mcpClients(mcpClient).build();// 3. 注入到 AI 服务AssistantassistantAiServices.builder(Assistant.class).toolProvider(toolProvider).chatLanguageModel(OpenAiChatModel.withApiKey(sk-...)).build();// 4. 直接使用Stringresultassistant.chat(列出当前目录下的文件);接口定义也很简洁interfaceAssistant{Stringchat(Stringmessage);}4. 多个 MCP Server 怎么办项目中往往需要同时连接多个 MCP Server比如文件系统、GitHub API、数据库等。LangChain4j 支持得很好McpClientfilesystemDefaultMcpClient.builder().transport(newStdioMcpTransport(npx,-y,modelcontextprotocol/server-filesystem,/tmp)).key(filesystem).build();McpClientgithubDefaultMcpClient.builder().transport(newHttpMcpTransport(URI.create(http://localhost:8080/mcp))).key(github).build();ToolProvidertoolProviderMcpToolProvider.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(){McpClientmcpClientDefaultMcpClient.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(McpClientclientbuilder.build()){// 使用 client}或者在 Spring 里用PreDestroy销毁。常用 MCP Server 推荐目前用下来这几个比较实用Server用途启动命令server-filesystem文件系统操作npx -y modelcontextprotocol/server-filesystem /pathserver-memory内存存储/缓存npx -y modelcontextprotocol/server-memoryserver-githubGitHub APInpx -y modelcontextprotocol/server-githubserver-brave-search搜索工具npx -y modelcontextprotocol/server-brave-search写在最后用了一段时间下来LangChain4j MCP 这个组合确实香。最大的感受是工具变成了可插拔的不用每个工具都写一遍 Tool 注解和实现代码。当然目前版本还是 betaAPI 可能会变生产环境使用要留意版本更新。如果也在 Java 里做 AI 应用强烈建议试试这个方案。有问题欢迎评论区交流。实测环境LangChain4j 1.0.0-beta5OpenAI GPT-4oSpring Boot 3.x

更多文章