Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Building the Heart of Your Java MCP Client: The MCPService Core

2025年09月18日に「Dev.to」が公開したITニュース「Building the Heart of Your Java MCP Client: The MCPService Core」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

JavaでAIアプリケーションの「心臓部」となる「MCPService」を構築。これは複数のMCPサーバーに接続し、サーバー上の様々なツールを管理・実行できる。天気やファイル操作といった外部サービスを統合し、複雑なAIエージェントの堅牢な基盤を築く。

ITニュース解説

この記事は、Javaベースのインテリジェントアプリケーションを開発するシリーズの第3回として、その中核をなす「MCPService」の構築について解説している。MCPServiceは、Javaアプリケーションが複数の外部サーバーと接続し、それらのサーバーが提供する様々な機能(「ツール」と呼ぶ)を管理し、実行するための中心的な役割を果たす。これは、AIエージェントが外部の機能を利用して複雑なタスクをこなすための重要な土台となる。

MCPServiceクラスは、主にserversclientsという二つのマップを保持する。serversマップは、接続されている外部サーバーに関する情報を管理し、clientsマップは、各サーバーと実際に通信するためのクライアントインスタンスを管理する。これらはどちらもConcurrentHashMapという、複数の処理が同時に実行されても安全にデータを扱える仕組みが使われている。MCPServiceのインスタンスが作成されると、初期設定としてinitializeServersメソッドが自動的に呼び出され、事前に定義されたいくつかの外部サーバーへの接続が試みられる。

記事の例では、天気予報を提供するサーバー、ファイルシステムを操作するサーバー、時刻情報を提供するサーバーの三つへの接続方法が具体的に示されている。これらのサーバーは、Javaアプリケーションが直接実装するのではなく、npx(Node.jsのパッケージを実行するコマンド)やuvx(Pythonのパッケージを実行するコマンド)といった、外部のコマンドを通じて別のプロセスとして起動される。つまり、Javaアプリケーションは司令塔として、これらの外部プロセスを立ち上げ、その機能を利用する構造である。

外部サーバーへの接続処理の核心となるのがcreateClientメソッドだ。このメソッドは、指定されたサーバーIDと、サーバーを起動するためのコマンドを受け取り、そのサーバーと通信するためのMcpSyncClientインスタンスを生成する。Windows OSとUnix系OSではコマンドの実行方法が異なるため、OSの種類に応じてコマンド形式を調整する処理も含まれる(Windowsではcmd.exe /cをコマンドの前に付加するなど)。特に重要なのは、このクライアントがStdioClientTransportという仕組みを使って外部プロセスと通信することだ。これは、Javaアプリケーションと外部プロセスの間で、標準入出力(プログラムが通常、キーボードからの入力や画面への出力を扱う経路)を通じてデータをやり取りするという意味である。クライアントが正常に作成された後、initializeメソッドを呼び出し、MCPプロトコルに基づいた初期通信が行われる。

サーバーに接続が確立されると、次にそのサーバーがどのような機能(ツール)を提供しているかを把握する必要がある。この役割を担うのがloadServerToolsメソッドである。このメソッドは、McpSyncClientlistToolsメソッドを呼び出すことで、サーバーが利用可能なツールのリストを取得する。取得した各ツールに関する情報は、Toolというシンプルなデータ構造に変換され、該当するServerオブジェクトに追加されて管理される。これにより、Javaアプリケーションは、どのサーバーにどのようなツールがあるかを簡単に確認できるようになる。

実際に外部サーバーのツールを実行する際には、callToolメソッドが使われる。このメソッドは、実行したいサーバーのID、ツール名、そしてツールに渡す引数を指定して呼び出される。ツールを実行する前に、指定されたサーバーが存在し、接続状態にあるか、そして指定されたツールが存在するかといった基本的な検証が行われる。これらの検証をクリアした後、McpSyncClientを通じてCallToolRequestがサーバーに送信され、ツールの実行が要求される。ツールの実行結果はCallToolResultとして返され、成功したか、失敗したか、そして出力されたコンテンツなどが含まれる。サーバーから返されるコンテンツは様々な形式であるため、extractContentメソッドは、その中から特にテキスト形式のコンテンツを抽出し、Javaアプリケーションで扱いやすい形に整形する役割を果たす。

MCPServiceでは、管理する情報を整理するためにいくつかのデータ構造が定義されている。Toolは、ツールの名前、説明、そして関連するサーバーIDを保持する不変なデータレコードである。Serverは、サーバーのID、名前、接続状態、そしてそのサーバーが提供するツールのリストを管理するクラスだ。ツールを追加したり、接続状態を変更したりする可能性があるため、こちらはクラスとして実装されている。ToolResultは、ツールの実行結果をまとめて表現するためのレコードであり、成功・失敗のフラグ、実行されたツール、出力コンテンツ、メッセージ、そしてオプションのエラー情報を含む。これらのデータ構造は、複雑な情報を一貫性をもって整理し、扱いやすくするために役立つ。

さらに、MCPServiceには利用を便利にするための補助的なメソッドも用意されている。例えば、getAllAvailableToolsメソッドは、現在接続されている全てのサーバーから利用可能なツールの一覧をまとめて取得できる。isServerConnectedメソッドは特定のサーバーが現在接続中かを確認し、getConnectedServersメソッドは接続中のサーバーのマップを返す。アプリケーションの終了時には、closeメソッドが呼び出され、全ての接続済みサーバーに対してdisconnectServerメソッドを通じて安全に接続を終了し、確保していたリソースを解放する。

記事の最後には、MCPServiceDemoという実際の使用例が示されている。この例では、MCPServiceのインスタンスを作成し、利用可能なツールの一覧を表示した後、具体的に天気サーバーの「get_weather」ツールや、ファイルシステムサーバーの「list_directory」ツールを呼び出している。そして、その実行結果がコンソールに表示され、アプリケーションが終了する際にサービスが適切にクリーンアップされる様子が確認できる。この使用例から、JavaアプリケーションがMCPServiceを通じて、外部の多様な機能とシームレスに連携できることが具体的に理解できる。

このMCPServiceの構築は、Javaアプリケーションが外部のサービスやツールと連携するための堅牢な基盤を提供するものだ。特に、AIエージェントの開発においては、AI自身が直接実行できないような現実世界での情報取得(天気予報の確認)や操作(ファイルの管理)を行うために、外部のツールを呼び出す能力が不可欠となる。今回のMCPServiceは、まさに「AIエージェントが外部ツールを利用するための橋渡し役」を担い、次のステップである大規模言語モデル(LLM)との連携へと繋がっていく重要な一歩である。

関連コンテンツ

関連IT用語