跳到主要内容

Java MCP サーバーの構築

LangChain4j は MCP サーバーに接続するための MCP クライアント(langchain4j-mcp)を提供します。 Java ベースの MCP stdio サーバー(MCP クライアントが起動するローカルサブプロセス)を構築したい場合は、 コミュニティモジュール langchain4j-community-mcp-server を使用してください。

このガイドでは、既存の @Tool アノテーション付きメソッドを stdio 経由で MCP(JSON-RPC)として公開する最小構成を示します。 サーバーをネットワーク経由でアクセス可能なスタンドアロンサービスとして実行する場合は、Streamable HTTP サーバーを参照してください。

依存関係の追加​

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;
}
}

MCP ツールのパラメータ名は Java メソッドのパラメータ名から取得されます。 プロジェクトを -parameters javac オプション付きでコンパイルしてください。そうしないと、MCP クライアントには arg0、arg1 のような汎用的な名前が表示されます:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
</plugins>
</build>

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 クライアントの設定​

.mcp.json​

多くの MCP クライアントは、サーバー定義を .mcp.json ファイルから読み込みます:

{
"mcpServers": {
"my-java-tool": {
"type": "stdio",
"command": "java",
"args": ["-jar", "/absolute/path/to/my-java-mcp-server.jar"]
}
}
}

Claude Desktop​

claude_desktop_config.json にサーバーエントリを追加します:

{
"mcpServers": {
"my-java-tool": {
"command": "java",
"args": ["-jar", "/absolute/path/to/my-java-mcp-server.jar"]
}
}
}

絶対パスを使用してください。Windows ではバックスラッシュをエスケープします。

Streamable HTTP サーバー​

stdio トランスポートは、1 プロセスにつき 1 つのローカルクライアントのみに対応します。 MCP サーバーをスタンドアロンサービスとして実行し、複数の(ローカルまたはリモートの)クライアントで共有したい場合は、 Streamable HTTP トランスポートを使用してください。 langchain4j-community-mcp-server はこれを提供していませんが、次の Java ライブラリが提供しています(アルファベット順):

ライブラリ説明
Helidon MCPHelidon アプリケーション向けの MCP サーバーサポート
MCP Java SDKModel Context Protocol の公式 Java SDK。特定のフレームワークに依存しません
Micronaut MCPMicronaut アプリケーション向けの MCP サーバーサポート
Quarkus MCP ServerQuarkus アプリケーション向けの MCP サーバーサポート
TachyonJava および Kotlin 向けの MCP サーバーライブラリ

これらは独立したプロジェクトであり、LangChain4j チームによってメンテナンスされているものではありません。 セットアップ、セキュリティ(認証、TLS)、デプロイについては、それぞれのドキュメントを参照してください。

サーバーが起動したら、MCP クライアントをそのエンドポイント URL に向けます。たとえば .mcp.json では次のようにします:

{
"mcpServers": {
"my-java-tool": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}
}

Claude Desktop はローカルプロセスのみを起動するため、 mcp-remote を使って Streamable HTTP サーバーに接続します:

{
"mcpServers": {
"my-java-tool": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://localhost:8080/mcp"]
}
}
}