mcpField
U
unity-explorer-mcp

unity-explorer-mcp

github.com/decentralandテスト・品質4246 回インストール今日更新
リポジトリ

unity-explorer-mcp について

unity-explorer-mcpは、実行中のExplorerを通じてDecentralandシーンを反復するエージェント向けスキルです。セットアップ、ユーザー確認のゲート、MCP接続、変更と確認の手順を案内します。

主な機能

  1. 01Explorer MCPのセットアップと接続確認
  2. 02起動や操作前のユーザー確認ゲート
  3. 03書き込みごとのシーン状態確認
  4. 04カメラと操作ツールの利用ガイド
  5. 05ネイティブツール未接続時のcurl代替手段

活用シーン

  1. 01ExplorerでのDecentralandシーンのテスト
  2. 02稼働中のExplorer MCPサーバーへの接続
  3. 03不完全な再読み込みを防ぐ段階的なシーン編集
  4. 04ネイティブMCPツールが使えない場合のシーン確認

MCP 対応

Explorerプロセス内で動くMCPサーバーに接続し、シーン、カメラ、操作、スクリーンショットのツールを利用します。Creator Hub MCP経由でのアクセスや、curlによる代替手順も説明します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/decentraland/sdk-skills --skill unity-explorer-mcp

インストール後、Claude Code で/unity-explorer-mcpを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

reference/
assets.md
camera-and-movement.md
curl-fallback.md
interaction.md
performance-debugging.md
recovery.md
setup.md
visuals.md
scripts/
screenshot.sh

詳細

Unity Explorer MCP シーンの反復

explorer MCP 接続の失敗または未接続は、想定される初期状態であり、障害ではありません。 MCP サーバーは Explorer プロセス内で動作するため、ConnectionRefused や explorer サーバーがまったく存在しない状態は、Explorer がまだ起動していないことを意味するだけです。以下の意図確認ゲートに進んでください。セットアップで Explorer を起動し、ツールをバインドします。バインド後は、mcp__explorer__* ツールが自己記述型の信頼できるカタログになります。ツールが存在しないと決めつけず、そこで名前、引数、出力形式を確認してください。

Creator Hub MCP 経由で利用していますか? Creator Hub のエディター MCP が接続されている場合(スキル creator-hub-mcp、ツール mcp__creator-hub__*)、Explorer にはその MCP 経由でアクセスします。launch_preview は、この MCP サーバーを有効にした状態でシーンのプレビューを開始し、以下のランタイムツールは explorer_<name> としてリアルタイムに再公開されます(explorer_screenshot、explorer_walk など。バインド中は explorer_call(tool, arguments) が代替手段になります)。その場合、以下のセットアップはすべて省略してください。claude mcp add も、バインドゲートも、ポート 8123 の確認も不要です。これらのツール名を使って、そのまま反復ループに進んでください。リファレンスファイルはそのまま適用されます。この経路では、追加ルールが 1 つあります。launch_preview の前に、preview_status と OS のプロセス一覧の両方を確認してください(macOS では pgrep -fl '[M]acOS/Explorer'、Windows では Get-Process Decentraland)。stop_preview が {ok: true} を返しても Explorer が動作し続け、次回の起動時に接続されない場合があるためです。詳しくは creator-hub-mcp の「プレビューのライフサイクル」を参照してください。

Explorer の実行中に、シーンファイルをまとめて書き込まないでください。 変更は 1 回の書き込みとして反映してください(反復ループのステップ 1)。次の書き込みの前に get_scene_state を確認してください。また、複数ファイルへのパッチ適用やジェネレータースクリプトの実行時は、最初に開発サーバーを停止してください。数秒の間隔で 2 回保存すると、破損したバンドルが読み込まれる可能性があり、その場合は Explorer の再起動でしか復旧できません(Locksmith、2026-10:2 日間で 4 回の再起動)。

事前に読むもの:

