实战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