creator-hub-mcp について
creator-hub-mcpは、MCPを通じてCreator Hubのライブシーンを編集するためのスキルガイドです。シーン変更、アセット処理、カタログ項目やファイル編集の選択手順をまとめています。
主な機能
- 01MCPによるライブシーン編集
- 02Smart Itemの検索と配置
- 03プロンプト添付ファイルとローカルアセットの処理
- 04取り消し可能なシーン編集手順
活用シーン
- 01Creator Hubでシーンのエンティティを追加・変更
- 02ユーザー提供のモデルや画像をシーンで利用
- 03MCP接続とファイル編集の要否を判断
MCP 対応
Creator Hubはアプリ内でMCPサーバーを実行し、開いているシーンの読み取り・変更ツールを提供します。内蔵AIアシスタントと外部MCPクライアントから利用できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ decentraland/ sdk-skills --skill creator-hub-mcpインストール後、Claude Code で/creator-hub-mcpを入力して読み込まれたか確認します。
同梱ファイルreference/connect.md
詳細
Creator Hub MCP — ライブシーン編集
Creator Hub は、アプリ内で MCP サーバーを実行します(localhost、ストリーミング可能な HTTP、ベアラートークン)。そのツールはエディターで開いているシーンを読み取り、変更します。変更はライブエンジンに適用され、ビューポートにすぐ反映され、assets/scene/main.composite に自動保存されます。また、すべて通常の取り消し操作として扱われます。同じサーバーが Creator Hub に組み込まれた AI アシスタントを動かし、任意の外部 MCP 対応ツールにも公開できます。
実行方法は 2 通りあります。
| 実行環境 | ツールへの接続方法 |
|---|---|
| Creator Hub の AI アシスタント内(Settings > AI > Enable AI Assistant。Creator Hub 0.50.0 以降はデフォルトで有効で、実験的機能ではなくなりました) | 事前に接続されています。アプリは MCP サーバーを creator-hub として登録した状態で claude / codex / cursor-agent / gemini CLI を起動し、これらのスキルをシーンにリンクして、このスキルと同じルールを挿入します。4 つのプロバイダーすべてで設定は不要です。 |
| 別のツール内(Claude Code ターミナルまたは VS Code 拡張機能、Cursor、Codex、Claude Desktop など) | 実行中の Creator Hub に接続します。詳しくは reference/connect.md を参照してください。ユーザーは Settings > AI > Expose AI assistant MCP server から JSON スニペットをコピーします。ここではスキルは自動接続されません。詳しくはスキルの入手元を参照してください。 |
Claude Code ではツールは mcp__creator-hub__<tool> として表示されます。Creator Hub のアシスタント内や他のクライアントでは、通常の名前(scene_state、create_entity など)で表示されます。接続されたツールは自らの機能を説明するため、以下の表よりもライブカタログを信頼してください。
ユーザーがプロンプトに添付するファイル
Creator Hub のアシスタント内では、ユーザーはターンにファイルを添付できます(creator-hub 3395b643)。入力欄の左にあるファイルを添付のクリップアイコンをクリックすると複数選択できるファイルピッカーが開き、ファイルを入力欄にドロップすることもできます(オーバーレイ:ファイルをドロップして添付)。画像はクリップボードから貼り付けられます。添付ファイルは削除可能なチップとして表示され、1 プロンプトにつき 8 個まで添付できます。以下を把握しておいてください。
- ディスクから選択またはドロップしたファイルは、実際の絶対パスで渡されます。コピーも、Base64 への変換も、サイズ制限もありません。その場所から読み取ってください。ユーザーに内容を再度貼り付けさせたり、プロジェクトに移動させたりしないでください。貼り付けた(クリップボードからの)画像にはパスがないため、アプリが一時ファイルに書き込み、そのパスを渡します。
- どのファイル形式も受け付けます。 アプリがファイルを分類するのはチップアイコン用のみです。
image(png、jpg、jpeg、gif、webp、bmp、svg、avif)、model(glb、gltf)、audio(mp3、wav、ogg、m4a、flac)、それ以外はfileです。 - 参照画像や GLB を渡す際に最適な方法です。 ドロップされた
.glbは、ユーザーがシーンに追加したいモデルです。まだプロジェクトの外にあるため、GltfContainerから参照する前にassets/Models/にコピーしてください(バウンディングボックスとコライダーの監査については add-3d-models を参照)。参照画像は通常、UI やマテリアルのアートディレクション用であり、インポートするファイルではありません。 - 添付ファイルだけで、テキストのないプロンプトが届く場合があります。添付ファイルが依頼そのものです。推測せず、どう扱えばよいか尋ねてください。
ユーザーが Local Assets パネルから指定するアセット
2 つ目の別のチャネル(creator-hub d25eff1b8)では、インスペクターの Local Assets パネル(ツリーまたはカード)でアセットをダブルクリックすると、エンティティの選択項目の隣にチップとして添付され、次のプロンプトに追加されます。複数のアセットと現在の選択項目を、1 つのプロンプトに含めることができます。メンションは送信後、またはチャットを閉じたときにクリアされます。アセットはターン内で [Editor context] として届くため、次の点に注意してください。
- メンションされたファイルは、シーン内にすでに存在するプロジェクト相対パスとして届きます。直接参照し、コピーや再インポートはしないでください。
- メンションされた組み込みアバターアニメーションはパスではなく 名前 として届きます。探すファイルはありません。
triggerEmote({ predefinedEmote: '<name>' })で再生してください(avatar-animationsを参照)。.glbを探すのは、このチャネルが防ぐために設けられた失敗パターンです。 - チップはポインターであり、指示ではありません。チップを添えて「これ」とだけ指定されても、動詞が必要です。依頼が曖昧な場合は確認してください。
ルール — シーングラフの変更には MCP を使い、ファイル編集は代替手段とする
Creator Hub MCP が利用可能な間は、assets/scene/main.composite、main.crdt、scene.json を手作業で編集しないでください。 理由はすべて Creator Hub のソースで確認されています。
- これらのファイルはエディターが管理しています。エディターはオートセーブのたびに(エディターで何らかのトランザクションが発生してから約 100 ms 後)、メモリー上のエンジンから
main.composite全体を再生成し、ディスク上のファイルを再読み込みすることはありません。開いているシーンを手作業で編集しても、エラーなしで変更が失われます。 - ツールは、ファイルを使ったワークフローで手作業が必要になる以下の処理を行います。
inspector::Nodesの登録、core-schema::Name、inspector::TransformConfig、entity-names.ts、エンティティ ID の割り当て、コア以外のコンポーネントのjsonSchema。 - すべての変更はユーザーが元に戻せます(Ctrl+Z/アシスタントの Undo AI changes ボタン)。ファイル編集は元に戻せません。
判断手順 — 該当する最初の項目を選んでください。
- ツールがあり、応答している(
get_selectionまたはget_scene_settingsが応答する状態です。エディター経由のツールで確認してください。外部クライアントからは、シーンが開いていてもscene_stateはNo scene is open.と応答します。Gotchas を参照してください)→ すべてのエンティティ/コンポーネント/設定の変更にツールを使います。コンポジットは読み取り専用の照合に限り、ディスクから読み込んでください。 - ツールはあるが失敗する(
No editor window is open.、接続拒否、401)→ Creator Hub が閉じているか、再起動されている(URL とトークンは起動ごとに変わります)か、シーンが開いていません。その旨を伝え、Creator Hub でシーンを開くよう依頼してください(または接続スニペットを再コピーしてもらってください)。黙ってファイル編集に切り替えないでください。 - ツールはないが、ユーザーは Creator Hub を利用できる → MCP が安全な方法であることを伝え、
reference/connect.mdを案内してください。ユーザーが断った場合に限り、かつ Creator Hub でシーンを閉じた状態でのみ、ファイルを手作業で編集してください(その場合は composites スキルの編集モードに関するルールがすべて適用されます)。シーンが開いている(または開いている可能性がある)場合は、3 つの選択肢 — シーンを閉じる、MCP に接続する、コードで作成する静的エンティティ(エディターには表示されません)を明示的に許可する — を提示し、回答を待ってください。その間、回答に依存しない作業は先に進めてください。コードによる代替手段を自分で選んではいけません。対話のないセッションでも同様です。2026-10-23 のセッションでは質問せずにsrc/で部屋全体を構築し、クリエイターに拒否されました。正式なルールは sdk-scenes → Agent Behavioral Guidelines の項目 5 です。 - Creator Hub を利用しない(CLI のみのプロジェクト、CI)→ composites スキルのファイルワークフローを適用します。
ファイル上にあり、直接編集してよいもの:src/**(シーンコード。保存すると自動的に再ビルドされます)、assets/Scripts/*.tsx(スクリプトコンポーネント — ファイルを書き込んでから attach_script を実行します)、および assets/Models/、assets/Images/ などの下に追加するアセットファイル。
静的ジオメトリはエディターのものです。src/のものではありません。 壁、床、家具、装飾品(プリミティブでもGLBでも)は、これらのツール(create_entity + set_component MeshRenderer / GltfContainer、またはplace_smart_item)を使ってシーンに追加します。シーンコード内でengine.addEntity()を呼び出してはいけません。コードで構築した部屋はプレビューには表示されますが、Hubのビューポートやエンティティツリーでは見えず、選択もできません。その結果、作成者は最初に「自分のオフィスはどこですか?」と尋ねることになります(2026-10-08:やり直しに約60回のset_component呼び出しが必要でした)。これは、MCPを通じて適用するsdk-scenesのコンポジット優先ルールです。MCPを使わず、シーンを開いている場合も同じです。作業を止めて確認してください(ラダーの3行目)。コードで構築した静的ジオメトリが許容されるのは、作成者が明示的にそれを選んだ場合に限ります(2026-10-23:あるセッションで確認せずに部屋、椅子、約60個の装飾品をコードで構築したところ、作成者は「警告なしにこれを行うのは絶対にやめてください」と述べました)。
保存したからといって、実行中のバンドルに変更が反映された証拠にはなりません。 プレビューの開発サーバー(sdk-commands start)はsrc/**を監視し、保存のたびにbin/index.jsを書き換えます(@dcl/sdk-commandsのlogic/bundle.ts)。開発サーバーの実行中に手動でsdk-commands buildを行うと、同じファイルに書き込み、競合します。また、編集中に保存すると、書きかけのコードがバンドルされてSyntaxErrorが発生し、シーンの読み込みが解除されます。unity-explorer-mcpの変更ごとに1回だけ書き込むルールが適用されます。変更した内容がワールド内に表示されない場合は、シーンのデバッグを始める前に、編集箇所に含まれる文字列リテラルをbin/index.js内でgrepしてください。見つからなければ、ファイルに変更を加え、次のBundle savedが表示されるまで待ちます。(2026-10のセッション:あるエージェントが変更を完了したと報告しましたが、古いバンドルにはその変更が含まれておらず、作成者が気づきました。)
RULE — 標準的なオブジェクトを手動で組み立てる前に、カタログを検索してください
エンティティを作成し、create_entity と set_component でコンポーネントを手動で組み立てる前に、必ず最初に search_catalog を実行して、そのオブジェクトに対応する Smart Item がすでに存在するか確認してください。特に、次のものが対象です。
- ライト — カタログには Spot Light と Point Light の Smart Item(カテゴリ
lights)があり、実際の GLB モデル、設定済みのLightSourceコンポーネント、組み込みの Turn On/Turn Off/Toggle アクションが含まれています。LightSourceエンティティを手動で作成すると、ビジュアルモデル、インスペクターとの連携、アクションの配線が不足します。 - インタラクティブな家具 — ドア、椅子、プラットフォーム、チェスト、ボタン、レバーなど。新しいスクリプトベースのアイテム:Floor Pressure Button(
buttons。誰かが乗っている間押された状態になり、デフォルトでは全プレイヤーで共有)、Button Pedestal(buttons)、Lab Vault Door/Lab Capsule Door(doors)、Lab Stair Platform(platforms、ピストン)、Water Plane/Water Cylinder(materials。プレイヤーが入ると水しぶきが上がります)。 - メディア — スクリーン、画像ディスプレイ、NFT フレーム。
- トリガー — トリガー領域、クリックトリガー。
utilsカテゴリには 「Trigger Area」(e9fa0eab-44de-4efe-af77-a71171a1a73f)というアイテムがちょうど 1 つあります。これはスクリプトベースのアイテムで、ユーザーが配置してサイズを変更する透明なボックスまたは球体です。コントロールから AI アシスタントの作成欄にプロンプトを設定でき、進入時/退出時に何が起こるべきかを記述します。同じ名前の古い非スクリプトアイテム(1ab2733f-1782-4521-9eda-6aa8ad684277)と、一時的なラベル「Trigger Area (Script)」は、どちらも creator-hube43441b5で削除されています。どちらも検索しないでください。
place_smart_item は、手動の set_component 呼び出しでは不足する定型処理をすべて行います。
- アイテムの GLB ファイルをダウンロードし、
asset-packs::Placeholderをディスク上の実際のパス(例:assets/asset-packs/spotlight/spotlight.glb)に解決します。 asset-packs::Script、asset-packs::Actions、inspector::Configコンポーネントを設定し、設定可能なアクションとトリガーを備えた状態で Creator Hub UI 上でアイテムが動作するようにします。- エンティティを
inspector::Nodesに自動的に登録します。
要件に合うカタログアイテムがない場合に限り、手動で構築してください。
ユーザーがすでに持っているメディアの場合は、Local Assets タブからビューポートにドラッグするよう伝えてください。 creator-hub 062ed0a2 以降、これが最も速い方法です。ファイルを参照する カタログアイテム が生成され、単なるコンポーネントではありません。そのため、エンティティには、手動配置したアイテムと同じコンポーネント一式と基本ビューの inspector::Config が設定されます。
| ドロップするファイル | 生成されるアイテム | 参照先が変更されるもの |
|---|---|---|
.png / .jpg / .jpeg | Image(37460a1e-affc-4f87-b725-118cc11d86fc) | Material の PBR テクスチャ src。また、地面に半分埋まらず地面に立つよう、平面も +0.5 m 持ち上げられます |
.mp3 / .ogg / .wav | Ambient Sound - Forest Birds(5c8b4646-6ec0-41a0-8e9b-415a58728a9e) | AudioSource.audioClipUrl |
.mp4 | Video Screen(0201653b-bd38-48af-b9ef-a902a7e8bc9c) | VideoPlayer.src および asset-packs::VideoScreen.defaultURL。実行時に管理者向けメッセージバスが defaultURL から src を再設定するため、src だけを設定しても通知なく元に戻ります |
エンティティ名は拡張子を除いたファイル名になり、既存の名前と重複する場合は重複しない名前が付けられます。また、インポート時にはテンプレート固有のプレースホルダーメディアファイルは除外されます。.glb/.gltf は引き続き通常のモデルとしてドロップされます。ツールを使って(同じアセット ID で place_smart_item を実行し、続けて上記のフィールドを set_component で設定して)同じことを実現できますが、ユーザーにとってはドラッグのほうが手早く済むため、キーボードを使っている場合はドラッグを優先してください。
ツールカタログ
creator-hub サーバー(packages/creator-hub/main/src/modules/scene-mcp.ts)に登録されている名前です。
| グループ | ツール | 説明 |
|---|---|---|
| 読み取り | get_project_info | scene.json のメタデータ(名前、区画、ベース、スポーン地点)、SDK バージョン、依存関係を取得します。Step 0 の境界確認に使用します。 |
| 読み取り | scene_state | 作成済みエンティティの一覧です。id、名前、種類、ワールド変換、コンポーネント一覧、GLTF src、Smart Item フラグが含まれます。先頭の 200 エンティティまでに切り詰められます。 |
| 読み取り | entity_detail | id または Name を指定して、1 つのエンティティ上にあるすべてのコンポーネント値を取得します。set_component の前に、コンポーネントの正確な形式を確認するために呼び出します。 |
| 読み取り | get_selection | エディターで現在選択されているエンティティを取得します。操作の前にこれを使って、「これ」/「選択されているもの」を特定します。Scene ルートは報告されません(creator-hub d25eff1b8)。ルートだけが選択されている場合、何も選択されていない場合と同様に結果は空になります。したがって、結果が空でもユーザーがすべての選択を解除したとは限らず、「これ」がシーン全体を指す場合があります。Player と Camera は通常どおり報告されます。 |
| 読み取り | get_scene_metrics | シーンごとの上限に対するライブ予算(トライアングル、エンティティ、ボディ、マテリアル、テクスチャ)と、境界外のエンティティを取得します。 |
| 読み取り | editor_screenshot | エディターのビューポート画像を取得します(プレビューは不要です)。 |
| 変更 | create_entity | 新しいエンティティを作成します。name と parent id は省略可能です。id を返します。 |
| 変更 | remove_entity | エンティティとその子エンティティを削除します。 |
| 変更 | set_parent | 親を変更します(ワールド位置は維持されます)。parent: 0 はシーンルートを指します。 |
| 変更 | set_component | コンポーネントを作成または更新します。component には短縮名(Transform)または完全名(core::GltfContainer)を指定できます。value は composite が保存するものと同じ JSON です。更新時、渡したキーはマージされます。 |
| 変更 | remove_component | 名前を指定してコンポーネントを削除します。 |
| アセット | search_catalog | Creator Hub のアセットパックカタログを名前/カテゴリ/タグで検索します。名前に反して、静的アイテムと Smart Items の両方が対象です。すべてを一覧表示するには query を省略します。カテゴリには buildings(建物全体。structures の後に表示)と materials(Water Plane/Water Cylinder アイテム)、およびAvatar Animations パック(45 個の _emote.glb クリップと 32 個の組み込みエモート名)があります。これらはファイルのみのアセットです。place_smart_item を参照してください。同じ追加項目は、オフラインの add-3d-models → references/asset-pack-catalog.md と avatar-animations → references/animation-catalog.md にも掲載されています。**名前、カテゴリ、タグ、キャプションは生成されたメタデータであり、プレビューではありません。**たとえば、search_catalog で "man" を検索すると Human(decorations、タグ man, person, figure, humanoid…、キャプション "Human figure in mid-action")が返されますが、その GLB は 3D 文字の HUMAN です(packs/cyberpunk/assets/human/Word_Human.glb、creator-hub origin/main 2026-10-19。2026-10-12 のセッションではキャラクターとして配置)。見たことのないアイテムを配置する前に、ダウンロード後の assets/asset-packs/<pkg>/ 内で data.json の隣にある thumbnail.png、または creator-hub リポジトリ内の packages/asset-packs/packs/<pack>/assets/<item>/ にある thumbnail.png を確認するか、add-3d-models の GLB 境界ボックス監査を実行してください。 |
| アセット | place_smart_item | assetId でカタログアイテムをワールド position(既定値は 8,0,8)に配置します。アイテムのファイルを assets/asset-packs/<pkg>/ にダウンロードし、スポーンさせます。Smart Items には動作が付属します。現在、ほとんどのアイテムは asset-packs::Script コードとして配置されます(Triggers はありません)。Script の params で設定し、省略可能な ActionCallback params を使って「When X」フックを接続してください。script-components を参照してください。ファイルのみのアセット(Avatar Animations パック。配置するエンティティはありません)は拒否されます。組み込みエモートの場合、エラーには使用すべき triggerEmote({ predefinedEmote }) 呼び出しが示されます。クリップの場合は、ユーザーにカードをビューポートへドラッグするよう依頼してください(ファイルが assets/asset-packs/<pkg>/ に追加されますが、エンティティは作成されません)。または avatar-animations → references/animation-catalog.md に従ってダウンロードし、コードから triggerSceneEmote で再生してください。 |
| スクリプト | attach_script | ファイルを参照する asset-packs::Script コンポーネントを追加します。先にファイルを作成してから(assets/Scripts/ 内)、これを呼び出してください。priority は省略可能です。 |
| 設定 | get_scene_settings / set_scene_settings | scene.json のフィールド(名前、説明、カテゴリ、タグ、年齢制限、スポーン地点、スカイボックス、地形、layout.parcels、フラグ)を読み取り/変更します。渡した各フィールドは現在の値全体を置き換えるため、先に読み取ってください。spawnPoints は決して渡さないでください。入力には scene.json の形式を使いますが、変換されずにメタデータコンポーネントへ渡され、データレイヤーが壊れるか、scene.json に "position": {} が書き込まれます。代わりに、下記のデータレイヤールールを参照し、エンティティ 0 に対して set_component を使ってスポーン地点を書き込んでください。thumbnail はこのツールの入力スキーマに含まれていません(thumbnail キーは黙って破棄されます)。エンティティ 0 の inspector::SceneMetadata-v* に対する set_component、またはエディターの Scene settings → Thumbnail で設定してください。また、assets/Images/autogenerated-thumbnail.png にカバー画像を決して書き込まないでください。Gotchas を参照してください。 |
| プレビュー | launch_preview、preview_status、stop_preview | MCP サーバーを有効にして、Decentraland Explorer でシーンを起動/確認/停止します。 |
| プレビュー | explorer_<name>(動的)、explorer_call | プレビューの実行中、Explorer のランタイムツール(explorer_screenshot、explorer_walk、explorer_click_entity、explorer_get_scene_logs、…)が動的に登録されます。まだ表示されていない場合は、代わりに explorer_call(tool, arguments) を使ってください。 |
| チャット | ask_user | Creator Hub チャットに表示される質問への回答を待機します。埋め込みアシスタント内でのみ意味があります。回答がない場合、10 分後にタイムアウトし、却下として処理されます(packages/creator-hub/main/src/modules/scene-mcp.ts の ASK_TIMEOUT_MS = 10 * 60_000。origin/main 2026-10-15 で確認)。タイムアウトすると、プロンプトはチャット内でも閉じられ(「この質問は現在有効ではありません。」)、その後に届いた回答は破棄されます。タイムアウトした ask_user に後から回答することはできません(creator-hub dc9d076be)。作成者が離席している可能性がある場合、これを待ってターンを止めないでください。代わりに、最終メッセージに質問を記載してください。 |
ワークフロー
書き込む前に読み取ってください。 区画については get_project_info を使います(境界は composites スキルのステップ 0 とまったく同じ方法で計算してください。ツールはエンティティがシーンの外に配置されるのを防ぎません。また、get_scene_metrics は見た目ほど頼れる安全策ではありません。下記の Bevy レンダラーに関する注意事項を参照してください)。何が存在するかを確認し、名前の重複を避けるには scene_state を使います。ユーザーのリクエストが選択中のものに言及している場合は、必ず get_selection を使います。
モデルの追加。
- カタログアイテム →
search_catalogの後にplace_smart_itemを使います。ファイルは自動的にassets/asset-packs/<pkg>/に配置されます。 - 建築物(部屋、廊下、出入口など、アバターが通り抜けたり入ったりするもの)→ 配置前に三人称カメラ向けの外形寸法を設定します。現実的な寸法はゲーム内では窮屈に見えます。寸法については add-3d-models →「ルール:三人称カメラ向けに室内を拡大する」を参照してください。
- ユーザーがすでに持っているモデル、または自分で作成したモデル → GLB を
assets/Models/に配置し(Blender での作成方法とバウンディングボックスの監査については add-3d-models スキルを参照)、create_entity(nameを指定)、set_componentのTransform({position:{x,y,z}, rotation:{x,y,z,w}, scale:{x,y,z}})、set_componentのcore::GltfContainer({src, visibleMeshesCollisionMask, invisibleMeshesCollisionMask}。マスクのルール、およびアニメーションとコライダーの確認については、引き続き add-3d-models を適用します。GLB にクリップがある場合はcore::Animatorも追加します)を使います。 - ライト → カテゴリ
lightsを指定してsearch_catalogを使い、Spotlight と Point Light の Smart Item を探してから、place_smart_itemを使います。これらにはライトモデル、LightSource、切り替えアクションが含まれています。非表示の光源や標準外のパラメーターが必要な場合に限り、手動でLightSourceエンティティだけを作成します。LightSourceAPI 全体と Smart Item のルールについては lighting-environment を参照してください。 - そのモデルへの動作 → 適した Smart Item があればそれを使います(まず
search_catalogを実行してください)。なければ、assets/Scripts/にスクリプトを作成してattach_scriptを使います(ルールは script-components を参照)。または、src/のコードからエンティティ名を参照します(engine.getEntityOrNullByName)。
コンポーネントの形状。 set_component は実際のスキーマに照らして検証します。あるコンポーネント型を初めて書き込む前に、その型をすでに持つ任意のエンティティに対して entity_detail を実行するか、composites 形式カタログの該当項目を読み取ってください。asset-packs::Script の場合、パラメーターは layout 内で位置指定されます(script-components を参照)。attach_script を優先し、エディターに layout を作成させてください。
書き込み後。 データレイヤーが稼働している間は、書き込み後の読み取りは安全です。サーバーは変更処理から戻る前に自動保存を待機するため、直後の scene_state は最新の状態になります。次のルールにあるとおり、そのプロセスが終了した時点で安全ではなくなります。そのため、以下の確認はツールの応答ではなくディスク上で行います。ジオメトリを追加した場合は get_scene_metrics で確認します。プレビューを使わずに結果を見るには editor_screenshot を使います。実行中のシーンが必要な場合は launch_preview と explorer_* を使います(歩行、クリック、ログ、FPS)。unity-explorer-mcp スキルに記載された反復ループ、カメラのフレーミング、パフォーマンスに関する参考情報は、変更せずに explorer_* ツールに適用されます。このスキルのセットアップセクションはスキップしてください(claude mcp add もバインドゲートも不要です)。ツールは creator-hub サーバー経由で利用できます。完了したら、カメラをシーンの想定された通常モード(シーンの都合で一人称が必要な場合を除き三人称)にしておきます。確認のためだけに起動した場合は stop_preview を実行してください。
ランタイムの状態を確認できない場合は、その旨を一度だけ伝え、確認できない内容にラベルを付けてください。 外部クライアントからは explorer_* ツールは一切表示されません。また、unity-explorer-mcp サーバーが接続を拒否する場合は、Explorer が起動していないという意味にすぎません(そのスキルのセットアップで起動します)。セットアップを提案してください。スクリーンショットを確認するか、制作者が視覚的な結果を確認するまでは、完了したとは報告せず、「スクリーンの平面はベゼルの内側に収まっているはずです。実際には確認していません」のように、未確認であることを明示してください。同じシーンで行われた2つのセッション(2026-10)では、モニターの前に浮かぶスクリーン、ドア枠にめり込むドア、壁のZファイティング、白いマテリアルといった視覚上の不具合がすべて最初にオーナーへ報告されました。それ以前はコードだけを根拠に修正済みと報告されていたためです。
エディターが所有するエンティティの配置をコードで固定しないでください。 シーンコードがエディター所有のエンティティの Transform を読み込みのたびに書き換えて、その配置を「修正」すると、制作者がその後Hubで行う移動がすべて、気づかれないまま上書きされます。ある制作者がトレイをベルトに移動したのに、空中の2 m離れた位置に何度も戻ってしまいました(オーナーから報告された症状。原因はシーン自体のコードで確認、2026-10-11)。コードでエディター所有のエンティティの Transform を読み取ることはできます。独自の配置が必要な場合は、そのエンティティ専用のエンティティを作成してください。
ネストされたエンティティのTransformは親ローカル座標です。 Hubによってグループの下にネストされたエンティティの Transform.position は、シーン基準ではなく、そのグループ基準で報告されます。そのため、位置を距離の判定に使うときや、その隣に何かを配置するときは、親の階層をたどって位置を解決してください(assets/scene/main.composite で確認、2026-10-11。そのシーンではグループが原点にあったため、問題は発生しませんでした)。
誤操作。 元に戻す操作はユーザーが行います。何を元に戻すべきか伝えるか、remove_entity / set_component で以前の値に戻してください。main.composite を編集して誤操作を「修復」してはいけません。
ルール — 変更をまとめて適用した後、ディスクに書き込まれたことを確認してください。データレイヤーは気づかれないまま停止することがあります
エディターのエンジンを保持し、assets/scene/main.composite に書き込むのは @dcl/inspector data layer です。Bevy レンダラーでは、このレイヤーは別の子プロセスとして実行されます。アプリのログでは [UtilityProcess] Running "sdk-commands start --port <n> --no-browser --no-client --data-layer" と記録されます(main/src/modules/bevy-realm.ts で組み立てられます。ポートは一時的なもので、実行ファイルはシーンの node_modules/@dcl/sdk-commands にあります)。Babylon レンダラーでは、同じデータレイヤーがインスペクターのiframe内で実行されます。どちらの場合も、Electronのメインプロセスはコンポジットを書き込みません。読み取るだけです。
データレイヤーが停止しても、Electronアプリ内のMCPサーバーは起動したままで、何も問題がないかのようにすべての呼び出しへの応答を続けます。ツールの結果から、シーンの変更が止まったことはわかりません。
そのため、変更をまとめて適用した後は、ツールではなくファイルを確認してください。 assets/scene/main.composite の更新時刻が進んでいる必要があります(ls -l/stat)。一連の変更を適用しても更新時刻が変わっていない場合、その編集は停止したプロセス内にしか存在していません。
stat -f '%m %N' "assets/scene/main.composite" # macOS; coreutils: stat -c '%Y %n'
(Get-Item "assets\scene\main.composite").LastWriteTime # Windows (PowerShell)
データレイヤー停止時に確認された症状(2026-10-08のセッション。更新時刻が古い場合は、次の項目を確認してください)。
set_component、create_entity、place_smart_itemなどはすべて、引き続き成功を返します。scene_state/entity_detailはクラッシュ前の値を返し続けます。書き込みを「確認」するための読み戻しで、古いスナップショットを確認していることになります。editor_screenshotは空白の画像を返します。get_scene_metricsは、空のentitiesOutOfBoundariesとともにすべてゼロを返しました。ただし、これを停止の判定に使わないでください。 Bevy レンダラーでは、これらのフィールドはそもそもゼロがハードコードされています(「注意点」を参照)。更新時刻の確認が信頼できる方法です。 復旧はユーザー自身で行う必要があり、メモリ内の編集内容は失われます。 データレイヤーを再起動するツールはありません。書き込みを停止し、Creator Hub のメインログ(macOS:~/Library/Logs/creator-hub/main.log、Windows:%APPDATA%\creator-hub\logs\main.log)でExiting "sdk-commands start … --data-layer" … exit code=1の行を確認してください。ざっと見るのではなく、grep -n "exit code=1\|reading 'deserialize'" main.logを実行してください。2026-10-08 のセッションでは、241 KB の grep 結果の中にクラッシュ行があり、最初の 2 KB だけが確認されました。クリエイターには、Creator Hub でシーンを閉じて再度開き、クラッシュ以降に行ったすべての変更を再適用するよう伝えてください。ディスク上のコンポジットと照合し、どこまでが正しい状態なのかを確認します。エディターページを離れると、そのシーンのプレビューサーバーも停止します(Hub のEditorPageにあるhandleBack→killPreview)。そのため、再度開いた後、クリエイターがもう一度 Play を押すか、あなたがlaunch_previewを再度呼び出してから、ゲーム内に新しい内容が反映されているかを確認してください。
set_scene_settings と spawnPoints の組み合わせでデータレイヤーが停止したり、位置が空になったりする理由(ソースを確認:creator-hub origin/main d25eff1b 2026-10-19、@dcl/ecs main)。 ツールの入力スキーマでは、scene.json の形式で position を受け取ります(x: number | [min, max]、main/src/modules/scene-mcp.ts)。インスペクターのハンドラーはパッチをそのままルートエンティティの inspector::SceneMetadata-v* コンポーネントにマージします({ ...current, ...patch }、packages/inspector/src/lib/rpc/scene/server.ts)。このコンポーネントの position.x/y/z は Schemas.OneOf({ single, range }) であり、{ $case: 'single', value: 8 } または { $case: 'range', value: [a, b] } を想定しています(lib/sdk/components/SceneMetadata.ts)。一方の形式を他方に変換する処理はないため、単なる数値が OneOf のスロットに入り、CRDT シリアライザーは $case を見つけられません。Hub のインスペクター自体は @dcl/ecs 7.29.0(ルートの package.json)を使用しており、$case のない値に対して OneOf シリアライザーは空のケースを書き込みます(js-sdk-toolchain 0dce4d2d、#1570、7.28.0+ に同梱)。その後の動作は、シーン自体の node_modules/@dcl/inspector データレイヤーによって異なります。@dcl/ecs が 7.28.0 より古い場合、その OneOf デシリアライザーは空のケースを読み取れず(specs[specKeys[0 - 1]] が undefined)、データレイヤーが停止します。これは tooling-entrypoint.js(Object.deserialize → updateFromCrdt → receiveMessages)の TypeError: Cannot read properties of undefined (reading 'deserialize') に該当し、2026-10-08 に点の値を持つスポーンポイントで 2 回確認されました。原因は、Hub の書き込み側とシーンの古い読み取り側とのバージョンの不一致です。@dcl/ecs のバージョンが一致している場合、書き込みは成功しますが、読み戻すと {} になり、データレイヤーの scene.json ライター(data-layer/host/utils/component.ts)が "position": {} を出力します。Creator Hub 0.51.0(2026-10)で 2 回確認され、その間も get_scene_settings では正しい形式の値が表示されていました。点の値と範囲の値の両方が影響を受けます。このスキルの以前のバージョンで範囲の値だけを疑っていたのは誤りです。
そのため、set_component を使って、コンポーネント固有の形式でエンティティ 0 にスポーンポイントを書き込んでください。これは「注意点」でサムネイルを設定するときと同じ方法です。バージョン付きのコンポーネント名を entity_detail(0) から取得し、spawnPoints キーだけを渡します。
{"spawnPoints": [{"name": "spawn", "default": true,
"position": {"x": {"$case": "single", "value": 8}, "y": {"$case": "single", "value": 0}, "z": {"$case": "single", "value": 8}},
"cameraTarget": {"x": 8, "y": 1, "z": 12}}]}
範囲軸は {"$case": "range", "value": [4, 12]} です。続いて scene.json を読み戻し(次の自動保存で更新されます)、すべての spawnPoints[].position に数値が含まれていることを確認してください。値が {} になった場合は、Hub でシーンを閉じて scene.json を手動で修正してください。次に開いたとき、データレイヤーは scene.json から SceneMetadata を再初期化します(overrideWithSceneJson、data-layer/host/composite-provider.ts)。そのため手動編集が優先され、コンポジットのコピーもその内容で更新されます。シーンを閉じた状態で編集した他のシーン設定も同様です。形式の不一致は Hub のバグです。使用中のバージョンにもこの問題が残っている場合は、report-sdk-issue で報告してください。
プレビューのライフサイクル — stop_preview は Explorer を閉じません
stop_previewはExplorerを閉じません。これは仕様であり、閉じるツールはありません。 main/src/modules/explorer-gateway.tsで確認済みです。MCPクライアント/トランスポートを閉じ、sdk-commands start --explorer-alpha --hub … --mcp --mcp-port <n>の子プロセスに対してtreeKillを実行し([UtilityProcess] Killing process "…"と記録されます)、その後{ok: true}を返します。Explorerアプリはそのプロセスツリーには含まれません。sdk-commandsはopen decentraland://…でExplorerを起動し、OSに処理を引き渡して終了します。また、Creator HubにもExplorerを終了させる処理はありません。
preview_statusも終了を検知しません。runningは、ゲートウェイオブジェクトが存在することと、同じsdk-commandsハンドルに対するchild.alive()から算出されます。Explorerやそのポートを調べているわけではありません。つまり、「プレビューが実行されていない」というのは開発サーバーについての記述であり、アプリについてではありません。
次の起動が失敗する理由について、まず確認済みの内容を示します。launch_previewを呼び出すたびに新しいエフェメラルMCPポートが割り当てられ([Gateway] launching preview … with MCP on :53880)、それが--mcp-portとして渡されます。デスクトップ版Explorerはシングルインスタンスなので、2回目の起動で渡されるディープリンクは、すでに開いているウィンドウに渡されます。推測(Explorerのソースから確認したものではありません)ですが、開いているウィンドウは古いポートのMCPを維持し、新しいポートにはバインドしないと考えられます。いずれにしても、約45秒間のリトライ後、Hubは次のメッセージを返します。
プレビューは起動しましたが、MCPサーバーから応答がありませんでした。Explorerはまだ起動中か、またはこのビルドがMCPをサポートしていない可能性があります。(TypeError: fetch failed)
なお、この失敗時の処理では、起動したばかりの開発サーバーも終了させてしまうため、Explorerは停止したrealm上に取り残されます。2026-10-08に確認:2回連続で起動すると再現しました。(関連情報:Explorerは起動していても準備ができていない場合があり、その間preview_statusは最大90秒ポーリングで待機することがあります。そのため、ここで長時間応答がないからといってクラッシュとは限りません。)
launch_preview/preview_statusでのTool call interrupted: the session ended…は、プレビューの失敗ではなく、クリエイターがターンを停止したことを示します。 どちらのツールも長時間ブロックします(起動時はExplorerのMCPを約45秒間リトライし、ステータス確認では最大90秒ポーリングします)。埋め込みアシスタント内では、その間にチャットの停止ボタンがCLIの子プロセスを終了します(aiStop → killTree、main/src/modules/ai.ts)。そのため、ツール呼び出しは中断されたと報告します。2026-10-08に1セッションで4回中断されましたが、毎回クリエイターの次のメッセージと同時に発生しており、エージェントが起動したプレビューはその間ずっと実行されていました。結論を出す前に、pgrepでExplorerを確認してログを読みましょう。また、このケースのように、プロジェクトのメモに「launch_previewがセッションを終了させる」と書かないでください。
ルール — launch_previewを実行する前に、ツールとOSの両方を確認してください。
pgrep -fl '[M]acOS/Explorer' # the Explorer app itself
pgrep -fl '[d]cl_watchdog' # its watchdog, from /Applications/Decentraland.app
これらのパターンでは角括弧をそのままにしてください。pgrep -f/pkill -fは、各プロセスのコマンドライン全体に対して照合します。また、多くのエージェント用シェルツールはコマンドをbash -c "<command>"として実行するため、単純なパターンではラッパーシェルにも一致します。その結果、Explorerが存在しないのに実行中と判定されたり、実行中のシェルがpkillで終了したりします。[d]cl_watchdogなら実際のプロセスには一致しますが、コマンドテキストそのものには一致しません。
逆のことも起こります。クリエイターがExplorerのウィンドウを閉じても、preview_statusはrunning: trueを返し続けます。 sdk-commandsの子プロセスはまだ生きているため、ハンドルは実行中と判定しますが、すべてのexplorer_*呼び出しはfetch failedで失敗します(2026-10-12に確認)。そのため、fetch failedが続く場合は「アプリが終了した」という意味であり、「シーンが壊れている」という意味ではありません。pgrep -fl '[M]acOS/Explorer'で確認してから、復旧のためにstop_previewを実行し、その後launch_previewを1回だけ実行してください。どちらの場合もルールは同じです。Explorerが実行中かどうかを確実に確認できるのはpgrepだけです。
preview_statusが「実行されていない」と報告しても、Explorerが閉じている証拠にはなりません。どちらかのプロセスが生きていて、プレビューをクリーンな状態にする必要がある場合は、古いインスタンスを閉じ、終了したことを確認してから、launch_previewを1回だけ実行してください。
pkill -f '[d]cl_watchdog'; pkill -f '[D]ecentraland.app/Contents/MacOS/Explorer'
for i in $(seq 1 30); do pgrep -f '[M]acOS/Explorer' >/dev/null || break; sleep 1; done # wait up to 30 s
Windows では、Explorer は Decentraland.exe、watchdog は dcl_watchdog.exe です。PowerShell では、プロセス名で照合するため、実行中のシェルには一致しません。
Get-Process Decentraland, dcl_watchdog -ErrorAction SilentlyContinue # is either alive?
Stop-Process -Name dcl_watchdog -Force -ErrorAction SilentlyContinue # watchdog first: it reacts to a non-zero Explorer exit
Stop-Process -Name Decentraland -Force -ErrorAction SilentlyContinue
Wait-Process -Name Decentraland -Timeout 30 -ErrorAction SilentlyContinue # confirm it exited
その Explorer ウィンドウはクリエイターのものであり、テスト環境ではありません。 explorer_move_to、explorer_reload_scene、カメラモードの変更、ホットリロードを引き起こすアセットファイルの変更など、explorer_* ツールを通じて操作した内容はすべて、クリエイターがプレイしているセッションに反映されます。操作する前に explorer_get_player_state と最近の explorer_get_scene_logs でアクティビティを確認し、見た目の確認には explorer_move_to より explorer_set_camera_pose を優先して使い、見つけたカメラモードに戻してください。詳しいルールは、unity-explorer-mcp スキルのイテレーションループを参照してください(2026-10-10 に確認)。
その後の両方の試行では、最初の接続で成功しました。再起動するより、正常に動作しているプレビューを再利用する(ホットリロードと explorer_reload_scene)ことを優先してください。停止するのは、プレビューが古くなっている場合、または MCP から応答がない場合に限ります。その Explorer ウィンドウをユーザーが使っている場合は、停止する前に確認してください。
ベイクし直した GLB が、実行中のプレビューで古い内容のまま表示されることがあります。 これは開発サーバーの問題ではありません。@dcl/sdk-commands 7.30.1 はコンテンツのリクエストごとにプロジェクトを再走査し、現在のバイト列を no-cache で配信し、各ファイルの ID を mtime に基づいてバージョン管理します。また、Hub が無効化することのない chokidar ウォッチャーも実行します。そのため、古い内容が残る原因は下流の Explorer 独自のアセットキャッシュにあります。2026-10-08 に確認したところ、launch_preview 後に追加または名前を変更した GLB は、explorer_reload_scene(1 件)またはプレビュー全体の再起動(別の 1 件)を行うまでワールド内に表示されませんでした。また、同じ名前で GLB をその場で上書きすると、古いメッシュが表示され続けました。src/ のホットリロードには影響しません。実用上のルールとして、モデルをベイクし直した後は、新しいファイル名で書き出し、GltfContainer.src の参照先を変更してください。この方法では確実に再読み込みされました。それ以外の場合は explorer_reload_scene を実行し、古いメッシュが残る場合はプレビューを再起動してください。(症状:書き出したばかりのメッシュが表示されない、または明らかに古い状態なのに、explorer_get_scene_logs に読み込みエラーがない。.dclignore も確認してください。無視対象のパスは一切配信されません。)
スキルの入手元
これらのスキルがエージェントに届く方法は、前述の2つのセットアップのどちらを使用しているかによって異なります。
Creator Hub の AI アシスタント内では、アプリがスキルをインストールします。手動でコピーしないでください。 インストーラーは packages/creator-hub/main/src/modules/skills.ts にあります。
decentraland/sdk-skillsの main をユーザーごとのキャッシュにダウンロードします(上流のコミット SHA とアプリのバージョンをキーとして使用し、アトミックに切り替わり、オフラインでも動作します)。- そのキャッシュを、開いているシーンの
.claude/skillsと.agents/skillsにシンボリックリンクします。アプリが作成したリンクは.gitignoreに追加されます。ユーザーがすでに実体のあるskillsディレクトリを持っている場合は、各スキルを個別にリンクし、ユーザーがすでに所有している名前はスキップします。
このセットアップでは、スキルのディレクトリをシーンにコピーしたり、ユーザーにコピーするよう指示したりしないでください。手動で配置したコピーは管理対象のシンボリックリンクより優先され、その後、気づかないうちに古くなってしまいます。更新を行うのはアプリです。
外部クライアント(Claude Code CLI、VS Code 拡張機能、Cursor、Codex、Claude Desktop など)では、スキルはユーザーがインストールします。 MCP の設定スニペットで接続できるのはツールだけで、スキルは含まれません。次の2つのケースがあります。
-
Creator Hub で現在シーンを開いている場合、アプリ管理の
.claude/skills/.agents/skillsのシンボリックリンクはすでにシーンのフォルダーに存在するため、そのフォルダー内で開始した Claude Code セッションはそれらを読み込みます。重複して配置しないでください。 -
それ以外の場合(作業ディレクトリが異なる、Creator Hub でシーンを開いていない、またはスキルを別の場所から読み込むクライアントを使用している場合)は、シーンのフォルダーまたはユーザーのスキルルートから通常の方法でインストールします。
npx skills add decentraland/sdk-skills --all同じコマンドを再実行すると更新できます。
npx skills updateはすでに存在するスキルのみを更新するため、新たに追加されたスキルは取得できません。スキルごとのインストール方法については、リポジトリの README を参照してください。
アプリがリンクするスキルセットは、拒否リストに登録されたスキルを除外したものです。 そのため、Hub がリンクしたフォルダー内の Claude Code セッションには deploy-scene / deploy-worlds がありません(2026-10 のセッションでは Worlds のデプロイコマンドをウェブ検索し、代わりに worldConfiguration を手書きしました)。これらはシンボリックリンクされたフォルダーではなく、ユーザー向けにインストールしてください(ユーザーレベルの場合は npx skills add decentraland/sdk-skills --skill deploy-worlds -g)。または、簡単な方法として、scene.json に worldConfiguration.name を追加し、続いて npx @dcl/sdk-commands deploy --target-content https://worlds-content-server.decentraland.org を実行します。サムネイル、2つの名前/説明/サムネイルのセット、およびエラーテーブルについては deploy-worlds を参照してください。
Creator Hub エージェントでは、4つのスキルが意図的に拒否リストに登録されています。 create-scene、deploy-scene、deploy-worlds、migrate-sdk6-to-sdk7 です。Creator Hub は独自の UI でスキャフォールディングと公開を行い、SDK7 のみをサポートします。インストーラーは、次の2通りの方法でこれらに対処します。
- 拒否リストに登録されたスキルに補助ファイルがある場合(
create-scene、migrate-sdk6-to-sdk7)、SKILL.mdを含めずに配布します。ほかのスキルからの相対パスでreferences/は引き続き解決できますが、そのスキル自体が起動することはありません。 - 拒否リストに登録されたスキルのディレクトリに
SKILL.md以外のファイルがない場合(deploy-scene、deploy-worlds)、完全にスキップされます。
Creator Hub 内でユーザーがプロジェクトのスキャフォールディングや公開を求めた場合は、これらのスキルを読み込んだり再構築したりするのではなく、アプリ独自の手順を案内してください。外部クライアントから手動で npx skills add を実行してインストールする場合は、拒否リストの対象ではありません。4つすべてのスキルを利用できます。
注意点
-
Creator Hubを起動するたびにURLとトークンがローテーションします。 昨日動作した設定でも、今日は
ECONNREFUSEDや401が返ることがあります。再試行するのではなく、Settingsからスニペットをコピーし直してください。 -
一度に開けるプロジェクトは1つです。 サーバーは、単一のエディターウィンドウで開いているシーンを操作します。シーン一覧を表示しているとき、変更ツールは
No editor window is open.と応答します。 -
外部クライアントからは、シーンが画面上で開いていても、ディスク読み取りツールと
launch_previewがNo scene is open.を返します。 プロジェクトディレクトリは、埋め込みアシスタントがターンを開始したときに限り、get_project_info/scene_state/entity_detail/launch_previewにバインドされます(main/src/modules/ai.tsから呼び出されるsetSceneMcpProject。初回リリースのcreator-hub217e2f9f、PR #1499からorigin/mainのd25eff1b、2026-10-20まで変更なし)。エディター経由のすべての機能(get_selection、get_scene_metrics、get_scene_settings、すべての変更操作、place_smart_item)は問題なく動作します。したがって、外部クライアントからアクセスを確認するときは、get_selection/get_scene_settings、または無害な変更を1つ実行して、上記の複合的なmtimeチェックを使ってください。ディスク読み取りツールで確認してはいけません。オブジェクト一覧の確認には、ディスク上のscene.jsonとassets/scene/main.compositeを読み取り専用で参照し、変更はツール経由で行ってください。ワールド内で確認するには、HubのPlayボタンからプレビューを起動し、Enable MCP Serverにチェックを入れて、unity-explorer-mcpに従って操作します(この経路ではSetupセクションが適用されます。creator-hubサーバー経由で何も届かないため、explorer_*ツールは表示されません)。 -
読み取りツールの結果は、エンジンより自動保存1回分(約100 ms)遅れます。 変更ツールはすでに待機します。読み取り中にユーザーがオブジェクトをドラッグしている場合にだけ影響します。
-
Scene RPC "<tool>" timed out (no renderer response)はHubのエディターRPCの5秒タイムアウトです(renderer/src/modules/rpc/scene/client.tsのREQUEST_TIMEOUT_MS)。クラッシュではなく、インスペクターが時間内に応答しなかったことを示します。BevyエディターがPlay中だったときにcreate_entityで2回発生しています(2026-10-08)。どちらもPlayを停止した後に成功しました。複数の変更を行う前にPlayを停止するよう制作者に依頼し、その後で再試行してください。ファイル編集に切り替えてはいけません。 -
scene_stateが返すエンティティ数は最大200です。 大きなシーンでは、entity_detailで名前を指定して絞り込むか、ディスク上のコンポジットを読み取ってください。 -
Creator Hub内のスキル拒否リスト。 アプリは
decentraland/sdk-skillsをシーン内の.claude/skills/.agents/skillsとしてリンクしますが、create-scene、deploy-scene、deploy-worlds、migrate-sdk6-to-sdk7のSKILL.mdは除外します。この環境では、ひな形作成、公開、SDK6の移行はアプリ独自のフローで行うためです。相互リンク先の参照ファイルは引き続き解決されます。 -
Explorerの
--mcpプレビュー用チェックボックスは、別のサーバーを起動します。 Enable MCP Serverは、Play Optionsポップオーバー(エディターヘッダーのPlayボタンにあるドロップダウン矢印)内で、Desktop Clientの行にカーソルを合わせると開くフライアウトにあります。このチェックボックスは、独自のMCPをポート8123で実行するExplorer(unity-explorer-mcpスキル)を起動し、プロジェクトが@dcl/sdk7.25.0以降の場合にのみ表示されます。ユーザーがチェックボックスを見つけられない場合は、Hubのデバッグを始める前にシーンのSDKバージョンを確認してください。ここで説明するCreator Hub MCPはエディターのサーバーです。埋め込みアシスタント内では、そのチェックボックスではなくlaunch_previewを使ってください。外部クライアントではlaunch_previewが失敗します(上記のNo scene is open.に関する注意点を参照)。そのため、外部クライアントではチェックボックスが使用する経路になります。 -
Ctrl+Zを1回押すと、コンポーネントへの書き込み1回分ではなく、操作1つ分が元に戻ります。 creator-hub
fdc384b5以降、同期的に行われる一連の変更は、まとめて1つの取り消しトランザクションとしてコミットされます(以前は200操作のバッチ上限により、大きな変更が複数の履歴に分割され、Ctrl+Zを1回押すと不要なエンティティが残ることがありました)。Smart Itemのコンポジット配置や、子要素を持つスクリプト付きアイテムなど、複数のエンティティを扱う操作も1つの履歴になりました。追加を取り消すと、Bevyビューポートからもエンティティが削除されます。それでも、ユーザーが取り消す単位に合わせて、変更内容を説明してください。 -
シーンの音声はエディター内でミュートできますが、Bevyの場合に限ります。 ビューポートのツールバーにあるスピーカートグル(Mute scene audio/Unmute scene audio)は、すべての
AudioSource/AudioStreamを音量0でレンダラーに送ります。この状態は再読み込み後も維持されます。シーン音声を再生しないBabylonレンダラーでは、この項目は表示されません。「追加した音が聞こえません」という報告は、コンポーネントに問題がある証拠にはなりません。まずレンダラーとトグルの状態を確認し、ミュート中にBevyビューポートで再生される音量は、設定されたvolumeではないことを伝えてください。 -
Bevyレンダラーでは、
get_scene_metricsから有用な情報は得られません。packages/inspector/src/lib/renderer/bevy/BevyRenderer.tsで確認したところ、getSceneMetrics()は{triangles: 0, bodies: 0, materials: 0, textures: 0}を返し、getEntitiesOutsideLayout()は[]を返します。どちらもハードコードされています(「イントロスペクションできるレンダラーがまだありません。ゼロを報告してください」)。上限自体は有効で、entitiesはレンダラーではなくNodesツリーから算出されます。ただし、コンテンツメトリクスがすべてゼロで、entitiesOutOfBoundariesが空でも、それは「Bevy」を意味し、「シーンが空」でも「問題がある」でもありません。これらから予算やレイアウト範囲外という判定を読み取らないでください。Babylonでは値は実際のもので、computeEntitiesOutsideLayoutは各エンティティのバウンディングメッシュとレイアウトを比較するため、大きすぎるジオメトリも検出します。どちらの場合も、信頼できる予算を確認するには、launch_previewを実行してexplorer_get_scene_content_statsを使ってください。 -
[修正済み] Bevyで公開すると、以前は区画レイアウトの変更が破棄されていました。 Bevyではデータレイヤーがsdk-commandsのrealm内で動作するため、
scene.jsonへの書き込みがHubのストレージRPCを経由せず、Hubにはプロジェクト読み込み時のレイアウトが残っていました。その結果、公開時に古いレイアウトが書き戻され、Scene settingsで変更したシーンも、元の(多くの場合1x1の)レイアウトで公開されていました。creator-hubee43befd0で修正済み(2026年10月)。インスペクターのnotify_scene_metadataレポートにparcelsとbaseが含まれるようになりました。get_project_infoはディスク上のscene.jsonを読み取るため、影響を受けたことはなく、回避策でもありません。この問題が発生する症状が古いHubビルドでも認識できるよう、ここに記載しています。 -
カスタムサムネイルを
assets/Images/autogenerated-thumbnail.pngとして保存してはいけません。 Hubはサムネイルを自動生成するたびに、ビューポートの画像をこの固定パスに保存し、既存のファイルを上書きします。自動生成は公開開始時とプロジェクトカードの更新時に行われます(packages/creator-hub/preload/src/modules/workspace.tsのgetProjectThumbnailPath/saveThumbnail)。そのため、このパスに保存したカバー画像はアップロード直前に置き換えられます。scene.jsonのdisplay.navmapThumbnailを書き換えるのは3つの場合のみです(workspace.tsのsaveThumbnail):項目が未設定、参照先のファイルが存在しない、またはファイル名の大文字・小文字が異なる形で自動生成パスを指定している場合です。大文字・小文字が異なるカスタムカバーはそのまま残ります。macOSとWindowsではどちらの表記でも解決されるため、デプロイ時にだけ失敗します。これが上書きが通知されない理由です。カスタムカバーは別の名前(例:assets/Images/cover.png)で保存し、シーン内の参照先を変更してください。 -
画像アセットは大文字のIを使った
assets/Images/に置き、デプロイ時には大文字・小文字の区別が重要です。 デプロイ対象ファイルの一覧ではディスク上の大文字・小文字が保持され、Catalystはdisplay.navmapThumbnailとの照合で大文字・小文字を区別します。そのため、ディスク上のフォルダーがassets/Images/なのに、scene.jsonでassets/images/...と指定すると、Scene thumbnail 'assets/images/autogenerated-thumbnail.png' must be a file included in the deploymentというエラーとともに公開に失敗します。ローカルでは何も検出されません。macOSとWindowsではどちらの表記でも解決されるため、アップロードするまでシーンは正常に見えます。Hubはデフォルトで自動生成サムネイルをassets/Images/に書き込むようになりました。resolveImagesFolderNameは大文字・小文字だけが異なる既存フォルダーをそのまま使うため、すでにassets/images/があるプロジェクトでは小文字のままです。また、次回のサムネイル保存時に、大文字・小文字が異なる自動生成のnavmapThumbnailエントリーを書き換えます(creator-hub9d82aac07)。ただし、手動で指定するパスは、実際に存在するフォルダーと表記を一致させる必要があります。パスを設定する前にls assetsで確認し、大文字・小文字だけが異なるフォルダーを新たに作成しないでください。set_scene_settingsでは設定できません(入力スキーマにthumbnailキーがなく、MCP SDKが未知のキーをエディターに渡す前に削除するため)が、set_componentなら設定できます。entity_detail(0)でルートエンティティのscene-metadataコンポーネントを読み取り、set_component(0, "inspector::SceneMetadata-v5", {thumbnail: "assets/Images/cover.png"})を実行します。キーは通常の更新と同様にマージされ、次回の自動保存時にscene.jsonのdisplay.navmapThumbnailに反映されます(実環境で確認済み。106個の区画とスポーン地点は維持されました)。-v5を固定で指定せず、読み取り結果から正確なバージョン名を使ってください。エディターはデータを持つバージョンにバインドされるため(resolveActiveSceneComponent)、古いバージョンのsdk-commandsに固定されたシーンでは-v4のままです。誤ったバージョンに書き込むと、誰も読み取らないコンポーネントが追加されるだけです。エディターのScene settings → Thumbnail欄から同様の設定を行うこともできます。 -
大きなシーンでの
entity_detail(0)の結果は非常に大きくなります。106区画のシーンでは3,335行/79 KBになり、その大部分をinspector::Nodesと区画一覧が占めていました。ツールの結果上限を超えるほどの大きさです(2026-10-10に確認)。ファイルにリダイレクトし、必要なコンポーネントだけをgrepで抽出してください。また、set_componentはトップレベルキーをマージするため、書き戻すのは変更したキーだけにしてください。読み取ったコンポーネント全体を書き戻してはいけません。 -
生成したサムネイル(Blenderレンダー、画像ツール、スクリーンショット)は、シーンで指定する前に公開仕様を満たしている必要があります。 Worldへの公開では、1,048,576 bytesを超えるサムネイルは拒否されます。通常の1920x1080 PNGでも
Invalid thumbnail: size 1185064 bytes exceeds maximum of 1048576 bytes (1MB)が発生しました。このチェックはcreator-hubにはありません(リポジトリ内には、このメッセージや定数に一致するものはありません)。Worldsのコンテンツサーバーがデプロイ時に検証するため、エディターもローカルビルドも事前に警告しません。それ以外の検証はエディターが行います。形式は.png/.jpg、アスペクト比は1 %の許容範囲内で16:9、推奨サイズは1920x1080です(packages/inspector/src/components/EntityInspector/SceneInspector/utils.tsのgetThumbnailWarnings/validateThumbnailFile。Hubが撮影する画像は中央を切り抜いて16:9にし、packages/creator-hub/renderer/src/modules/image.tsで幅を最大1920に制限しています)。 -
そのため、16:9(1920x1080、ファイルサイズを抑えるなら1344x756)でレンダリングし、PNGではなく高品質のJPEGで書き出してください。
ffmpeg -i cover.png -q:v 2 cover.jpgでは、1344x756で約100 KBになりました。PNGを使う場合は、実際に上限以下に収まる場合に限ってください。シーンにパスを設定する前に、バイトサイズ(ls -l)と画像の寸法(sips -g pixelWidth -g pixelHeight)を確認してください。公開に失敗してから確認してはいけません。上記の方法で別名のファイルを保存してシーンの参照先を変更し、assets/Images/autogenerated-thumbnail.pngは使用しないでください。 -
すべてのサムネイルは正方形に切り抜かれても見栄えがする必要があります。テキスト、ロゴ、主要な被写体は中央の正方形内に配置してください。 プラットフォームの一部では、1920x1080画像の中央1080x1080だけを表示するため、各辺で幅の
(1920 - 1080) / (2 * 1920) ≈ 0.219が切り取られます(THUMBNAIL_SAFE_AREA_INSET)。1920px幅の場合はx=420〜1500、1280px幅の場合はx=280〜1000が対象範囲です。画像の撮影、レンダリング、合成のいずれでも同様です。シーンにパスを設定する前に正方形に切り抜き、その結果を確認してください。全体表示だけで判断してはいけません。端から端まで続くタイトルも、全体表示では問題なく見えます(Locksmith、2026-10)。OUT="${TMPDIR:-/tmp}/cover-square.png" # macOS H=$(sips -g pixelHeight cover.png | awk '/pixelHeight/{print $2}'); sips -c $H $H cover.png --out "$OUT" # ImageMagick (any OS) H=$(magick identify -format %h cover.png); magick cover.png -gravity center -crop ${H}x${H}+0+0 +repage "$OUT"次に、正方形の画像を
Readします。テキストのすべての単語が画像内になければなりません。 -
PATH に
node/npxがなくても行き詰まりではありません。 Creator Hub には Node(v22、npmとnpxを含む)が同梱されており、すべてのsdk-commands子プロセスがこれを使用します(main/src/modules/node-runtime.ts、scripts/download-node.js)。macOS では/Applications/Decentraland Creator Hub.app/Contents/Resources/node-bin/bin/{node,npm,npx}、Windows では Creator Hub の実行ファイルと同じresourcesフォルダー内のresources\node-bin\node.exe(およびnpm.cmd/npx.cmd)、Linux ではresources/node-bin/bin/にあります。Node がインストールされていないクリエイターのマシンでnpx tsc --noEmit、npx skills add decentraland/sdk-skills --all、gltf-transformなどを実行するには、絶対パスで呼び出してください。(Hub の開発ビルドにはバンドルが含まれず、開発者の Node を使用します。) -
asset-packs::Placeholderのsrcには、テンプレート変数ではなく解決済みのファイルパスが必要です。 カタログでは{assetPath}/model.glbのようなテンプレートとしてパスが保存されています。この文字列をそのままset_componentで設定すると、エンジンが変数を解決できないため、ギズモが表示されない、または正常に動作しなくなります。place_smart_itemはパスを自動的に解決します(例:assets/asset-packs/spotlight/spotlight.glb)。Placeholderを手動で設定する必要がある場合は、GLB ファイルの実際のディスク上のパスを指定してください。