実行する操作参照先
set_camera_mode または set_camera_posereference/camera-and-movement.md(最初に camera.modeChangeAllowed を確認してください)
クリック、ホバー、press_input、ui_* の呼び出しreference/interaction.md(2 つの ID 空間)
Explorer プロセスの数を確認、終了、または再起動するreference/recovery.md(角括弧で囲んだ pgrep。ウォッチドッグのコマンドラインにも Explorer のパスが含まれています)

ゲート

このスキルの特定の箇所はゲートです。質問した後はツールを一切呼び出さず、ユーザーの回答を待ちます。ゲートが開くのはユーザーが回答した場合のみです。自分の判断で開くことはできません。ユーザーが無言である場合も、回避策を利用できる場合も同様です。サブエージェントとして実行している場合、ゲートを開くことは一切できません。質問するユーザーがいないためです。ゲートを自分の権限で通過せず、保留中の判断と推奨事項を呼び出し元に報告して停止してください。回避策がたまたま機能する場合でも、ゲートを通過すればルール違反になります。ゲートは次の順に並んでいます。スキルのインストールゲートと再起動ゲート(以下)、意図確認ゲート(事前確認)、起動/終了ゲート(セットアップのステップ 1)、バインドゲート(セットアップのステップ 2)。

SDK スキルを読み込む(いずれの場合も、最初に実行)

このスキルで扱うのは Explorer の操作だけです。SDK7 API の知識(コンポジット優先ルール、コンポーネントのリファレンス)は、このスキルの配布元である decentraland/sdk-skills パッケージのほかのトピックスキル(エントリーポイントは sdk-scenes)にあります。Explorer を使うことになるかどうかにかかわらず、これらのスキルが必要なので、以下の事前確認より先に読み込んでください。

スキルを読み込みます。まずセッションスキル、次にファイルシステムから、シーンローカル(シーンフォルダー内の .claude/skills/)とグローバル(~/.claude/skills/)のスキルを読み込みます。利用できるトピックスキルの名前を挙げられる状態になれば、読み込み完了です。スキルが存在することに気づいただけでは完了ではありません。たとえば unity-explorer-mcp 自体しかインストールされておらず、パッケージ全体がインストールされていないなどの理由で読み込めない場合は、スキルのインストール確認を行います。同じ配布元からパッケージの残りのトピックスキルも取り込むことをおすすめします。同意を得たら、シーンローカルとグローバルのどちらにインストールするかを尋ね、対応するコマンドを実行します。

npx skills add decentraland/sdk-skills --all       # scene-local (run inside the scene folder)
npx skills add decentraland/sdk-skills --all -g    # global (user-level, ~/.claude/skills)

新規インストールされたスキルはディスク上に配置されますが、紐付けはされません。スキルはセッション開始時に読み込まれ、再起動できるのはユーザーだけです。再起動確認を行います。新しいスキルを読み込むために今すぐ再起動するか、このセッションではスキルなしで続けるかを尋ねてください。再起動をおすすめします。再起動するまでは、Skill ツールで新しいスキルを名前で読み込めません。再起動が必要なのは、自動検出とネイティブ MCP バインディングのみです。ファイルシステムにアクセスできるエージェントなら、インストール済みの SKILL.md をディスクから読み取り、同じセッション内でその指示に従えます。

どちらの確認でも辞退して構いません。シーンの実装は可能ですが、効率は下がります。スキルが実際に読み込まれるまでは、イテレーションループ内の古い記憶のルールに従って、記述するすべての SDK7 API を確認してください。

意図の確認(事前確認。最初に実行)

