构建 Java MCP stdio 服务端
LangChain4j 提供用于连接 MCP 服务端的 MCP 客户端(langchain4j-mcp)。
如果你要构建基于 Java 的 MCP stdio 服务端(由 MCP 客户端启动的本地子进程),
请使用社区模块:langchain4j-community-mcp-server。
本指南展示如何通过 stdio,以 MCP(JSON-RPC)暴露现有 @Tool 注解方法的最小配置。
添加依赖
添加 BOM(推荐):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>${latest version here}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-bom</artifactId>
<version>${latest version here}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后添加社区 MCP 服务端依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-mcp-server</artifactId>
</dependency>
实现工具
使用 @Tool 暴露你的功能:
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
class Calculator {
@Tool
long add(@P("a") long a, @P("b") long b) {
return a + b;
}
}
启动 stdio 服务端
import dev.langchain4j.community.mcp.server.McpServer;
import dev.langchain4j.community.mcp.server.transport.StdioMcpServerTransport;
import dev.langchain4j.mcp.protocol.McpImplementation;
import java.util.List;
public class McpServerMain {
public static void main(String[] args) throws Exception {
McpImplementation serverInfo = new McpImplementation();
serverInfo.setName("my-java-mcp-server");
serverInfo.setVersion("1.0.0");
McpServer server = new McpServer(List.of(new Calculator()), serverInfo);
new StdioMcpServerTransport(System.in, System.out, server);
// Keep the process alive while stdio is open
Thread.currentThread().join();
}
}
警告
StdioMcpServerTransport 会将 JSON-RPC 协议写入 System.out。
请确保将日志配置为写入 System.err(否则会破坏协议流,导致客户端断开连接)。
打包为可运行 JAR
MCP 客户端(例如 Claude Desktop)通常期望启动一个本地服务端进程。 将服务端打包为可运行(fat)JAR 是常见做法,但 任何可运行进程都可以。
配置 MCP 客户端
Claude Desktop
在 claude_desktop_config.json 中添加服务端条目:
{
"mcpServers": {
"my-java-tool": {
"command": "java",
"args": ["-jar", "/absolute/path/to/my-java-mcp-server.jar"]
}
}
}
请使用绝对路径;在 Windows 上需要对反斜杠进行转义。