Pure Java 21 MCP Server について
Pure Java 21 MCP Serverは、プロトコル実装を調べるJava開発者向けの、独自実装によるMCPサーバーです。MCP専用SDKを使わず、STDIO通信とechoToolを備えています。
主な機能
- 01純粋なJava 21による実装
- 02JSON-RPC 2.0メッセージ処理
- 03STDIOによるメッセージ通信
- 04MCPの初期化と終了処理
- 05echoToolを搭載
活用シーン
- 01JavaでのMCPサーバー実装の学習
- 02STDIO経由のMCP通信のテスト
- 03ツール定義と呼び出し処理の確認
MCP 対応
MCPサーバーの基本的な処理を実装し、STDIOでクライアントのメッセージを受け取り、echoToolを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Pure Java 21 MCP サーバー
このプロジェクトは、純粋な Java 21 で Model Context Protocol(MCP)サーバーを実装したもので、(概念上の)2025-03-26 MCP 仕様に厳密に準拠しています。外部の MCP 専用 SDK を使用せず、一から構築されています。
前提条件
- Java 21 SDK: Java 21 以降がインストールされ、設定されていることを確認してください。
- Gson ライブラリ: このサーバーでは、JSON の解析とシリアライズに Gson ライブラリを使用します。Gson の JAR ファイルをダウンロードする必要があります。
- 通常は Maven Central からダウンロードできます。「Gson」または
com.google.code.gson:gsonを検索してください。JAR(例:gson-2.10.1.jarまたはそれ以降のバージョン)をダウンロードします。 - ダウンロードした Gson JAR(例:
gson-2.10.1.jar)を、プロジェクト内のlibディレクトリ(lib/gson-2.10.1.jar)など、既知の場所に配置してください。以下のコンパイルおよび実行コマンドでは、この場所を前提としています。
- 通常は Maven Central からダウンロードできます。「Gson」または
プロジェクト構成
src/:Java ソースコードが含まれています。main/java/io/modelcontextprotocol/server/:ルートパッケージ。jsonrpc/:JSON-RPC メッセージの構造、解析、エラー処理を行うクラス。messages/:MCP 固有のメッセージペイロード(初期化、ツール定義など)用のクラス。tools/:ツールの実装(例:EchoTool)。transport/:トランスポート層の処理(例:StdioTransport)。McpServer.java:サーバーの中核ロジック。Main.java:アプリケーションのエントリーポイント。
lib/:(推奨)Gson JAR を保存するために、このディレクトリを作成してください。mcp-server.log:サーバーの動作中に生成されるログファイル。.gitignore:Git が無視する、意図的に追跡対象外とするファイルを指定します。README.md:このファイル。
コンパイル
-
ディレクトリを作成します:
- プロジェクトのルートに
libディレクトリがあることを確認し、Gson JAR ファイル(例:gson-2.10.1.jar)を配置してください。 - コンパイル済みクラスファイルを保存するため、プロジェクトのルートに
binディレクトリを作成してください。mkdir lib mkdir bin # Gson JAR をダウンロードして lib/ に配置します # 例:wget https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar -P lib/
- プロジェクトのルートに
-
サーバーをコンパイルします: プロジェクトのルートディレクトリでターミナルまたはコマンドプロンプトを開きます。 Gson のバージョンやパスが異なる場合は、
lib/gson-2.10.1.jarを適宜変更してください。Nix(Linux/macOS):
javac -d bin -cp "lib/gson-2.10.1.jar:src/main/java" $(find src/main/java -name "*.java")Windows(コマンドプロンプト):
javac -d bin -cp "lib\gson-2.10.1.jar;src\main\java" $(powershell -Command "(Get-ChildItem -Recurse -Filter *.java src\main\java | Select-Object -ExpandProperty FullName) -join ';' ")$(powershell ...)コマンドがcmd.exeで直接動作しない場合は、ファイルを手動で列挙するか、別の方法を使用してください。javac -d bin -cp "lib\gson-2.10.1.jar;src\main\java" src\main\java\io\modelcontextprotocol\server\*.java src\main\java\io\modelcontextprotocol\server\jsonrpc\*.java src\main\java\io\modelcontextprotocol\server\messages\*.java src\main\java\io\modelcontextprotocol\server ools\*.java src\main\java\io\modelcontextprotocol\server ransport\*.java(ファイルを手動で列挙する場合は、すべてのパッケージパスが含まれていることを確認してください。)
サーバーの実行
コンパイルが成功したら、プロジェクトのルートディレクトリからサーバーを実行します。
Nix(Linux/macOS):
java -cp "bin:lib/gson-2.10.1.jar" io.modelcontextprotocol.server.Main
Windows(コマンドプロンプト):
java -cp "bin;lib\gson-2.10.1.jar" io.modelcontextprotocol.server.Main
サーバーが起動し、標準入力(STDIO)で JSON-RPC メッセージを待ち受けます。
実装済みの機能
- トランスポート: STDIO(Content-Length ヘッダーでフレーム化されたメッセージ)。
- JSON-RPC: バージョン 2.0 のメッセージの解析とシリアル化。
- MCP コア:
initializeリクエスト:サーバーが自身の機能を応答します。initialized通知:クライアントが初期化を確認します。shutdownリクエスト:サーバーが確認応答し、終了の準備をします。exit通知:サーバーが終了します。
- ツール:
- 基本的な「ツール」機能。
echoToolに対するtool/callリクエスト。echoTool:メッセージをそのまま返すシンプルなツールです。- 入力スキーマ:
{ "type": "object", "properties": { "message": { "type": "string" } } } - 出力スキーマ:
{ "type": "object", "properties": { "response": { "type": "string" } } }
- 入力スキーマ:
- ログ記録: サーバーの動作は
mcp-server.log(FINE レベル以上)とコンソール(INFO レベル以上)に記録されます。
インタラクション例(STDIO 経由)
メッセージは JSON 本文の前に Content-Length と \r\n\r\n を付けてフレーム化されます。
1. クライアント -> サーバー:initialize リクエスト
Content-Length: 123
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"processId":1234,"capabilities":{}}}
(注:processId や capabilities などの params の内容は initialize の例示用であり、現在このサーバーでは無視されます。)
2. サーバー -> クライアント:initialize レスポンス
Content-Length: 297
{"jsonrpc":"2.0","id":1,"result":{"capabilities":{"tools":[{"name":"echoTool","description":"A simple tool that takes a 'message' string and returns it prefixed with 'Echo: '.","inputSchema":{"type":"object","properties":{"message":"string"}},"outputSchema":{"type":"object","properties":{"response":"string"}}}]}}}
(実際の Content-Length は書式の詳細によって異なります。サーバーがこれを計算します。)
3. クライアント -> サーバー:initialized 通知
Content-Length: 40
{"jsonrpc":"2.0","method":"initialized"}
(通知には id がありません。サーバーは応答しません。)
4. クライアント -> サーバー:echoTool に対する tool/call
Content-Length: 107
{"jsonrpc":"2.0","id":2,"method":"tool/call","params":{"toolName":"echoTool","params":{"message":"Hello MCP!"}}}
5. サーバー -> クライアント:tool/result レスポンス
Content-Length: 74
{"jsonrpc":"2.0","id":2,"result":{"response":"Echo: Hello MCP!"}}
6. クライアント -> サーバー:shutdown リクエスト
Content-Length: 49
{"jsonrpc":"2.0","id":3,"method":"shutdown","params":{}}
7. サーバー -> クライアント:shutdown レスポンス
Content-Length: 34
{"jsonrpc":"2.0","id":3,"result":null}
8. クライアント -> サーバー:exit 通知
Content-Length: 36
{"jsonrpc":"2.0","method":"exit","params":{}}
(その後、サーバーは終了します。応答はありません。)
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。