このスキルは単独で起動します。mcp__explorer__* ツールが存在するだけで起動するため、ユーザーから依頼されていないのに読み込まれることがよくあります。サーバーの確認、Explorer の起動、シーンの編集を行う前に、Unity Explorer MCP サーバーを通じてシーンを操作する意図があるか確認してください。「実行中の Decentraland Explorer に Unity Explorer MCP サーバー経由で接続して、このシーンを作成・テストしますか?Explorer に接続または起動して、ワールド内でイテレーションを行います。」

  • はい — 以下のセットアップに進みます。
  • いいえ — このスキルに含まれるセットアップ、起動、MCP の手順は実行しません。Explorer を使わずにシーンを作業します(コードを編集し、読み込んだトピックスキルを活用します)。気が変わった場合は、後でこのスキルを再度呼び出せることをユーザーに伝えてください。

セットアップ(セッションごとに1回)

  1. 実行中の MCP サーバーがあるか確認してから、シーンを起動します。 まずはハーネスを使います。セッションで mcp__explorer__* ツールが利用できる場合は、get_scene_state を呼び出してください。応答があればサーバーは起動しています。ツールがない場合に限り、curl に切り替えます。

    curl -s -m 2 http://127.0.0.1:8123/unity-explorer-mcp -X POST \
      -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
      -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}'
    

    Creator Hub の Play ボタンで Play Options > Desktop Client の Enable MCP Server にチェックを入れると、CLI と同じサーバーが起動します。プローブから見分けることはできず、接続に失敗する原因にもなりません。以下で起動が必要となる場所では、どちらの方法でも有効な応答が得られます。

    サーバーが見つかった場合(ツールの応答または serverInfo の結果) — 起動/終了の確認を行います。実行中の Explorer を使うか、MCP フラグを付けてシーンを最初から起動するかを尋ねてください。

    • 実行中のものを使う: 新たには起動しません。ポート8000が対象のシーンフォルダーを提供していない場合(lsof -nP -i :8000 -sTCP:LISTEN を実行し、続いて PID の cwd を確認します)は、ポートを占有しているプロセスを終了し、npm run start -- --no-client を実行します。ツールがすでに利用できる場合は、手順2を省略します。
    • 最初から起動する: 何かを操作する前に、追加の確認を行います。実行中のシーンサーバーを終了するか、そのまま残して別のスタックを並行して起動するかを尋ねてください。
      • 終了する: ポート8000の開発サーバーを終了し、実行中の Explorer クライアントを閉じるようユーザーに依頼してから、以下に進みます。
      • 残す: 実行中のサーバーと Explorer には触れず、別のポートで2つ目のスタックを起動します。reference/setup.md の「Running a second stack」を参照してください。 サーバーが見つからない場合 — シーンのフォルダーから、シーンの配信と Explorer の起動を1つのコマンドで行います(バックグラウンドで実行したままにしてください。ポート 8000 をすでに別のプロセスが使用している場合は、上記と同じく停止するか維持するかを確認し、必要に応じてポートを変更してください)。
    npm install && npm run start -- --mcp --skip-auth-screen true
    

    これにより、シーンを http://127.0.0.1:8000 で配信し、インストール済みの Decentraland クライアントを MCP サーバーとともにポート 8123 で起動します。また、ソースファイルが変更されるたびにシーンをホットリロードします。ポートの変更、その他の起動フラグ、および2つの起動エラー(--mcp が不明なオプションとして拒否される場合と、"Please download & install the Decentraland Desktop Client" の表示)については、reference/setup.md の「Launch flags and errors」を参照してください。

  2. MCP サーバーを登録し、ツールが実際にバインドされていることを確認します(デフォルトのポートは 8123 です)。登録とバインドは別々の処理です。両方が必要です。

    timeout 15 claude mcp add --transport http --scope user explorer http://127.0.0.1:8123/unity-explorer-mcp
    

    "already exists in local config" は、以前のセッションで登録済みという意味です。登録は永続的な設定なので、何もする必要はありません。VS Code 拡張機能などの非ターミナルのハーネスでは、コマンドが出力なしでハングすることがあります。ハングした場合は、おそらく登録済みと判断し、再試行せずにバインド確認へ進んでください。ステップ 1 のプローブで、エンドポイントはすでに確認済みです。

    必須 — バインド確認:このセッションで自分で Explorer を起動した場合、準備完了プローブが応答したら、ここで STOP し、curl を使った反復ループを開始しないでください。 Claude Code はセッション開始時に MCP 接続を一度だけ確立します。このサーバーは Explorer プロセス内で動作するため、Explorer の起動前に開始したセッションでは、その一度だけの接続試行はすでに失敗しており、mcp__explorer__* ツールが自動的に表示されることはありません。セッション中に再バインドするには、明示的に /mcp で再接続するしかありません。別の方法として、Explorer を起動したまま新しい Claude セッションを開始すると、そのセッションの起動時に自動でバインドされます。どちらもユーザーが行う操作です。代わりに実行できるコマンドはないため、回避策を探すのではなく、ユーザーに尋ねてください。

    状況を説明するところから始めます — 「Explorer は起動していますが、この Claude セッションはその前に開始されたため、ネイティブの MCP ツールがバインドされていません」 — そのうえで、最適なものから順に3つの方法を提示し、フォールバックに進む前にそのコストを伝えます。

    • explorer サーバーに再接続する — 最も速く、現在の会話を継続できます。方法はハーネスによって異なります。ターミナル CLI では /mcp を実行するとサーバーの対話型メニューが開き、再接続項目を選べます。VS Code 拡張機能(および Creator Hub などの埋め込みチャットパネル)にはそのようなメニューがありません。そこで /mcp だけを実行するとステータス行と使用方法が表示されるだけなので、ユーザーにはチャットに /mcp reconnect explorer(または /mcp reconnect all)と入力するよう伝えてください。
    • 新しいセッション/新しい会話タブを開始する — Explorer は起動したままにします。新しいセッションの開始時にツールが自動でバインドされます。VS Code 拡張機能や埋め込みパネルでは、アプリや Explorer を再起動するのではなく、新しい会話タブを開くだけです。ユーザーは準備に時間のかかる読み込みを懸念して断ることがあるため、その点を伝えてください。/mcp reconnect が 「MCP controls aren't available right now — the terminal is still starting up or is showing another view.」 と返した場合、そのハーネスにはチャット内で解決する方法がないため、ここではこの方法を推奨してください。新しいタブを開く方法なら動作します。
    • curl フォールバック — プレイヤーの操作ごとにシェルコマンドを1つ実行し、新しい形式の呼び出しごとに権限確認が表示されます。トークンの使用量も増えます。また、スクリーンショットは base64 で届くため、表示する前にファイルにデコードする必要があります(scripts/screenshot.sh がその処理を行います。詳細は reference/curl-fallback.md を参照してください)。時間はかかりますが、上記のすべての確認はこの方法でも可能です。スクリーンショットが利用できないとは報告しないでください。

    クライアントで AskUserQuestion が利用できる場合は、各方法を1つずつ選択肢にして使ってください。2つ目の選択肢には 「セッションを再起動/新しいタブを開く(Explorer は起動したまま)」 とラベルを付け、Explorer を終了することだと誤解されないようにしてください。それ以外の場合は、同じ3つの方法を通常のテキストで提示し、最後に 「どちらを希望しますか?」 と尋ねてください。 この手順を先に進められるのは、次の3つの状態のいずれかの場合のみです。4つ目の状態はありません。また、サブエージェントは必ず最初の状態になります。

    • ツールがすでに存在する(このセッションが始まる前から Explorer が起動していた)— このゲートは適用されません。手順3に進んでください。
    • ユーザーがツールを再バインドした — /mcp で再接続したか、Explorer を起動したまま新しいセッション/タブを開いた場合です。ネイティブの mcp__explorer__* ツールを呼び出して確認してから、手順3に進んでください。(新しいセッションを始めるとこの会話は終了します。新しいセッションではツールがバインド済みであることが検出され、このゲートはスキップされます。)
    • ユーザーが、コストについて伝えられた後、このセッション中に curl を使う代替手段を明示的に文面で選択した — その場合に限り、reference/curl-fallback.md を読み、HTTP 経由でエンドポイントを操作してください。curl のプローブが成功しても、代替手段を選んだことにはなりません。返答がない場合も同様です。

    手順1のプローブは、このゲートより前に行う唯一の curl 呼び出しです。プローブで応答が得られれば、Explorer が起動していることは確認できます。だからこそ尋ねる必要があるのであり、続行してよいという許可ではありません。

    この予防策については、毎セッションではなく一度だけ伝えてください。Claude Code より先に Explorer を起動するか、セッション間も起動したままにしておくだけで、このゲート全体をスキップできます。

    Claude Code を使用していませんか? Cursor、Cline、またはカスタム SDK ハーネスの場合、接続の詳細と設定形式は reference/setup.md の「Claude Code 以外のクライアントへの登録」に記載されています。Claude Code の VS Code 拡張機能と Creator Hub の埋め込みチャットは、どちらも Claude Code です。上記のコマンドを使用しますが、ハーネスによる違いについてはバインドゲートに記載されています。

  3. ワールドの読み込みを待つ:loadingScreenOn が false になり、シーンが isReady: true を報告するまで、get_scene_state をポーリングしてください。ポーリングの期限は約90秒に設定し、結果は JSON として解析してください。isReady を生のテキストから grep してはいけません。ペイロード内の空白("isReady": true)によってリテラルパターンに一致せず、ポーリングが終了しなくなるためです。ポーリングに失敗し続ける場合、クライアントは認証画面にとどまっている可能性が高いです。--skip-auth-screen true で認証画面をスキップできるのは、前のセッションで有効な ID がキャッシュされている場合に限られます。また、追加の --multi-instance インスタンスでは必ず認証を求められます。ユーザーにログインするよう伝え、ログインを待ってから続行してください。

