JVM Source Lens について
JVM Source Lens は、Gradle を使う Java プロジェクト向けの MCP サーバー兼 CLI です。実際のクラスパスを解決し、使用中のバージョンに対応するソース、シグネチャ、構造を調べられます。
主な機能
- 01Gradle クラスパスの解決
- 02クラスと依存関係の検索
- 03クラス構造とシグネチャの確認
- 04ソースとメソッド本体の取得
- 05依存アーティファクト内の検索
活用シーン
- 01不慣れな依存ライブラリの API 確認
- 02プロジェクトで使われるバージョンの確認
- 03オーバーライド実装前のライブラリメソッド調査
MCP 対応
stdio 経由で、クラスパス検索、ソースやシグネチャの取得、依存関係の検索ツールを MCP クライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y jvmsrcJVMSRC_ALLOWED_ROOTSOptional comma-separated absolute paths; only these project roots are allowed.JVMSRC_CACHE_ROOTOptional absolute path for resolution and decompile caches (default: OS cache dir).JVMSRC_LOG_DIROptional absolute path for failure diagnostic logs.JVMSRC_MAX_SOURCE_OUTPUT_CHARSMax characters returned for full-file source (default 524288).JVMSRC_GRADLE_TIMEOUT_MSGradle resolution subprocess timeout in milliseconds.JVMSRC_CFR_PATHOptional path to a custom CFR JAR for decompilation.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
7掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| full | boolean | いいえ | |
| endLine | integer | いいえ | |
| className | string | はい | |
| startLine | integer | いいえ | |
| methodName | string | いいえ | |
| modulePath | string | いいえ | |
| includeTest | boolean | いいえ | |
| methodNames | array | いいえ | |
| projectRoot | string | はい | |
| forceRefresh | boolean | いいえ | |
| configuration | string | いいえ |
詳細
jvmsrc — コーディングエージェントに Java IDE を
問題
Java のコードを書くときには IDE を使います。しかし、コーディングエージェントには IDE がありません。
エージェントが見慣れないライブラリの型、たとえば独自の内部ライブラリにあるスーパークラスに遭遇すると、25 回以上のやり取りを費やして ~/.gradle/caches を探し回り、jar tf で JAR を手作業で開き、推測でそのうちの 1 つを選んで、IDE ならキーを 1 回押すだけで答えられる疑問に答えようとします。つまり、このスーパークラスに X という名前のパブリックなユーティリティメソッドがあるか、という疑問です。
解決策
jvmsrc はビルドツール(Gradle)に問い合わせて、このプロジェクトで解決されたクラスパスを取得し、実際にビルドで使われている正確なバージョンの実際のソース、実際のシグネチャ、実際の構造をエージェントに渡します。
- MCP サーバーとして — Claude Code、Cursor、Windsurf、その他の MCP ホストに接続し、クラスパス専用に設計された 6 つのツールをエージェントに提供します。
jvmsrcCLI として — 同じエンジンを使い、スクリプトで利用でき、パイプにも対応しています。クラスを読むだけなら、単独でも便利です。
Claude Code が jvmsrc を使って HandlerInterceptor のシグネチャを解決。3 回の呼び出しで正確な答えに到達し、キャッシュを探し回る必要はありません。
毎日削減できること
プライベートライブラリがあり、公開 Javadoc がない JVM プロジェクトでは、jvmsrc が作業効率を大きく高めます。
- 「この外部クラスには何があるか」という調査 1 件あたり約 50K トークンを節約 — コストを**約 70%**削減します。
- エージェントのパニックループを毎日 15 回以上回避 — Gradle キャッシュを延々と調べたり、間違った JAR を開いたり、諦めたりする必要はありません。
- 以前は自分で対応するしかなかった、内部 SDK に触れる複雑なタスクを委任できるようになります。
実際の違い
jvmsrc なし(25 回のやり取りにわたる手探り)
ユーザー:
AbstractTradingServiceの監査フックをオーバーライドしたいのですが、再利用できるパブリックなユーティリティメソッドはありますか?エージェント:
- ワークスペースで AbstractTradingService.java を検索 ➔
0 hits- 実行:
find ~/.gradle -name "trading-core*"- 4 つのバージョンを発見:
2.1.0、2.3.0、2.4.1、3.0.0-SNAPSHOT- 推測:
trading-core-2.4.1.jarを選択(実際にプロジェクトで使われているのは3.0.0-SNAPSHOT!)- 間違った JAR に対して
jar tfとjavap -pを実行- [22 回のやり取りの後] 「ユーティリティメソッドは見当たりません。ご自身で実装してください。」
実際は:
3.0.0-SNAPSHOTには、この用途にぴったりのmaskSensitiveFields()という protected ヘルパーが追加されていました。エージェントは幻覚を起こしたのではなく、ただ見えていなかったのです。
jvmsrc あり(3 回のやり取りで即座に解決)
ユーザー:
AbstractTradingServiceの監査フックをオーバーライドしたいのですが、再利用できるパブリックなユーティリティメソッドはありますか?エージェント:
search_classes("AbstractTradingService")➔ FQN と、正確に解決されたライブラリを特定します。get_class_structure(scope: "overview")➔3.0.0-SNAPSHOTにあるmaskSensitiveFields()を見つけます。get_method_signature("maskSensitiveFields")➔ 正確なシグネチャとジェネリクスを取得します。結果: 初回から正しくオーバーライドを記述できます。キャッシュを探し回る必要も、推測も、バージョン違いもありません。
仕組み
- ビルドツールへの問い合わせ:
jvmsrcがアクティブなビルドツール(Gradle など)に問い合わせて、正確に解決されたクラスパス設定を取得します。 - インテリジェントなキャッシュ: 解決されたクラスパスをキャッシュし、ビルドファイルの変更を追跡して最新の状態を保ちます。
- 精密な AI ツール: コード全体を出力する代わりに、コンテキストウィンドウを小さく保ち、トークン使用量を極めて低く抑えるため、精度と粒度の高いツール(シグネチャ、構造、検索)を提供します。
インストールとクイックスタート
1. CLI をインストール
npm install -g jvmsrc
または、npx から直接実行できます:
npx jvmsrc mcp
重要
Node ≥ 20 とPATH上の Java(CFR デコンパイラーとjavap用)が必要です。
2. MCP サーバーを追加
これを AI アシスタントの設定(Cursor、Claude Code、Windsurf など)に貼り付けてから、ホストを再起動してください:
{
"mcpServers": {
"jvmsrc": {
"command": "jvmsrc",
"args": ["mcp"]
}
}
}
任意:jvmsrc config(または jvmsrc config --project /path/to/gradle-project)を実行すると、貼り付け用のブロックと環境に関するヒントが表示されます。ほとんどのユーザーはこの手順を省略し、上記のスニペットをコピーできます。
MCP サーバーのリファレンス
MCP サーバーは jvmsrc mcp を介して stdio で実行されます。デフォルト設定では環境変数は不要です:
{
"mcpServers": {
"jvmsrc": {
"command": "jvmsrc",
"args": ["mcp"]
}
}
}
プライベートリポジトリの認証情報(任意)
Gradle ビルドで、プライベートな Maven/Artifactory/Nexus 系リポジトリ用の認証情報を環境変数で指定する必要がある場合にのみ必要です。MCP ホストは対話型シェルの環境を引き継がないことが多いため、これらの変数は jvmsrc MCP プロセスに設定する必要があります(その後、サーバーを再起動してください)。
以下の REPO_USER/REPO_PASS はサンプル名にすぎません。jvmsrc で必須の変数ではありません。プロジェクトの Gradle スクリプトで指定されている変数名を使用してください:
{
"mcpServers": {
"jvmsrc": {
"command": "jvmsrc",
"args": ["mcp"],
"env": {
"REPO_USER": "your-username",
"REPO_PASS": "your-password"
}
}
}
}
プロジェクトでこれらの変数が不要な場合は、env ブロック全体を省略してください。
エージェントが利用できるツール
| ツール | 機能 |
|---|---|
search_classes | 単純名または glob でクラスを検索し、FQN とライブラリ名の簡潔なリストを返します |
get_class_structure | クラスの概要(目的とメソッド名)または宣言されたシグネチャを取得します |
get_method_signature | パラメーター名とジェネリクスを含む、メソッドの実際のオーバーロードを取得します |
find_in_class_source | 解決済みクラス内を正規表現または部分文字列で検索します |
get_class_source | メソッド本体または行範囲を取得します(最終手段として使用) |
search_in_artifact | 解決済みの依存関係 JAR 1 つに含まれるすべてのクラスを対象にテキストを検索します |
resolve_dependencies | このプロジェクトで実際に使用される依存関係グラフを分析します |
ヒント
ソースの応答にはすべてsourceAvailableが含まれます。実際のソース(Javadoc、パラメーター名、ジェネリクス)がある場合はtrue、CFR による逆コンパイルの場合はfalseです(構造は信頼できますが、名前は合成されたものの場合があります)。
メモ
マルチモジュール:modulePathを省略すると、jvmsrc が該当するモジュールを一意に特定します。特定できない場合は、候補となるmodulePathの一覧を表示します。メソッド: インデックスにソース情報が補完されている場合、search_classesは宣言されたメソッド名も検索します。既知の JAR 内で本体のテキストを検索するにはsearch_in_artifactを使用してください。get_class_sourceのmethodNamesは、一致しなかった名前についてもスーパークラスを調べます。
エージェントに使わせる
ツールの説明は役立ちますが、エージェントがすでに信頼している組み込みの Bash ツールが優先されることがよくあります。小さな追加を2つ行うと、依存関係に関する質問で jvmsrc がデフォルトになります。
1. エージェントの指示にルールを追加します(CLAUDE.md、AGENTS.md、Cursor のルール)。多くのクライアントでは、MCP サーバーの instructions がまったく表示されません。
## Dependencies (jvmsrc)
For any question about a third-party library class, method or version, use the jvmsrc MCP tools
(search_classes → get_class_structure → get_class_source with methodNames; resolve_dependencies for versions).
When working inside one module, pass modulePath (':app' or the file you are editing) to get that module's versions.
Never use javap, unzip/jar on JARs, or ~/.gradle/caches. Code under this repo's src/ → grep/read as usual.
2. (Claude Code)フックでシェルへのフォールバックをブロックします。 docs/hooks/block-jvm-fallbacks.mjs は、JAR に対する javap、unzip/jar、および ~/.gradle/caches/~/.m2 へのアクセスを拒否し、代わりに jvmsrc を使うようエージェントに伝えます。これにより、間違ったバージョンを黙って読み込むのではなく、処理が切り替わります。スクリプトを安定した場所に保存し、.claude/settings.json(プロジェクト用)または ~/.claude/settings.json(すべてのプロジェクト用)に追加します。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{ "type": "command", "command": "node /absolute/path/to/block-jvm-fallbacks.mjs" }]
}
]
}
}
一時的に無効にするには、JVMSRC_HOOK_DISABLE=1 を設定します。他のクライアントにはそれぞれ独自のフック機構があります。移植する前に、最新のドキュメントを確認してください。
クライアントにサーバーの指示が表示されることを確認します: エージェントに 「jvmsrc MCP サーバーからどのような指示が出ていますか?」 と尋ねます。答えられない場合は、手順1のルールに従ってください。
メモ
入力は柔軟に指定できます。
projectRootは省略可能です(ワークスペースが使用されるか、JVMSRC_PROJECT_ROOTを設定します)。modulePathにはapp、/app、:app、またはモジュール内のファイル/ディレクトリを指定できます(省略するか"*"を渡すと、すべてのモジュールが検索されます)。classNameには単純名、Outer.Inner、末尾に.class/.javaを付けた名前を指定できます。プロジェクトでの最初の呼び出しでは Gradle が実行されます(通常5~10秒)。それ以降の呼び出しではキャッシュが使われます。forceRefresh: trueを渡すのは、ビルドファイルには示されない変更があった場合(たとえば、SNAPSHOT が再公開された場合)に限ってください。
比較
| ツール | 方法 | 弱点 |
|---|---|---|
キャッシュインデクサー/~/.gradle の grep | グローバルキャッシュをスキャン | プロジェクトごとの解決済みバージョンがわからない |
静的パーサー(例:build.gradle パーサー) | 宣言のみを解析 | 推移的依存関係、BOM、動的バージョンを見落とす |
mcp-javadoc/パスのみを使う CFR | ユーザーが手動で JAR パスを指定 | ビルドやクラスパスを自動解決できない |
| Gradle MCP(Tooling API) | タスク/ビルドに重点を置く | クラスパスを正確に反映した FQN ソース検索には最適化されていない |
jvmsrc | 実際のビルドツールとキャッシュを照会 | エージェント向けに、バージョンが正確なソースとシグネチャを提供 |
対象ユーザー
主な対象は、Gradle を使う Java + Spring Boot プロジェクトです。その他の JVM 言語(Kotlin、Scala)と Android は現在ベストエフォートで動作し、今後、正式な対象としてロードマップに追加される予定です。詳しくは ROADMAP.md を参照してください。
Maven または Bazel をお使いの場合、対応は計画中ですが、まだリリースされていません。リポジトリにスターを付けるか、Issue を作成してください。優先順位の参考にします。
詳細リファレンス
要件と互換性
ランタイム: Node.js ≥ 20、PATH 上の Java。
プロジェクトの種類: JVM のコードベース(Java、Kotlin、Scala、Groovy)。jvmsrc はエディターではなく、ビルドツールを呼び出します。
| ビルドシステム | 状況 |
|---|---|
| Gradle | 対応済み — マルチモジュールを含む |
| Maven、Bazel | 対応予定(SPEC.md) |
-p/projectRoot には Gradle のルート(settings.gradle(.kts) またはルートの build.gradle(.kts))を指定してください。./gradlew があればそれを使い、なければ PATH 上の gradle を使います。Maven のみのツリーでは、未対応であることを明示するエラーが表示されます。
既知の制限事項
初期段階のソフトウェアであり、対応範囲は限定されています。
| 分野 | 現状 |
|---|---|
| ビルドツール | Gradle のみ |
| 統合 | Groovy init スクリプト(--init-script)— Gradle Portal プラグインではありません |
| クラスパス | Gradle が公開する標準 JVM と Kotlin MPP の jvm* 構成 |
| 出力 | Java 形式の .java テキスト(sources JAR、プロジェクト間の src、または CFR) |
複合ビルド、Android のみのレイアウト、特殊な構成は、完全には検証されていません。ROADMAP.md を参照してください。
セキュリティとプライバシー
* **テレメトリーはありません。** * **ローカルのみ** — キャッシュと診断情報はディスク上に保存され、プロジェクトのルートディレクトリには書き込みません。 * **サブプロセス**は argv のみを介して実行します(シェルによる展開は行いません)。詳しくは [SECURITY.md](SECURITY.md) をご覧ください。 * jvmsrc が解決できるプロジェクトを制限するには、オプションで `JVMSRC_ALLOWED_ROOTS` を設定できます。CLI コマンドリファレンス
jvmsrc com.example.MyClass -p /path/to/gradle-project # shorthand for get
jvmsrc get com.example.MyClass -p /path/to/project -q > MyClass.java
jvmsrc resolve -p /path/to/project --force-refresh
jvmsrc config jdk-roots add /path/to/jdks # one-time JDK roots setup
jvmsrc doctor java -p /path/to/project # check JDK requirement + selection
jvmsrc diagnostics last # latest failure message
jvmsrc mcp # run as MCP server
便利なフラグ: -p / --project、--module(:core:api)、--configuration、--include-test、--force-refresh、--verbose(Gradle の stderr のみ)、--method、--start-line / --end-line。
テスト用リポジトリフィクス:
test/fixtures/gradle-smoke —
jvmsrc get com.smoke.Core -p test/fixtures/gradle-smoke --module :core。
トラブルシューティング
- 解決に失敗する場合:
jvmsrc diagnostics last(またはjvmsrc diagnostics last 5)を実行します - カスタム JDK インストールルート:
jvmsrc config jdk-roots add /path/to/jdksで一度追加します - JDK の不一致をデバッグする場合:
jvmsrc doctor java -p /path/to/projectを実行します - jvmsrc のアップグレード後: MCP ホストを再起動します
- クラスパスが古い場合:
jvmsrc resolve --force-refreshを実行します
環境変数
| 変数 | 用途 |
|---|---|
JVMSRC_JAVA_HOME | Gradle/CFR の子プロセスで使用する JDK のホームを指定します |
JVMSRC_CONFIG_DIR | jvmsrc のグローバル設定ディレクトリ(絶対パス) |
JVMSRC_CACHE_ROOT | キャッシュルート(絶対パス) |
JVMSRC_LOG_DIR | 診断ログ(絶対パス) |
JVMSRC_CALL_LOG | 1 = MCP ツール呼び出しごとに calls.log に 1 行追記します(オプトイン。SPEC §6.3 を参照) |
JVMSRC_ALLOWED_ROOTS | 許可する projectRoot のプレフィックス |
JVMSRC_PROJECT_ROOT | projectRoot が省略され、クライアントからワークスペースルートが送信されない場合に、MCP ツールが使用する既定のプロジェクトルート(作業ディレクトリにフォールバックします) |
JVMSRC_MAX_SOURCE_OUTPUT_CHARS | ソース本文の最大サイズ(既定値 524288) |
JVMSRC_GRADLE_TIMEOUT_MS | Gradle のタイムアウト |
JVMSRC_CFR_PATH | カスタム CFR JAR |
既定値は OS ごとの env-paths の規約に従います。全体の構成については SPEC.md §6 をご覧ください。
JVMSRC_JAVA_HOME が設定されていない場合、jvmsrc は ~/.jdks(IntelliJ)や ~/.gradle/jdks、SDKMan、jenv、asdf などの一般的なパスと、OS 固有のシステムインストールディレクトリ、および jvmsrc config jdk-roots ... でグローバルに設定した JDK ルートから、ローカル JDK を自動検出します。
AI エージェントによるレビュー
JAR を逆コンパイルせずに済む MCP がついに登場
「このツールは、存在しない Spring API を LLM がでっち上げることにうんざりしている人にとって、まさに目からうろこです。実際にバイトコードを読み取り、正確なクラス定義とソース検索結果を提供するため、ありがちな『雰囲気頼み』の推測はありません。
search_classes機能は非常に精度が高く、javapへのフォールバックや、きめ細かなスコープ制御(overview/declared/effective)も丁寧に実装されているため、複雑な JAR の調査が苦になりません。高速で、クラスが見つからないときは正直に伝え、キャッシュ管理も完璧です。依存関係地獄に苦しむ開発者には必携です。ドキュメントを読むのが本当に好きなシニアエンジニアがそばにいるようです。」 — Claude(AI レビュアー)
プロジェクトドキュメント
| ドキュメント | 内容 |
|---|---|
| SPEC.md | スキーマ、契約、CLI/MCP の詳細 |
| CONTRIBUTING.md | ビルド、テスト、プルリクエストに関する注意事項 |
| RELEASING.md | ブランチ運用、セマンティックバージョニング、npm リリース |
| CHANGELOG.md | バージョン履歴 |
| ROADMAP.md | ステータスと予定している作業 |
| SECURITY.md | 脆弱性の報告 |
ソースからのビルド
git clone https://github.com/Sintexer/jvm-source-lens.git
cd jvm-source-lens
bun install && bun run setup:cfr && bun run build
node dist/cli.js --version
貢献に関するワークフロー全体については、CONTRIBUTING.mdをご覧ください。
Java のコードを書くのは得意でも、実際のクラスパスを把握できないエージェントに何度も悩まされてきたため、jvmsrcを作りました。これによって、私が経験した25ターンの苦労を皆さんがせずに済むなら、それこそがこのツールを作った理由です。バグを見つけた方、アイデアがある方、あるいは役に立ったと伝えたい方は、Issue または PR をお寄せください。すべて目を通しています。
ライセンス
MIT — LICENSEをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。