生成 AI エージェントが実行中の JavaFX アプリケーションをリアルタイムに分析・操作するための MCP サーバーと Agent Skills を提供するプロジェクトです。
Java Attach API でターゲット JVM にインスペクタエージェントを動的注入し、シーングラフの探索・プロパティ変更・UI 操作・スクリーンショット取得などを AI から直接実行できます。
- シーングラフ探索 — 実行中の JavaFX アプリのウィンドウ・ノードツリーを JSON で取得
- ノード検索 — タイプ・CSS ID・テキスト・スタイルクラスからノードを検索
- プロパティ読み取り・変更 — テキスト・スタイル・表示状態などのプロパティを動的に操作
- UI インタラクション — クリック・フォーカス・キー入力を JavaFX イベントシステム経由で送信
- ノードハイライト — 対象ノードを視覚的なオーバーレイでハイライト表示
- スクリーンショット — ノード単体またはシーン全体を PNG 保存
MCP Client (AI / OpenCode)
└─[STDIO]─► McpServerApplication (Spring Boot)
└─► FxgraphService (@Tool × 13 メソッド)
└─► JavaFxAgent (Attach API + TCP socket)
└─[TCP NDJSON]─► FxGraphInspectorAgent (注入済みエージェント)
└─► SceneGraphInspector
└─► JavaFX Scene Graph
Agent Skills(CLI 経由):
AI → bash → scripts/fxgraph → fxgraph-cli.jar
└─► CliCommandDispatcher
└─► JavaFxAgent
通信プロトコルは 改行区切り JSON(NDJSON)over TCP。MCP サーバーは STDIO トランスポート で動作します。
| モジュール | 役割 |
|---|---|
core |
共有モデル・プロトコル・エージェント通信ロジック(Spring 非依存) |
agent |
対象 JVM に注入される Java Agent(Spring 非依存) |
cli |
軽量 CLI ツール(Agent Skills から直接利用) |
mcp-server |
Spring Boot MCP サーバー(STDIO モード) |
javafx-test-app |
動作確認用サンプル JavaFX アプリ |
skills/fxgraph |
AI Agent Skill 定義・スクリプト |
- Java 21+
- Gradle(プロジェクトに
gradlew同梱) - 対象の JavaFX アプリケーション(Java 11+ で動作)
# プロジェクト全体をビルド
./gradlew build
# 各モジュールの Shadow JAR を生成
./gradlew :mcp-server:shadowJar # → mcp-server/build/libs/fxgraph-mcp-server.jar
./gradlew :cli:shadowJar # → cli/build/libs/fxgraph-cli.jar
./gradlew :agent:shadowJar # → agent/build/libs/fxgraph-agent.jarfxgraph-mcp-server.jar を生成し、OpenCode の設定ファイルに追記します。
./gradlew :mcp-server:shadowJar~/.config/opencode/config.json の設定例:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"fxgraph": {
"type": "local",
"command": ["java", "-jar", "/path/to/fxgraph-mcp-server.jar"],
"enabled": true
}
}
}使用するには、プロンプトで use the fxgraph tool と指定します。
fxgraph-agent.jarはfxgraph-mcp-server.jarと同じディレクトリに自動でコピーされます。
CLI と Agent JAR を skills/fxgraph/scripts/ へデプロイします。
./gradlew :cli:installSkillJarsデプロイ後の構成:
skills/fxgraph/scripts/
├── fxgraph # 実行ラッパースクリプト
├── fxgraph-cli.jar # CLI ツール
└── fxgraph-agent.jar # 対象 JVM に注入されるエージェント
AI エージェントに skills/fxgraph/SKILL.md を読み込ませることで、CLI 経由でも同等の操作が可能になります。
JAR ファイルはバージョン管理対象外(
.gitignore)です。ソース変更後はinstallSkillJarsを再実行してください。
| ツール | 説明 |
|---|---|
discoverApplications |
実行中の JavaFX アプリケーションを一覧取得 |
connectApplication |
PID 指定でアプリケーションに接続し sessionId を取得 |
disconnectApplication |
接続を切断してリソースを解放 |
getStages |
ウィンドウ(Stage)の一覧・サイズ・位置を取得 |
getScenegraph |
シーングラフのツリー構造を取得(深さ・プロパティ・バウンズ指定可) |
getNodeDetails |
特定ノードの詳細プロパティを取得 |
findNodes |
タイプ・CSS ID・テキスト・スタイルクラスからノードを検索 |
setProperty |
ノードのプロパティ値を変更(text・style・visible 等) |
selectNode |
ノードを視覚的にハイライト(赤枠オーバーレイ)。nodeId=0 で解除 |
clickNode |
ノードにクリックイベントを送信 |
requestFocus |
ノードにキーボードフォーカスを要求 |
typeKey |
キー入力イベントを送信(ENTER・TAB 等のキーコード対応) |
takeScreenshot |
ノードまたはシーン全体のスクリーンショットを PNG 保存 |
詳細な入出力スキーマは docs/tools-reference.md を参照してください。
1. discoverApplications()
→ [{ "pid": 12345, "mainClass": "com.example.MyApp", "javaFX": true }]
2. connectApplication(pid: 12345)
→ { "sessionId": "550e8400-...", "agentPort": 54321 }
3. getStages(sessionId: "550e8400-...")
→ [{ "stageId": "...", "title": "Main Window", "rootNodeId": 987654321 }]
4. getScenegraph(sessionId: "...", depth: 3, includeProperties: true, propertyFilter: ["text"])
→ { "rootNodes": [{ "nodeId": 987654321, "type": "VBox", "children": [...] }] }
5. setProperty(sessionId: "...", nodeId: 123456, propertyName: "text", value: "Hello")
→ { "oldValue": "Click Me", "newValue": "Hello" }
6. takeScreenshot(sessionId: "...", savePath: "/tmp/result.png")
→ { "savedPath": "/tmp/result.png", "width": 800, "height": 600 }
7. disconnectApplication(sessionId: "...")
→ { "success": true }
Agent Skills から bash ツール経由で実行します。
CLI="/path/to/skills/fxgraph/scripts/fxgraph"
# 実行中の JavaFX プロセスを検出
$CLI discover
# ウィンドウ一覧を取得
$CLI <PID> stages
# シーングラフを取得(深さ 3、テキストプロパティ付き)
$CLI <PID> scenegraph --depth 3 --props --filter text
# ノードを検索(タイプ・ID・テキスト・スタイルクラスから)
$CLI <PID> find-nodes --type Button
$CLI <PID> find-nodes --id submitBtn
$CLI <PID> find-nodes --text "Submit"
$CLI <PID> find-nodes --styleClass primary-action --stageId <STAGE_ID>
# ノードの詳細プロパティを取得(--filter 必須)
$CLI <PID> node-details <NODE_ID> --filter text,visible,disable
# プロパティを変更
$CLI <PID> set-property <NODE_ID> text "Hello"
$CLI <PID> set-property <NODE_ID> visible false --type boolean
# ノードをハイライト
$CLI <PID> select-node <NODE_ID>
# クリック・フォーカス・キー入力
$CLI <PID> click-node <NODE_ID>
$CLI <PID> focus <NODE_ID>
$CLI <PID> type-key ENTER
# スクリーンショット
$CLI <PID> screenshot ./result.png
$CLI <PID> screenshot ./node.png --nodeId <NODE_ID>すべてのコマンドは JSON を出力します。
--jsonフラグは存在しません(渡すとエラーになります)。--propsフラグはscenegraphコマンド専用です。node-detailsでは--filterを使用してください。
CLI の完全なオプション仕様は skills/fxgraph/references/ を参照してください。
# 全テストを実行
./gradlew test
# モジュール別テスト
./gradlew :core:test
./gradlew :agent:test # Monocle (headless) で JavaFX テストを実行
./gradlew :cli:test
./gradlew :mcp-server:test # 統合テスト(事前に shadowJar が必要)
# 統合テストの事前準備
./gradlew :mcp-server:shadowJar && ./gradlew :mcp-server:testagent モジュールのテストは Monocle ヘッドレスモードで実行されるため、CI 環境でも追加設定不要です。
AtlantaFX (NordDark テーマ) を使った Todo リストアプリをサンプルとして同梱しています。
./gradlew :javafx-test-app:run| ライブラリ | バージョン | 用途 |
|---|---|---|
| Java | 21 | 言語・ランタイム |
| Spring Boot | 4.0.2 | MCP サーバー基盤 |
| Spring AI MCP | 1.1.2 | MCP プロトコル実装 |
| Jackson | 2.18.3 | JSON シリアライズ |
| JavaFX | 21 | 対象プラットフォーム |
| JUnit | 5.10.0 | テストフレームワーク |
| Mockito | 5.11.0 | テストモック |
| AtlantaFX | 2.0.1 | テスト用サンプルアプリ |
- STDIO トランスポートのみ対応 — 複数の AI エージェントからの同時接続はできません。
- ノード ID はセッション内でのみ安定 —
System.identityHashCode(node)を使用しているため、JVM 再起動後は変化します。 - Java Attach API — 一部の JVM 設定では
AttachNotSupportedExceptionが発生する場合があります。その際は起動オプションに-Djdk.attach.allowAttachSelf=trueの追加をお試しください。 - MCP サーバーログ — STDIO を汚染しないよう、ログはすべてローリングファイル (
fxgraph.log) へ出力されます。 - UI 操作の実現性 — クリック・キー入力エミュレーションは OS のセキュリティ制限により低レベルな入力注入が不可能なため、JavaFX イベントシステム経由での模倣を行っています。このため、対象アプリケーションの実装次第では動作しない場合があります(例:ネイティブイベントに依存するコントロール、カスタム描画ノードなど)。
Scenic View— JavaFX アプリのシーングラフをリアルタイムに可視化するツール。アイデアの着想元。docs/tools-reference.md— MCP ツールの詳細リファレンス(入出力スキーマ付き)skills/fxgraph/SKILL.md— Agent Skills の定義とワークフローskills/fxgraph/references/inspect-commands.md— CLI 読み取り系コマンドの詳細skills/fxgraph/references/interact-commands.md— CLI 操作系コマンドの詳細AGENTS.md— コード生成・レビュー向けの開発ガイドライン