反復ループ

すべての要件に証拠がある状態になるまで繰り返してください。証拠は、リテールカメラモード(first_person/third_person。フリーカメラは不可)で撮影したスクリーンショット、または状態の読み取りであり、get_scene_state が正常で、ログに説明のつかないエラーがないことが条件です。

  1. 編集:src/ のシーン TypeScript を編集します。正確に思い出せない API を使う前に、該当トピックのスキルを読んでください(後述の 古い記憶 を参照)。変更ごとに書き込みは 1 回にします。複数の変更は 1 回の書き込みにまとめ、新しいモジュールは接続する前に書き込み、再度保存する前に get_scene_state でシーンが引き続き表示されることを確認してください。数秒間隔で 2 回保存すると不完全なバンドルが読み込まれ、シーンが消えた場合はクライアントを再起動してユーザー自身が復旧するしかありません(reference/recovery.md)。ホットリロードは数秒以内に反映されます。reload_scene を使うと確実にリセットできます。開発サーバーのウォッチャーは保存のたびに bin/index.js を書き換えます。サーバーの実行中に sdk-commands build を手動で実行しないでください(同じファイルに対する書き込みが競合します)。また、変更がゲーム内に反映されていないように見える場合は、シーンをデバッグする前に grep bin/index.js で編集内容の文字列リテラルを検索してください。ビルドが成功しても、実行中のバンドルに変更が含まれている証拠にはなりません。3D モデルを配置、ダウンロード、変換、エクスポートする前に reference/assets.md を読み、発光、ブルーム、UI オーバーレイ、スカイボックスの時刻、薄いジオメトリを調整する前に reference/visuals.md を読んでください。アセットファイルは src/ より頻繁に変わります。 assets/ 以下でファイルを追加、削除、名前変更するたびに、個別にホットリロードが発生します。ウォッチャーが数えるのはコマンド数ではなくファイル数です。そのため、GLB を 7 個まとめて rm しただけでも 30 秒以内に 7 回のリロードが発生し、一度は Explorer の再起動まで起きました(2026-10-10 に確認)。可能な限りプレビューを起動する前にアセットファイルの作業を済ませ、リロードの集中を短時間に抑えるため 1 つのコマンドにまとめてください。また、プレイテスト中に作業を実行しないでください。
  2. シーンが正常であることを確認:get_scene_state を実行します。state が JavaScriptError または EcsError の場合、コードによってシーンのランタイムがクラッシュしています。
  3. ランタイム出力を読む:sinceSeq に最後に確認したシーケンス番号を設定して get_scene_logs を実行します。シーンの console.log の出力と例外はここに記録され、エラーは画面から流れた後もバッファーに残ります。
  4. 表示して確認:ビューの位置を調整します(teleport、move_to、walk、look_at)。look_at は向きを設定し、walk と screenshot はカメラに追従します。次に screenshot を実行し、画像がシーンコードで期待される結果と一致するか確認します。撮影の構図を決めたり、フリーカメラで全体を見渡したり、正確な経路を移動したりする前に reference/camera-and-movement.md を読んでください。
  5. 動作を試す:トリガー領域に入る、クリックする、ホバーする、入力を押す、押したままのポインターをワールド内で動かす、チャットする、エモートする、ui_* ツールでシーン独自の 2D UI を操作するなどの操作を行い、反応を確認するために再度スクリーンショットを撮ります。これらの操作はすべて失敗しても何も表示されない場合があります。最初のクリック、ホバー、キー入力、UI 呼び出しの前に reference/interaction.md を読んでください。見た目だけでは十分に確認できない場合は、list_scene_entities と get_entity_details でシーンの ECS 状態を確認できます。
  6. 制限、フレームレート、最適化対象が問題の場合は、予算とパフォーマンスを測定します:get_scene_content_stats、get_scene_content_breakdown、get_performance_stats で測定のループを完結させます。何かを提案する前に、実際の視点で測定した FPS とコンテンツを関連付けてください。手法と結果の解釈については reference/performance-debugging.md を参照してください。

