mcpField
J
JVM Source Lens

JVM Source Lens

ローカル
github.com開発ツール44 週間前に更新

JVM Source Lens について

JVM Source Lens は、Gradle を使う Java プロジェクト向けの MCP サーバー兼 CLI です。実際のクラスパスを解決し、使用中のバージョンに対応するソース、シグネチャ、構造を調べられます。

主な機能

  1. 01Gradle クラスパスの解決
  2. 02クラスと依存関係の検索
  3. 03クラス構造とシグネチャの確認
  4. 04ソースとメソッド本体の取得
  5. 05依存アーティファクト内の検索

活用シーン

  1. 01不慣れな依存ライブラリの API 確認
  2. 02プロジェクトで使われるバージョンの確認
  3. 03オーバーライド実装前のライブラリメソッド調査

MCP 対応

stdio 経由で、クラスパス検索、ソースやシグネチャの取得、依存関係の検索ツールを MCP クライアントに提供します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"sintexer-jvmsrc": {
"command": "npx",
"args": [
"-y",
"jvmsrc"
],
"env": {
"JVMSRC_ALLOWED_ROOTS": "<JVMSRC_ALLOWED_ROOTS>",
"JVMSRC_CACHE_ROOT": "<JVMSRC_CACHE_ROOT>",
"JVMSRC_LOG_DIR": "<JVMSRC_LOG_DIR>",
"JVMSRC_MAX_SOURCE_OUTPUT_CHARS": "<JVMSRC_MAX_SOURCE_OUTPUT_CHARS>",
"JVMSRC_GRADLE_TIMEOUT_MS": "<JVMSRC_GRADLE_TIMEOUT_MS>",
"JVMSRC_CFR_PATH": "<JVMSRC_CFR_PATH>"
}
}
}
}
起動コマンドnpx -y jvmsrc
設定が必要な環境変数
JVMSRC_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmjvmsrc1.16.0

ツール

7

掲載時のツール一覧 · 3 週間前に更新

パラメーター型必須説明
fullbooleanいいえ
endLineintegerいいえ
classNamestringはい
startLineintegerいいえ
methodNamestringいいえ
modulePathstringいいえ
includeTestbooleanいいえ
methodNamesarrayいいえ
projectRootstringはい
forceRefreshbooleanいいえ
configurationstringいいえ

詳細

jvmsrc — コーディングエージェントに Java IDE を

CI npm version License: MIT Node

MCP サーバーと CLI で、JVM コードベースでコーディングエージェントに欠けているもの、つまり 実際のクラスパス を提供します。


問題

Java のコードを書くときには IDE を使います。しかし、コーディングエージェントには IDE がありません。

エージェントが見慣れないライブラリの型、たとえば独自の内部ライブラリにあるスーパークラスに遭遇すると、25 回以上のやり取りを費やして ~/.gradle/caches を探し回り、jar tf で JAR を手作業で開き、推測でそのうちの 1 つを選んで、IDE ならキーを 1 回押すだけで答えられる疑問に答えようとします。つまり、このスーパークラスに X という名前のパブリックなユーティリティメソッドがあるか、という疑問です。

解決策

jvmsrc はビルドツール(Gradle)に問い合わせて、このプロジェクトで解決されたクラスパスを取得し、実際にビルドで使われている正確なバージョンの実際のソース、実際のシグネチャ、実際の構造をエージェントに渡します。

  • MCP サーバーとして — Claude Code、Cursor、Windsurf、その他の MCP ホストに接続し、クラスパス専用に設計された 6 つのツールをエージェントに提供します。
  • jvmsrc CLI として — 同じエンジンを使い、スクリプトで利用でき、パイプにも対応しています。クラスを読むだけなら、単独でも便利です。

Claude Code で jvmsrc が Spring のクラスを解決する様子
Claude Code が jvmsrc を使って HandlerInterceptor のシグネチャを解決。3 回の呼び出しで正確な答えに到達し、キャッシュを探し回る必要はありません。


毎日削減できること

プライベートライブラリがあり、公開 Javadoc がない JVM プロジェクトでは、jvmsrc が作業効率を大きく高めます。

  • 「この外部クラスには何があるか」という調査 1 件あたり約 50K トークンを節約 — コストを**約 70%**削減します。
  • エージェントのパニックループを毎日 15 回以上回避 — Gradle キャッシュを延々と調べたり、間違った JAR を開いたり、諦めたりする必要はありません。
  • 以前は自分で対応するしかなかった、内部 SDK に触れる複雑なタスクを委任できるようになります。

実際の違い

jvmsrc なし(25 回のやり取りにわたる手探り)

ユーザー: AbstractTradingService の監査フックをオーバーライドしたいのですが、再利用できるパブリックなユーティリティメソッドはありますか?

エージェント:

  1. ワークスペースで AbstractTradingService.java を検索 ➔ 0 hits
  2. 実行: find ~/.gradle -name "trading-core*"
  3. 4 つのバージョンを発見: 2.1.0、2.3.0、2.4.1、3.0.0-SNAPSHOT
  4. 推測: trading-core-2.4.1.jar を選択(実際にプロジェクトで使われているのは 3.0.0-SNAPSHOT!)
  5. 間違った JAR に対して jar tf と javap -p を実行
  6. [22 回のやり取りの後] 「ユーティリティメソッドは見当たりません。ご自身で実装してください。」

実際は: 3.0.0-SNAPSHOT には、この用途にぴったりの maskSensitiveFields() という protected ヘルパーが追加されていました。エージェントは幻覚を起こしたのではなく、ただ見えていなかったのです。

jvmsrc あり(3 回のやり取りで即座に解決)

ユーザー: AbstractTradingService の監査フックをオーバーライドしたいのですが、再利用できるパブリックなユーティリティメソッドはありますか?

エージェント:

  1. search_classes("AbstractTradingService") ➔ FQN と、正確に解決されたライブラリを特定します。
  2. get_class_structure(scope: "overview") ➔ 3.0.0-SNAPSHOT にある maskSensitiveFields() を見つけます。
  3. get_method_signature("maskSensitiveFields") ➔ 正確なシグネチャとジェネリクスを取得します。

結果: 初回から正しくオーバーライドを記述できます。キャッシュを探し回る必要も、推測も、バージョン違いもありません。


仕組み

  1. ビルドツールへの問い合わせ: jvmsrc がアクティブなビルドツール(Gradle など)に問い合わせて、正確に解決されたクラスパス設定を取得します。
  2. インテリジェントなキャッシュ: 解決されたクラスパスをキャッシュし、ビルドファイルの変更を追跡して最新の状態を保ちます。
  3. 精密な 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_HOMEGradle/CFR の子プロセスで使用する JDK のホームを指定します
JVMSRC_CONFIG_DIRjvmsrc のグローバル設定ディレクトリ(絶対パス)
JVMSRC_CACHE_ROOTキャッシュルート(絶対パス)
JVMSRC_LOG_DIR診断ログ(絶対パス)
JVMSRC_CALL_LOG1 = MCP ツール呼び出しごとに calls.log に 1 行追記します(オプトイン。SPEC §6.3 を参照)
JVMSRC_ALLOWED_ROOTS許可する projectRoot のプレフィックス
JVMSRC_PROJECT_ROOTprojectRoot が省略され、クライアントからワークスペースルートが送信されない場合に、MCP ツールが使用する既定のプロジェクトルート(作業ディレクトリにフォールバックします)
JVMSRC_MAX_SOURCE_OUTPUT_CHARSソース本文の最大サイズ(既定値 524288)
JVMSRC_GRADLE_TIMEOUT_MSGradle のタイムアウト
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をご覧ください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。