🚀 Java Class Analyzer MCP Server
Java Class Analyzer MCP Serverは、Model Context Protocol (MCP)に基づくJavaクラス分析サービスです。このサービスは、Mavenプロジェクトの依存関係をスキャンし、Javaクラスファイルを逆コンパイルし、classメソッドのリストなどの詳細情報を取得し、LLMに提供してコード分析を行うことができます。
🚀 クイックスタート
適用シーン
CursorなどのAIツールは、二方(内部呼び出し)や三方パッケージ(外部呼び出し)のインターフェースを直接生成することができますが、AIは現在のプロジェクトで開かれていない依存ソースコードを読み取ることができないため、生成されたコードには多くのエラーが発生し、場合によっては幻覚的なコーディングが行われることがあります。
この問題を解決するために、一般的にはソースコードの内容を直接LLMに与えるか、ソースコードファイルを現在のプロジェクトに配置してから会話で参照することが行われます。
一方、ローカルでの逆コンパイルMCP方式が最も効果的で、jarパッケージ内のクラスとメソッドを正確に解析し、コード生成の精度と可用性を大幅に向上させることができます。
✨ 主な機能
- 🚀使いやすい: mcpサービスはTypeScriptで実装され、npmでパッケージ化されているため、配布とインストールが容易で、環境依存性が低いです。
- 🔍 依存関係のスキャン: Mavenプロジェクトのすべての依存JARパッケージを自動的にスキャンします。
- 📦 クラスインデックス: クラスの完全名からJARパッケージのパスへのマッピングインデックスを作成します。
- 🔄 逆コンパイル: CFRツール(内蔵済み)を使用して、.classファイルをリアルタイムでJavaソースコードに逆コンパイルします。
- 📊 クラス分析: Javaクラスの構造、メソッド、フィールド、継承関係などを分析します。
- 💾 スマートキャッシュ: 逆コンパイル結果をパッケージ名の構造に従ってキャッシュし、キャッシュ制御をサポートします。
- 🚀 自動インデックス作成: 分析を実行する前に、自動的にインデックスをチェックして作成します。
- ⚙️ 柔軟な設定: 外部からCFRツールのパスを指定することができます。
- 🤖 LLM統合: MCPプロトコルを通じて、LLMにJavaコード分析機能を提供します。
💻 使用例
基本的な使用法
IDEでmcpサービスを登録する
エージェントの会話でmcpを使用する
📦 インストール
mcpサービスのインストール
グローバルインストール(推奨)
npm install -g java-class-analyzer-mcp-server
インストール後は、java-class-analyzer-mcp コマンドを直接使用できます。
ローカルインストール
npm install java-class-analyzer-mcp-server
ソースコードからインストール
git clone https://github.com/handsomestWei/java-class-analyzer-mcp-server.git
cd java-class-analyzer-mcp-server
npm install
npm run build
MCPサービスの設定
方法1:生成された設定を使用する(推奨)
以下のコマンドを実行して設定テンプレートを生成します。
java-class-analyzer-mcp config -o mcp-client-config.json
生成された設定内容をMCPクライアントの設定ファイルに追加します。
方法2:手動で設定する
以下の設定例を参考に、MCPクライアントの設定ファイルに追加します。
グローバルインストール後の設定
{
"mcpServers": {
"java-class-analyzer": {
"command": "java-class-analyzer-mcp",
"args": ["start"],
"env": {
"NODE_ENV": "production",
"MAVEN_REPO": "D:/maven/repository",
"JAVA_HOME": "C:/Program Files/Java/jdk-11"
}
}
}
}
ローカルインストール後の設定
{
"mcpServers": {
"java-class-analyzer": {
"command": "node",
"args": [
"node_modules/java-class-analyzer-mcp-server/dist/index.js"
],
"env": {
"NODE_ENV": "production",
"MAVEN_REPO": "D:/maven/repository",
"JAVA_HOME": "C:/Program Files/Java/jdk-11"
}
}
}
}
パラメータの説明
command: MCPサーバーを実行するコマンドで、ここでは node を使用します。
args: Node.jsに渡すパラメータで、npm run build でコンパイルされたdistフォルダ内のファイルを指します。
env: 環境変数の設定です。
環境変数の説明
NODE_ENV: 実行環境の識別子です。
production: 本番環境で、ログ出力を減らし、パフォーマンス最適化を有効にします。
development: 開発環境で、詳細なデバッグ情報を出力します。
test: テスト環境です。
MAVEN_REPO: Mavenのローカルリポジトリのパス(オプション)です。
- 設定すると、プログラムは指定されたリポジトリパスを使用してJARパッケージをスキャンします。
- 設定しない場合、プログラムはデフォルトの
~/.m2/repository パスを使用します。
JAVA_HOME: Javaのインストールパス(オプション)です。
- 設定すると、プログラムは
${JAVA_HOME}/bin/java を使用してJavaコマンドを実行します(CFR逆コンパイル用)。
- 設定しない場合、プログラムはPATH内の
java コマンドを使用します。
CFR_PATH: CFR逆コンパイルツールのパス(オプション、プログラムが自動的に検索します)。
利用可能なツール
1. scan_dependencies
Mavenプロジェクトのすべての依存関係をスキャンし、クラス名からJARパッケージへのマッピングインデックスを作成します。
パラメータ
projectPath (string): Mavenプロジェクトのルートディレクトリのパス
forceRefresh (boolean, オプション): インデックスを強制的に更新するかどうか。デフォルトはfalseです。
使用例
{
"name": "scan_dependencies",
"arguments": {
"projectPath": "/path/to/your/maven/project",
"forceRefresh": false
}
}
2. decompile_class
指定されたJavaクラスファイルを逆コンパイルし、Javaソースコードを返します。
パラメータ
className (string): 逆コンパイルするJavaクラスの完全名。例: com.example.QueryBizOrderDO
projectPath (string): Mavenプロジェクトのルートディレクトリのパス
useCache (boolean, オプション): キャッシュを使用するかどうか。デフォルトはtrueです。毎回の再生成を避けます。
cfrPath (string, オプション): CFR逆コンパイルツールのjarパッケージのパス。内蔵済みですが、別のバージョンを指定することもできます。
使用例
{
"name": "decompile_class",
"arguments": {
"className": "com.example.QueryBizOrderDO",
"projectPath": "/path/to/your/maven/project",
"useCache": true,
"cfrPath": "/path/to/cfr-0.152.jar"
}
}
3. analyze_class
Javaクラスの構造、メソッド、フィールドなどの情報を分析します。
パラメータ
className (string): 分析するJavaクラスの完全名
projectPath (string): Mavenプロジェクトのルートディレクトリのパス
使用例
{
"name": "analyze_class",
"arguments": {
"className": "com.example.QueryBizOrderDO",
"projectPath": "/path/to/your/maven/project"
}
}
キャッシュファイル
現在のプロジェクトでは、以下のキャッシュディレクトリとファイルが生成されます。
.mcp-class-index.json: クラスインデックスのキャッシュファイル
.mcp-decompile-cache/: 逆コンパイル結果のキャッシュディレクトリ(パッケージ名の構造に従って)
.mcp-class-temp/: 一時ファイルのディレクトリ(パッケージ名の構造に従って)
📚 ドキュメント
ワークフロー
- 自動インデックス作成: 初めて
analyze_class または decompile_class を呼び出すときに、自動的にインデックスをチェックして作成します。
- スマートキャッシュ: 逆コンパイル結果をパッケージ名の構造に従ってキャッシュし、キャッシュ制御をサポートします。
- クラス分析:
analyze_class または decompile_class を使用して、クラスの詳細情報を取得します。
- LLM分析: 逆コンパイルされたソースコードをLLMに提供して、コード分析を行います。
🔧 技術詳細
コアコンポーネント
- DependencyScanner: Mavenの依存関係をスキャンし、クラスインデックスを作成する責任があります。
- DecompilerService: .classファイルを逆コンパイルする責任があります。
- JavaClassAnalyzer: Javaクラスの構造を分析する責任があります。
- MCP Server: 標準化されたMCPインターフェースを提供します。
依存関係のスキャンフロー
mvn dependency:tree を実行して依存関係ツリーを取得します。
- 各JARパッケージを解析し、すべての.classファイルを抽出します。
- "クラスの完全名 -> JARパッケージのパス" のマッピングインデックスを作成します。
- インデックスを
.mcp-class-index.json ファイルにキャッシュします。
逆コンパイルフロー
- クラス名に基づいて対応するJARパッケージのパスを検索します。
- キャッシュをチェックし、キャッシュが存在し、キャッシュが有効になっている場合は直接返します。
- JARパッケージから.classファイルを
.mcp-class-temp ディレクトリに抽出します(パッケージ名の構造に従って)。
- CFRツールを使用して、.classファイルを逆コンパイルします。
- 逆コンパイル結果を
.mcp-decompile-cache ディレクトリに保存します(パッケージ名の構造に従って)。
- Javaソースコードを返します。
トラブルシューティング
一般的な問題
-
Mavenコマンドが失敗する
- Mavenがインストールされ、PATHに含まれていることを確認してください。
- プロジェクトに有効なpom.xmlファイルがあることを確認してください。
-
CFR逆コンパイルが失敗する
- CFR jarパッケージがダウンロードされていることを確認してください(任意のバージョン番号をサポートします)。
- Java環境が正しく構成されていることを確認してください。
cfrPath パラメータでCFRのパスを指定することができます。
-
クラスが見つからない
- プログラムは自動的にインデックスをチェックして作成します。
- クラス名が正しいことを確認してください。
- プロジェクトの依存関係が正しく解析されていることを確認してください。
テストに関する説明
プロジェクトのビルド
npm install
npm run build
テストツールの使用
このプロジェクトには独立したテストツールが用意されており、MCPクライアントを介さずにMCPサービスの各機能を直接テストすることができます。
node test-tools.js
node test-tools.js --tool decompile_class --class com.alibaba.excel.EasyExcelFactory --project /path/to/project
node test-tools.js --tool decompile_class --no-cache
node test-tools.js --tool decompile_class --cfr-path /path/to/cfr.jar
テストツールのパラメータ
-t, --tool <ツール名>: テストするツールを指定します (scan|decompile|analyze|all)
-p, --project <パス>: プロジェクトのパス
-c, --class <クラス名>: 分析するクラス名
--no-refresh: 依存関係のインデックスを強制的に更新しません。
--no-cache: 逆コンパイルのキャッシュを使用しません。
--cfr-path <パス>: CFR逆コンパイルツールのjarパッケージのパスを指定します。
-h, --help: ヘルプ情報を表示します。
ログレベルの制御
NODE_ENV 環境変数を使用して、ログ出力を制御します。
development: 詳細なデバッグ情報を出力します。
production: 重要な情報のみを出力します。