Creator Hub の launch_preview では、Explorer はクリエイター自身のウィンドウです。 操作するインスタンスは、クリエイターがプレイしているインスタンスです。move_to、reload_scene、カメラモードの変更、アセットファイルの変更は、すべてクリエイターのプレイテストに影響します。操作する前に get_player_state(位置、速度)を読み、直近の get_scene_logs を確認して、セッションの途中でないかを判断してください。状態を確認する際は、アバターを移動させないフリーカメラの set_camera_pose を move_to より優先してください。その後は、無条件に third_person にするのではなく、最初に確認したカメラモード(first_person/drone_view)に戻してください。2026-10-10 に確認。creator-hub-mcp スキルのプレビューライフサイクルのルールを参照してください。 古いメモリ — SDK7 API の記憶は古くなっています。 SDK には、トレーニングデータより新しいコンポーネント(ネイティブの TriggerArea と triggerAreaEventsSystem など)が含まれているため、API を思い出せないからといって存在しない証拠にはなりません。覚えているバージョン番号も同様です。API を正確に思い出せないときや、場当たり的な回避策(トリガーボリュームのためにプレイヤーの Transform をポーリングする、プレイヤーを動かすために engine.PlayerEntity を変更するなど)を自作しそうになったときは、その回避策を書く前に、その機能を担当するトピックのスキルを読んでください。スキルの説明に担当スキルが記載されており、残りは sdk-scenes にまとめられています。スキルでカバーされていない場合に限り公式ドキュメントを参照し、その場合はその旨を明記してください。

あらゆる結論を照合してください。視覚的な主張は状態の読み取り(ECS の値は get_entity_details、ログ、位置は get_player_state)で確認し、状態に関する主張はピクセルで確認してください。一方の情報源は日常的に誤りを伝えます。ピクセルには表示されないコライダーが存在したり、エンティティの状態は正常に見えるのに描画されなかったり、アニメーションがひそかに再生されなかったりします。ワールド内のテキストは画像ではなく、状態の読み取りです。 TextShape の看板は、数メートルを超えると縮小キャプチャでは読めません。そのエンティティに対する get_entity_details は、スクリーンショットのトークン数のほんの一部で、正確な PBTextShape 文字列を返します。相互確認が必須となる箇所は、参照ファイルに記載されています。

必須 — 作業を終える前にカメラを元に戻してください。 作業を中断する際(タスクの終了時、ユーザーに引き継ぐとき、またはユーザーの入力を待つ間)は、最後にカメラを操作して、シーン本来の標準モードに戻してください。デフォルトは set_camera_mode third_person です。シーンで一人称視点が意図的に強制されている場合(CameraModeArea またはカメラロックがプレイスペースを覆っている場合)は first_person にします。カメラを free モードのままにしてはいけません。その後に失敗した可能性のある操作があれば、get_player_state → camera.mode で確認してください。

スクリーンショットの頻度とコスト

screenshot ツールの結果は毎回、画像としてコンテキストに取り込まれます(1280×720 で約 1.2k トークン。ピクセル数に応じて増減します)。ツールで時折キャプチャするのは問題ありませんが、ツールバッチごとに screenshot は 1 回だけにしてください。2 回まとめて実行すると競合し、2 回目は「Another screenshot capture is already in progress; retry when it completes」というエラーで失敗します。2 回目は単独で再実行してください。頻繁なキャプチャや連続キャプチャには、代わりに付属スクリプトを使用してください。 フレームをコンテキストのコストなしでディスクに保存し、キャプションだけを出力します。絶対パスで呼び出してください。現在の作業ディレクトリはシーンフォルダーであり、このスキルのフォルダーではありません。<skill-dir> はこのスキルの読み込み時に報告されたベースディレクトリで、フラグは -h で表示できます。

<skill-dir>/scripts/screenshot.sh -o /tmp/shot.jpg     # single frame to a file
<skill-dir>/scripts/screenshot.sh -n 10 -i 0.5         # burst, for time-based behavior (tweens, animations)

フレームはデフォルトで $TMPDIR/mcp-shots に保存されます。意図的にシーンフォルダーの外に置かれています。プロジェクト内に残したファイルはデプロイ時にアップロードされ、区画ごとの MB 制限に含まれるため、-d/-o の保存先もシーンの外にしてください(または、そのディレクトリを .dclignore に追加してください)。たくさんキャプチャし、読み取るのは少数にしてください。作業前後を比較する場合は、両方をディスクにキャプチャし、その 2 枚だけを読み取ってください。

シーンの状態

  • scene.json の変更(スポーン地点、表示フィールド)はホットリロードされません。npm run start プロセスを再起動してから、reload_scene を実行してください。scene.base、scene.parcels、または worldConfiguration を変更した場合は、それだけでは不十分です。 開発サーバーは起動時にレルムの localSceneParcels を一度だけビルドするため、開発サーバーを再起動してから、新しい scene.base の位置で Explorer を再起動してください。以前の起動時の位置から再起動してはいけません。--position を指定せずに npm run start を再起動すれば、両方が実行されます。

  • teleport または reload_scene の後は、操作を始める前に get_scene_state を再確認してください。準備が整うまで数秒かかる場合があります。

  • 1つの区画は16×16 mです。区画 (x, y) は、ワールド位置 (16x..16x+16, 16y..16y+16) の範囲です。--position x,y を指定すると区画 x,y にスポーンします。指定しない場合、起動時には scene.base が使われます。

  • ローカルシーン開発モードでは teleport は何もせずに終了します。そのモードでは /goto は許可されません(チャットには「Teleport is not allowed in local scene development mode」と表示されます)が、ツールは「Arrived at (x,y)」と応答します。ローカルシーンのセッションで位置を変更するには、move_to を使ってください。

  • ツールが見つからない場合:セッション内に mcp__explorer__* ツールがない状態は、バインドゲートです。セットアップのステップ2に戻り、ユーザーにサーバーの再接続を依頼してください(ターミナル CLI の /mcp メニュー、または VS Code 拡張機能の /mcp reconnect explorer を使用)。あるいは、Explorer を起動したまま新しいセッションまたは会話タブを開いてもらい、そこでターンを終了してください。HTTP フォールバックは reference/curl-fallback.md にありますが、コストについて説明し、ユーザーが明示的に選択した後にのみ開いてください。

  • シーンから切断された場合、プレイヤーが区画の外にいる場合、接続が失われた場合、またはクライアントが応答しなくなった場合:reference/recovery.md。

回帰テスト用リグ:149,149-synthetic-input-showcase

sdk7-test-scenes/scenes/149,149-synthetic-input-showcase は、この MCP で操作するために構築された2×2区画のシーンです。10か所のステーション(S1-S10)で合成入力の全機能(walk、camera_look、look_at、click_entity、click_at、hover_entity、press_input、および ui_* ツール)をテストできます。各ステーションにはワールド内に結果表示があり、推測しなくても誤った結果を確認できます。テスト対象のシーンに問題があると判断する前に、MCP 自体の健全性を確認するため、このシーンを実行してください。ステーションが正しく動作しない場合、原因として疑うべきなのはシーンではなく、ツールまたは Explorer です。MCP_SHOWCASE.md には、既知の未解決クライアントの問題と各ステーションの操作メモが記載されています。

パターン:チェックをツール呼び出しではなく、シーンに組み込む

アバターが非表示か、モディファイアーエリアが適用されているか、コライダーのサイズが正しいかなど、MCP ツールで状態を読み取れない動作については、シーンのコードにアサーションを記述し、ワールド内のパネルで判定結果を確認します。再利用できる形として、9,99-modifier-areas の src/qaPanelUi.tsx を参考にしてください。

  • 角に固定された QA 情報パネルに、説明、各チェックの Run ボタン、チェックごとの PASS(緑)/FAIL(赤)/NOT RUN の結果を表示します。explorer_screenshot を 1 回実行すれば、テストスイート全体の結果を確認できます。
  • 各チェックは自動で処理を進めます。チェックごとにプローブ用エンティティを作成し、合格と不合格を区別できる位置へプレイヤーを movePlayerTo で移動させ、状態が落ち着くまで待ち、観測可能なプロキシを読み取って判定結果を出力し、再実行できるようプローブを削除します。
  • 確認したいプロパティが読み取れない場合は、読み取り可能な類似のプロパティで代用します。シーンからアバターが非表示かどうかを確認することはできないため、同じコライダープールから描画した TriggerArea に置き換え、進入イベントをアサートします。カメラについては CameraMode を読み取ります。読み取れないケースは、同じパネルに短い手動手順として残します。
  • すべての手順で [checkName] のプレフィックスを付けてログを出力するため、explorer_get_scene_logs を使えば、スクリーンショットを追加で撮らなくても FAIL の理由を確認できます。
  • このようなパネルを操作するには Alt キーを押します(ポインターのロックを解除します)。また、プローブのジオメトリはテスト対象とは別のエンティティに配置してください。テスト対象のエンティティ上にある MeshRenderer は、テストによってそのエンティティが変更されると、すぐに誤った結果を示します。

クリックを始める前にパネルを作成してください。チェックが自ら結果を報告すれば、その情報はセッション中も保持されますが、スクリーンショットから導いた結論は保持されません。

必要な機能がない場合

ループに必要な操作を実行できる接続済みの MCP ツールがない場合(press_input で対応できる SDK 入力アクションではないクライアントのショートカットキーや、どのツールでも公開されていない値の読み取りなど)は、そこで停止してユーザーに引き継ぎます。実行できない具体的な操作と、既存のツールでは対応できない理由を明記してください。MCP サーバーと Explorer はこのシーンのリポジトリの外部にあるため、拡張するかどうかはユーザーの判断に委ねられます。

コメント