Skip to main content
Glama
playcanvas

PlayCanvas Editor MCP Server

Official
by playcanvas
██████╗ ██╗      █████╗ ██╗   ██╗ ██████╗ █████╗ ███╗   ██╗██╗   ██╗ █████╗ ███████╗
██╔══██╗██║     ██╔══██╗╚██╗ ██╔╝██╔════╝██╔══██╗████╗  ██║██║   ██║██╔══██╗██╔════╝
██████╔╝██║     ███████║ ╚████╔╝ ██║     ███████║██╔██╗ ██║██║   ██║███████║███████╗
██╔═══╝ ██║     ██╔══██║  ╚██╔╝  ██║     ██╔══██║██║╚██╗██║╚██╗ ██╔╝██╔══██║╚════██║
██║     ███████╗██║  ██║   ██║   ╚██████╗██║  ██║██║ ╚████║ ╚████╔╝ ██║  ██║███████║
╚═╝     ╚══════╝╚═╝  ╚═╝   ╚═╝    ╚═════╝╚═╝  ╚═╝╚═╝  ╚═══╝  ╚═══╝  ╚═╝  ╚═╝╚══════╝

███╗   ███╗ ██████╗██████╗        ███████╗███████╗██████╗ ██╗   ██╗███████╗██████╗ 
████╗ ████║██╔════╝██╔══██╗       ██╔════╝██╔════╝██╔══██╗██║   ██║██╔════╝██╔══██╗
██╔████╔██║██║     ██████╔╝       ███████╗█████╗  ██████╔╝██║   ██║█████╗  ██████╔╝
██║╚██╔╝██║██║     ██╔═══╝        ╚════██║██╔══╝  ██╔══██╗╚██╗ ██╔╝██╔══╝  ██╔══██╗
██║ ╚═╝ ██║╚██████╗██║            ███████║███████╗██║  ██║ ╚████╔╝ ███████╗██║  ██║
╚═╝     ╚═╝ ╚═════╝╚═╝            ╚══════╝╚══════╝╚═╝  ╚═╝  ╚═══╝  ╚══════╝╚═╝  ╚═╝

使用 LLM 自动化PlayCanvas 编辑器的 MCP 服务器。

[!重要的]
目前,MCP 服务器需要由 Anthropic 的 Claude 驱动。根据我们的经验,Claude 的免费套餐无法提供足够大的聊天上下文来可靠地运行 MCP 服务器。因此,我们强烈建议您订阅 Claude 专业版帐户。

可用工具

  • 实体

    • list_entities

    • create_entities

    • delete_entities

    • duplicate_entities

    • modify_entities

    • reparent_entity

    • add_components

    • remove_components

    • add_script_component_script

  • 资产

    • list_assets

    • create_assets

    • delete_assets

    • instantiate_template_assets

    • set_script_text

    • script_parse

    • set_material_diffuse

  • 场景

    • query_scene_settings

    • modify_scene_settings

  • 店铺

    • store_search

    • store_get

    • store_download

Related MCP server: HostBridge MCP Server

安装

运行npm install来安装所有依赖项。

安装 Chrome 扩展程序

  1. 访问chrome://extensions/并启用开发者模式

  2. 单击Load unpacked程序”并选择extensions文件夹

  3. 加载 PlayCanvas 编辑器。扩展应该已经加载。

运行 MCP 服务器

MCP 服务器可以由 Cursor 或 Claude Desktop 驱动。

[!提示]
我们发现 Claude Desktop 总体上更加可靠。

克劳德桌面

  1. 安装Claude Desktop

  2. 转到Claude > Settings

  3. 选择Developer ,然后Edit Config

  4. 这将打开claude_desktop_config.json ,即您的 MCP 配置 JSON 文件。

光标

  1. 安装光标

  2. 选择File > Preferences > Cursor Settings

  3. 单击+ Add new global MCP server

  4. 这将打开mcp.json ,即您的 MCP 配置 JSON 文件。

[!提示]
同样在Cursor Settings中,选择Features并滚动到Chat部分。勾选Enable auto-run mode ,即可允许 LLM 运行 MCP 工具而无需持续授权。此操作风险自负(但我们更希望您这样做)!

[!重要的]
在 Cursor 中,确保已选择AgentEdit Ask将无法识别 MCP 服务器。

MCP 配置 JSON 文件

您的配置应该是这样的:

视窗

{
  "mcpServers": {
    "playcanvas": {
      "command": "cmd",
      "args": [
        "/c",
        "npx",
        "tsx",
        "C:\\path\\to\\mcp-editor\\src\\server.ts"
      ],
      "env": {
        "PORT": "52000"
      }
    }
  }
}

macOS

{
  "mcpServers": {
    "playcanvas": {
      "command": "npx",
      "args": [
        "tsx",
        "/path/to/mcp-editor/src/server.ts"
      ],
      "env": {
        "PORT": "52000"
      }
    }
  }
}

将编辑器连接到 MCP 服务器

PlayCanvas 编辑器不会自动连接到 MCP 服务器。连接方法如下:

  1. 激活运行 PlayCanvas 编辑器的 Chrome 标签。

  2. 选择地址栏右侧的扩展图标。

  3. 选择 PlayCanvas Editor MCP Extension 来打开扩展弹出窗口。

  4. 选择CONNECT (端口号应与 MCP 配置 JSON 文件中设置的端口号相匹配)。

[!NOTE] 目前,您一次只能将一个 PlayCanvas 编辑器实例连接到 MCP 服务器。

您现在应该能够在 Claude Desktop 或 Cursor 中发出命令。

Available Tools

124 tools
add_componentsA
Idempotent

Add one or more components to an existing entity (camera, light, render, collision, rigidbody, element, screen, script, sound, etc.). Pass each component's initial data under its name. Returns the updated entity summary. Physics note: rigidbody/collision components only simulate when the project has the Ammo physics module enabled (Editor: IMPORT AMMO / enable physics in project settings). If it is not enabled, add the components then enable Ammo — do not stall on the decision. When NOT to use: to create a new entity (use create_entities), to tweak an existing component property (use modify_entities), or to attach a script to a script component (use attach_script).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID
componentsYesEntity components

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal idempotentHint=true and destructiveHint=false, so the description does not need to restate safety. It adds meaningful behavioral context beyond annotations: the return value is the updated entity summary, and rigidbody/collision components only simulate when the Ammo physics module is enabled. This is useful operational information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but every sentence carries practical weight: action, parameter mapping, return value, physics prerequisite, and exclusions. It is front-loaded with the core operation and the physics note is dense but directly actionable, not filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the large nested schema and no output schema, the description covers the essential missing pieces: what to pass, what comes back, and a critical environmental prerequisite. It also handles sibling-tool routing. Component-specific field details are already in the schema, so the description does not need to enumerate them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents both parameters well. The description still adds value by clarifying the components object structure: pass each component's initial data under its component name. This helps an agent understand that property names in the components object correspond to component types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Add'), a specific resource ('components to an existing entity'), and enumerates concrete component types. It also explicitly distinguishes itself from create_entities, modify_entities, and attach_script, so an agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'When NOT to use' section explicitly names the alternative tools and the conditions that route to them. The physics note also gives actionable guidance: if Ammo is not enabled, add the components then enable it rather than stalling. This is complete decision support.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_entity_scriptsB
Idempotent

Attach a parsed script to one or more entities, creating script components when needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNoExecution order index
scriptYesRegistered script name
entityIdsYes
attributesNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, readOnlyHint=false, and destructiveHint=false. The description adds useful behavioral context by noting that script components are created when needed and that the script must be parsed. However, it stops short of explaining what happens to existing scripts, how attributes are applied, or whether repeated calls simply overwrite.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that wastes no words and front-loads the core action. It is appropriately sized for the tool's complexity and does not repeat schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given four parameters, a nested attributes object, and no output schema, the description is too thin. It does not explain the purpose of attributes, the meaning of the execution-order index, or how this tool relates to the many similar script/component tools in the sibling list. An agent could call it with required parameters but would lack enough context to use optional parameters confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, and the description partially compensates: 'one or more entities' clarifies entityIds, and 'parsed script' adds meaning beyond the schema's 'Registered script name'. However, the optional 'index' and especially 'attributes' parameters receive no semantic help from the description, leaving their roles partially underspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('attach a parsed script to one or more entities') and includes the key side effect of creating script components when needed. It is clear about the resource and target, but it does not explicitly differentiate itself from similar sibling tools such as attach_script or add_script_component_script.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives like attach_script, add_script_component_script, or add_components. The description implies a use case but provides no exclusions, prerequisites, or decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_script_component_scriptA
Idempotent

Add a named script to an entity that ALREADY has a script component. Returns the updated entity summary. When NOT to use: if the entity has no script component yet, prefer attach_script, which creates the component and attaches the script in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID
scriptNameYesRegistered script name (the parsed script's name attribute)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotentHint=true and destructiveHint=false, so no contradiction. The description adds meaningful behavioral context beyond annotations: it states the requirement that a script component must already exist, and it discloses the return behavior ('Returns the updated entity summary'), which is otherwise absent since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the core purpose first, then the return value, then the critical usage exclusion. Every sentence contributes information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple two-parameter mutation with clear annotations. The description covers the action, the precondition, the return value, and the alternative pathway. Nothing essential for correct invocation is missing for its complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description's phrase 'named script' aligns with the scriptName parameter, but it does not add deeper parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate because the schema carries the weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Add a named script to an entity that ALREADY has a script component.' It clearly states the precondition and differentiates itself from the sibling tool attach_script by framing the distinction explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when not to use this tool: 'if the entity has no script component yet, prefer attach_script.' This directly names the alternative and the condition that selects it, leaving no ambiguity about routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_mergeA

Apply a merge whose conflicts are all resolved. Call twice: first with finalize:false to prepare and review, then finalize:true to commit. finalize:true writes the merge checkpoint onto the current branch and RELOADS the editor (the tool waits for reconnect and returns vcs_status); finalize:false does not reload. When NOT to use: to abort a merge (use cancel_merge).

ParametersJSON Schema
NameRequiredDescriptionDefault
mergeIdYesId of the merge (from start_merge)
finalizeYesfalse = prepare and review the merge; true = commit it (only after a finalize:false pass and all conflicts resolved)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important non-obvious behavior beyond the annotations: finalize:true writes the merge checkpoint, reloads the editor, waits for reconnect, and returns vcs_status, while finalize:false does not reload. This is meaningful contextual information that the annotations alone do not provide, and it does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well structured: one summary sentence, the two-call protocol, the side-effect/reload warning, and the explicit when-not-to-use alternative. Every sentence earns its place and the most important constraints are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the required call sequence, the side effects of finalize:true, and the abort alternative. It is slightly incomplete in that it does not describe the return behavior or resulting state of the finalize:false pass, but given the small parameter surface and the rich two-phase guidance, this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100% for both parameters, so the description does not need to restate them. It adds value by clarifying the behavioral difference between finalize:false and finalize:true and by referencing where mergeId originates ('from start_merge'). Minor extra detail about mergeId format would be nice, but the existing schema plus description is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('apply'), a clear resource ('a merge'), and a precondition ('whose conflicts are all resolved'). It also separates this tool from the broader merge workflow by naming cancel_merge as the abort alternative, so an agent can identify what apply_merge does without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is made explicit: 'Call twice: first with finalize:false to prepare and review, then finalize:true to commit.' It also provides a direct exclusion with an alternative tool: 'When NOT to use: to abort a merge (use cancel_merge).' This gives clear, actionable guidance with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_template_overridesC

Apply all overrides from a template instance, or only the supplied override records.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityIdYesEntity ID
overridesNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are effectively all false, providing no safety profile, so the description carries the full burden. It states the action ('apply') but does not disclose side effects, whether existing overrides are overwritten, whether the operation is reversible, or what the response indicates. The two-mode behavior is present, but the consequences are opaque.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one efficient sentence that front-loads the core behavior and the two invocation modes. It contains no filler, though its brevity sacrifices useful detail for the sake of conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema and mostly absent annotations, this description is too thin. It does not explain what 'applying' does to the target, what valid override_type values exist, how conflicts are handled, or what a successful invocation returns. An agent would likely need additional context to invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, and the existing parameter description ('Entity ID') is tautological. The description clarifies that entityId refers to a template instance and that overrides can be a specific subset, but it does not explain the meaning of resource_id, override_type, or path, leaving substantial semantic gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Apply') and resource (template instance overrides), and clarifies that it either applies all overrides or only the supplied override records. It is clear and informative, though it does not explicitly name sibling tools like get_template_overrides or revert_template_overrides to distinguish itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as get_template_overrides, revert_template_overrides, or unlink_template_instances. It implies two invocation modes but lacks contextual conditions or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attach_scriptA
Idempotent

Attach a script to an entity in one step: creates the script component if missing, then adds the named script. This consolidates the common "add script component" + "add script" flow. Returns the updated entity summary. Note: the script must already exist as a parsed script asset (create one with create_assets type="script", set its code with set_script_text, then script_parse). When NOT to use: to write the script's source code (use set_script_text) or to set script attribute values (use modify_entities on components.script.scripts..attributes).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID
indexNoExecution order index
attributesNoInitial script attribute values
scriptNameYesRegistered script name to attach

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnly=false, destructive=false, idempotent=true), the description explains the side-effect behavior: creates the script component when missing, adds the script, and returns an updated entity summary. It also usefully clarifies what this tool does not do, reducing ambiguity about its operational scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The core behavior is front-loaded first, prerequisites second, and exclusions third. Every sentence adds distinct value, and the structure makes the tool easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the return value (updated entity summary), prerequisite conditions, and explicit alternatives/exclusions. Combined with the provided annotations and schema, an agent has enough information to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds semantic context for scriptName by explaining the prerequisite that it must be a registered parsed script asset, not just any name. It also clarifies that attributes are initial values and execution order is controlled by index, though implicitly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Attach a script to an entity in one step') and precisely explains the behavior: it creates the script component if missing, then adds the named script. It also distinguishes this tool from set_script_text and modify_entities immediately, making its purpose clear relative to siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit 'When NOT to use' guidance, naming set_script_text for source code editing and modify_entities for setting attribute values. It also states the prerequisite that the script must already exist as a parsed asset, giving the agent concrete conditions for when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bake_lightmapsA
Idempotent

Bake scene lightmaps, optionally limited to the given entities. Returns only after baking finishes and reports model assets missing UV1.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityIdsNoLightmapped entity resource_ids; omit to bake all lightmapped entities

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses two important behaviors beyond the annotations: it blocks until baking finishes and it reports model assets missing UV1. Annotations only cover readOnly, idempotence, and destructiveness, so this additional operational detail is valuable, though it does not detail all side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no filler. The main action is front-loaded, the optional scope is stated immediately, and the behavioral/result note is concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool, the description covers the essential context: what is baked, how to constrain the bake, that it is synchronous, and what diagnostic information is reported. It does not describe the exact return shape, but no output schema exists and the report behavior is at least mentioned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents entityIds as optional lightmapped entity resource_ids with omit-to-bake-all semantics. The description restates this idea without adding material new parameter meaning, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Bake scene lightmaps', with a clear optional scope ('limited to the given entities'). This distinguishes it from the many sibling tools that deal with modeling, textures, and scene management rather than lightmap baking.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes it clear that this tool is for baking lightmaps and that entityIds can be supplied to limit the bake, with omission meaning all lightmapped entities are baked. It does not explicitly name alternatives or when-not-to-use conditions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_mergeA
Idempotent

Force-stop an in-progress merge, discarding the merge and its conflicts. Project data is untouched. Does not reload the editor. When NOT to use: to commit a merge (use apply_merge).

ParametersJSON Schema
NameRequiredDescriptionDefault
mergeIdYesId of the merge to cancel (from start_merge)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by disclosing what is destroyed (the merge and its conflicts), what is preserved ('Project data is untouched'), and a notable side effect ('Does not reload the editor'). These details add real behavioral context beyond the readOnly/idempotent/destructive hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler. The core action and consequences come first, followed by the critical exclusion and alternative. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple one-parameter schema and no output schema, the description covers everything needed: purpose, effect, side effects, and when to avoid the tool. It fully contextualizes cancellation among the merge-related siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is already well described as 'Id of the merge to cancel (from start_merge)'. The tool description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('force-stop') and resource ('in-progress merge'), and clarifies the outcome: discarding the merge and its conflicts. It clearly distinguishes this from apply_merge by naming the sibling tool in the when-not-to-use note.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The main sentence states the intended use: cancel an in-progress merge. It also explicitly tells the agent when NOT to use it ('to commit a merge') and names the correct alternative ('use apply_merge'). This is strong routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_model_unwrapA
Idempotent

Cancel an in-progress UV1 unwrap for a model asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesModel asset id

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide idempotentHint=true and destructiveHint=false, so the description does not need to repeat those. It adds the important precondition that the unwrap must be 'in-progress', but it does not explain side effects such as whether partial UV data is discarded or whether cancellation is a no-op when no job exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence packs the verb, resource, state, and scope with no filler. Every word contributes to the agent's understanding, and the key precondition 'in-progress' is placed before the resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter cancellation tool, the description plus annotations cover the core information: what is canceled, in what state, and the safety profile (idempotent, non-destructive). It leaves minor questions about job-state behavior implicit, but the idempotentHint largely resolves those.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'id' is fully described in the schema as 'Model asset id' with exclusiveMinimum 0, so schema coverage is 100%. The description's 'model asset' echo adds no new parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a precise verb ('Cancel'), a specific target ('UV1 unwrap'), and the resource scope ('model asset'), making the intent unmistakable. It is clearly distinct from related siblings like unwrap_model_asset and cancel_merge because it is the cancellation counterpart for UV1 unwrapping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'in-progress' implies the tool is only appropriate when an unwrap is already running, but the description does not explicitly state when to prefer this over other tools or what to do if no unwrap is active. There is no exclusionary guidance, so the usage is inferred rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

capture_runtimeA
Read-only

Screenshot the RUNNING Launch instance (not the editor preview) as a downscaled WebP image — the agent's "eye" for visually verifying play-mode behavior. Requires launch_start first. Captures the live frame buffer, so what you see reflects scripts/physics/animation actually running. When NOT to use: before launch_start (use capture_viewport for edit-time visuals).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description adds useful behavioral context: it captures the live frame buffer, reflects actually running scripts/physics/animation, and produces a downscaled WebP image. It is transparent about the capture semantics without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the core distinction is front-loaded, the prerequisite is clear, the behavioral detail is valuable, and the alternative routing is explicit. No filler or redundant repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only tool, the description covers what it captures, what format it returns, when it can be used, and which sibling to use instead. Nothing essential is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain. The description fully clarifies what the operation does, and the schema coverage is effectively complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the exact operation: screenshotting the running Launch instance, not the editor preview. It explicitly contrasts with capture_viewport, making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the prerequisite (requires launch_start first) and gives a concrete when-not-to-use condition with a named alternative (use capture_viewport for edit-time visuals). This gives an agent clear decision rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

capture_viewportA
Read-only

Capture a screenshot of the editor viewport (the current editing camera view) as a downscaled WebP image, for visual verification of edit-time state. Tip: call focus_viewport first to frame the entities you care about. Note: this renders the editor preview only (scripts/physics/animation are NOT running). When NOT to use: to verify play-mode/runtime behavior (use capture_runtime after launch_start).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds critical behavioral context: it renders the editor preview only, with scripts/physics/animation NOT running. This clarifies the interpretation of the screenshot and prevents the agent from expecting runtime state. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: definition, tip, key rendering note, and when-not-to-use. The most important scoping constraint (editor preview, no runtime) is prominent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only tool with an output format and clear constraints, the description covers what it returns (WebP screenshot), when to use it, prerequisites (focus_viewport), limitations (no scripts/physics/animation), and the alternative (capture_runtime). Nothing needed from an output schema because the tool's output is self-describing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and 100% coverage, so there is nothing to document. Per the zero-parameter baseline this is a 4; the description appropriately focuses on behavior rather than params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the verb 'Capture', the resource 'editor viewport', the output format 'downscaled WebP image', and the purpose 'visual verification of edit-time state'. Explicitly distinguishes from capture_runtime by naming the runtime behavior alternative, so an agent can differentiate it from the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a direct when-not-to-use with the alternative tool: 'use capture_runtime after launch_start'. Also gives a tip to call focus_viewport first to frame entities, providing clear usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_cubemap_prefilterA
DestructiveIdempotent

Remove generated runtime lighting data from a cubemap.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true and idempotentHint=true, so the description does not need to restate those. It adds useful context by specifying that only 'generated runtime lighting data' is removed, but it does not disclose whether the operation is irreversible beyond what destructiveHint already implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no filler or redundant information. The action and target are front-loaded, making it easy for an agent to quickly understand the tool's behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one simple parameter and annotations already communicate destructiveness and idempotency, the description is largely complete for invocation purposes. It could optionally mention expected return behavior or an explicit note about regeneration, but these are minor gaps for a low-complexity operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description carries the burden of explaining the parameter. The phrase 'from a cubemap' indicates that the required id refers to a cubemap, which is meaningful, but it does not add detail about the id format, ownership, or failure behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'Remove', and names the resource, 'generated runtime lighting data from a cubemap'. It clearly conveys the tool's action, though it does not explicitly reference the sibling 'prefilter_cubemap' to make the inverse relationship unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose implies when it should be used: when generated runtime lighting data on a cubemap needs to be removed. However, it does not explicitly state when to choose this over alternatives, mention prerequisites, or describe a typical workflow such as clearing before regenerating with prefilter_cubemap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_selectionA
Idempotent

Clear the editor's current selection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate that this is not read-only, is idempotent, and is not destructive. The description provides no additional behavioral detail beyond naming the action. Since the operation is simple and self-evident, this is adequate, but it does not go beyond what annotations already convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, complete sentence with no wasted words. It is front-loaded with the action and the target resource, making it immediately scannable and understandable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, trivial state-changing tool, the description plus annotations are sufficient. There is no output schema, but for such a simple operation the behavior is fully conveyed. No hidden inputs, side effects, or prerequisites need explanation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty with 100% coverage, so there are no parameter semantics to document. The baseline for zero-parameter tools is 4, and the description appropriately focuses on the action rather than inventing parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Clear the editor's current selection.' This unambiguously identifies the operation and distinguishes it from sibling tools like set_selection and get_selection. Even though the title is similar, the description clarifies the exact scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for clearing the current selection, and the sibling list includes selection-related tools such as set_selection and get_selection. However, it does not explicitly state when to prefer clear_selection over alternatives like set_selection with an empty value, nor does it mention any exclusions. Usage context is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_branchA
Idempotent

Close a branch (a soft, reversible archive — reopen it later with open_branch). Cannot close the current branch or a permanent branch. Does not reload the editor. When NOT to use: to permanently remove a branch (use delete_branch).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchIdYesId of the branch to close (from list_branches)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses behavioral traits beyond the annotations: the operation is reversible, reopening is possible via open_branch, the current branch and permanent branches cannot be closed, and the editor is not reloaded. This adds meaningful context on side effects and constraints that annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: what the tool does, its reversible nature, key restrictions, a side-effect note, and when not to use it. The description is compact and front-loaded with the most decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description covers the operation's semantics, constraints, side effects, and alternatives. An agent has everything needed to decide when and how to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents branchId as 'Id of the branch to close (from list_branches)'. The description does not need to add much, but it also does not go beyond the schema's parameter explanation. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Close a branch'), clearly defines it as a soft reversible archive, and differentiates it from delete_branch by stating what it is not for. It also gives constraints (cannot close current/permanent branch), making the tool's role unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly includes a 'When NOT to use' clause and names the alternative tool (delete_branch) for permanent removal. It also explains the intended recovery path via open_branch, giving an agent clear decision criteria for selecting this tool over branch-related siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_texture_assetA

Convert a texture source to a new AVIF, JPEG, PNG, or WebP texture asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSource texture asset id
formatYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal a mutating (readOnlyHint=false) but non-destructive (destructiveHint=false) operation. The description adds minimal context beyond the word 'new,' implying the source is preserved and a separate asset is produced. It does not address conversion constraints (e.g., alpha-channel handling when targeting JPEG), accepted source formats, or what the tool returns on success.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single 14-word sentence that front-loads the verb and conveys resource, outcome, and formats. No filler, no redundancy with schema fields, and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with annotations and a self-documenting enum, the description covers input and outcome. Gaps remain: no return-value information (and no output schema to compensate), no mention of edge cases like JPEG alpha flattening, and no statement of source-format restrictions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% (id described, format not), but the format enum self-documents its values. The description reinforces meaning by mapping 'texture source' to the id parameter and listing AVIF/JPEG/PNG/WebP, which mirrors the format enum—yet it adds no constraints beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Convert'), resource ('texture source'), and precise outcome ('new AVIF, JPEG, PNG, or WebP texture asset'). The explicit output formats and the 'new asset' framing differentiate it from texture-adjacent siblings such as create_texture_atlas, process_texture_variants, and modify_assets without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus the many texture-related siblings (process_texture_variants, reimport_assets, create_texture_atlas, modify_assets). The intended use case—changing a texture's storage format—must be inferred from the verb and format list; no alternatives, exclusions, or preconditions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_assetsA

Create one or more native data/text assets. Imported binary assets use upload_assets. Each asset is { type, options }; options vary by type (e.g. material takes data, script takes filename/text, template takes an entity id). Successful batches return the existing asset-summary array. Failed batches retain error status and expose succeeded and failed entries in response metadata. When NOT to use: to add an existing asset to an entity (use add_components/modify_entities) or to change a material's look after creation (use set_material_properties).

ParametersJSON Schema
NameRequiredDescriptionDefault
assetsYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly=false and destructive=false, so the description doesn't need to restate them. It adds useful transparency about batch behavior: successful batches return the existing asset-summary array, failed batches retain error status and expose succeeded/failed entries in metadata. This is helpful, though it doesn't go into, for example, what happens to partial successes on the server or whether any part is rolled back.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by the batch/response behavior, then the when-not-to-use guidance. No filler. It loses one point only because the sentence about successful/failed batches is slightly dense for a first read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no output schema and huge input schema, the description covers the most important orientation: what the tool creates, what binary assets route elsewhere, the per-item type/options pattern, and the batch response behavior. It doesn't explicitly mention the response format for partial failures or give examples of full option objects, but the schema provides the option structures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the burden. It describes the shape of each asset as { type, options } and gives examples of how options vary by type (material takes data, script takes filename/text, template takes an entity id). It doesn't enumerate every options field, but the schema itself is extremely large and mostly self-describing. The description adds the key semantic distinction between native/text assets and binary assets, which is not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Create') and resource ('one or more native data/text assets'), and distinguishes itself from the sibling upload_assets for binary assets. It also explains the per-item structure. This is a clear, differentiated purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when NOT to use the tool, naming alternatives: add_components/modify_entities for adding assets to an entity, and set_material_properties for changing a material's look after creation. This gives an agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_branchA

Create a new branch (scope a feature on its own branch) and switch the editor to it. Branches from the current branch by default. This RELOADS the editor; the tool waits for it to reconnect and returns the resulting vcs_status on the new branch. Name must be unique in the project and at most 1000 characters. When NOT to use: to switch to an existing branch (use switch_branch).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new branch
sourceBranchIdNoBranch to fork from (defaults to the current branch)
sourceCheckpointIdNoCheckpoint on the source branch to fork from (defaults to its latest)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses significant non-obvious behavior beyond the annotations: the editor reloads, the tool waits for reconnect, and it returns the resulting vcs_status on the new branch. It also states the uniqueness constraint and maximum name length. Nothing in the description contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: action and purpose, default source behavior, important reload/return behavior, naming constraints, and the explicit alternative. The description is compact, front-loaded, and free of redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creating-and-switching tool with no output schema, the description covers the essential behavioral context: creation, switching, reload, return value, name constraints, and the sibling alternative. The remaining parameter details are fully covered by the input schema, so nothing necessary for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by specifying the uniqueness requirement for 'name' and explicitly calling out the default source branch, which complements the schema's 'defaults to the current branch' note. It does not repeat all parameter details, but the schema already documents them well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific operation ('Create a new branch'), its purpose ('scope a feature on its own branch'), and the immediate side effect ('switch the editor to it'). It also distinguishes itself from switch_branch by explicitly naming the alternative in the NOT-to-use note.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use the tool ('create a new branch') and, more importantly, when not to use it ('to switch to an existing branch, use switch_branch'). It also clarifies default branching behavior and uniqueness requirements, which gives an agent enough context to decide between create_branch and switch_branch.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_buildB

Create a published PlayCanvas build for scenes in the designated project. Returns the created durable build job.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
minifyNo
versionNo
sceneIdsYesScene ids in the designated project
imageS3KeyNo
sourceMapsNo
concatenateNo
descriptionNo
releaseNotesNo
engineVersionNoConfigured engine channel or exact available engine version
primarySceneIdNoPrimary scene; must also be in sceneIds
optimizeSceneFormatNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the mutation profile is partially available. The description adds useful behavioral context by saying the result is a 'published' and 'durable build job', which signals that the action has a persistent, non-transient effect. However, it does not disclose whether the build process is asynchronous, whether it can overwrite existing builds, or what side effects publishing may have.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no filler or repetition. It front-loads the core action and then states the return value, which is an efficient structure for an AI agent scanning tool definitions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 12 parameters, no output schema, and minimal annotation detail, this description is insufficient. It tells the agent what the tool does and that it returns a durable job, but it does not clarify how to configure a successful build, what the required name represents, how primarySceneId is used, or how the returned job can be tracked. The description leaves too much to inference for a complex build-creation operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25% with 12 parameters, so the description must compensate. It does not explain the required name parameter, primarySceneId, minify, version, or any other build configuration field. The only parameter hint, 'for scenes', merely mirrors the existing sceneIds schema description and adds no new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Create'), a clear resource ('published PlayCanvas build'), and the target scope ('for scenes in the designated project'). It is easily distinguishable from siblings like list_builds, get_build, and delete_build because it names the creation action and the build artifact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is used to create builds, but it provides no explicit guidance on when to use it versus alternatives like set_primary_build, download_build, or delete_build. It does not mention any prerequisite, such as having scenes ready or needing a specific project context, nor does it state when a build should not be created.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_checkpointA

Create a checkpoint (an immutable snapshot of the current branch's scenes/assets/settings) with a description. Returns the created checkpoint ({ id, createdAt, description }). Does not reload the editor. Snapshotting is asynchronous; for very large projects it may exceed the request timeout, in which case the checkpoint usually still completes — confirm with list_checkpoints. When NOT to use: to roll back to a checkpoint (use restore_checkpoint).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchIdNoBranch to checkpoint (defaults to the current branch)
descriptionYesDescription of the checkpoint

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses important behaviors: the snapshot is immutable, the tool does not reload the editor, snapshotting is asynchronous, and requests may time out while the checkpoint may still complete. It also describes the response shape and the safe verification strategy. No contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, return value, side-effect context, async/timeout behavior, and the key exclusion. It is front-loaded with the core purpose and remains tight despite covering several important operational caveats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool of this complexity, the description covers the essential operational facts: what is captured, the return shape in the absence of an output schema, the non-reloading behavior, the asynchronous/timeout risk, how to confirm completion, and the main alternative. The schema covers the parameter details, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents description and branchId. The description reinforces that the snapshot covers the current branch and includes scenes/assets/settings, but it does not add substantial new parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action (create) and resource (checkpoint, an immutable snapshot of the current branch's scenes/assets/settings), and distinguishes it from the rollback sibling by explicitly pointing to restore_checkpoint. An agent can tell exactly what this tool does and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: create checkpoints to capture a recoverable state, and explicitly says when NOT to use it ('to roll back to a checkpoint, use restore_checkpoint'). It also provides guidance for the asynchronous case with a confirmation path: 'confirm with list_checkpoints'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_cubemap_from_textureB

Convert an equirectangular texture to six face textures and a cubemap asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSource equirectangular texture asset id

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false (readOnlyHint=false, destructiveHint=false), giving no safety profile. The description says 'convert' but does not clarify whether the source texture is modified, whether new assets are created, or any side effects. It also doesn't mention input format requirements beyond 'equirectangular'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-constructed sentence with the verb and resource front-loaded, no filler, and all essential information present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one parameter and no output schema, but the description omits behavioral clarity (e.g., whether the original texture is preserved) and usage context relative to siblings. It adequately states the conversion but lacks end-to-end completeness for an agent to call it with full confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% coverage: the single parameter 'id' is described as 'Source equirectangular texture asset id', which is clear. The description adds no extra parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Convert'), the input source ('an equirectangular texture'), and the exact outputs ('six face textures and a cubemap asset'). This specific purpose distinguishes it from siblings like prefilter_cubemap and convert_texture_asset without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (when you have an equirectangular texture needing a cubemap) but provides no explicit guidance on when to choose this tool over related siblings like prefilter_cubemap or convert_texture_asset. There are no when-not or alternative recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_entitiesA

Create one or more entities (optionally nested hierarchies) in the current scene. Use this to add new objects: cameras, lights, models, UI, empty groups, etc. Coordinates are local to the parent; rotation is euler degrees; scale is a multiplier. Returns the created entity summaries inline (resource_id, name, path, components) so you do NOT need a follow-up list_entities call to recover the new ids. Physics note: rigidbody/collision components only simulate if the project has the Ammo physics module enabled (Editor: click IMPORT AMMO / enable physics in project settings). Without it, rigidbodies are created but stay frozen at launch — enable Ammo before relying on physics rather than pausing to ask. When NOT to use: to change an existing entity (use modify_entities), to add a component to an existing entity (use add_components), or to instantiate a template asset (use instantiate_template_assets).

ParametersJSON Schema
NameRequiredDescriptionDefault
entitiesYesEntity hierarchies to create

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, so no safety contradiction. The description adds genuine behavioral context beyond the schema: it reveals that results are returned inline (avoiding a follow-up call), that coordinates are local and rotation is in euler degrees, and that rigidbody/collision components will remain frozen unless the Ammo physics module is enabled. It does not describe pagination or error behavior, but that is minor for this create-style tool. No contradiction with annotations, so a 4 is fair.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded, opening with the core purpose before adding coordinate conventions, return behavior, physics caveat, and exclusions. Every sentence contributes. It is longer than ideal, but for a tool with such a rich domain (physics warning, hierarchical creation, return semantics) the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with a single required parameter and a rich schema, the description covers the essential context: what it creates, the coordinate system, the return behavior, the physics prerequisite, and the correct sibling alternatives. It doesn't document error cases or branch-context requirements, but those are not critical for initial selection and invocation. Overall, the description is complete enough for an agent to call this tool correctly without a follow-up.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains the entities array, parent uuid, and component fields. The description does add useful semantic clarifications (local coordinates, euler degrees, scale multiplier), but it mostly complements rather than deeply expands the structure. A baseline 3 is appropriate because the schema carries the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource: 'Create one or more entities ... in the current scene.' It enumerates concrete object types (cameras, lights, models, UI, empty groups) and explicitly distinguishes itself from modify_entities, add_components, and instantiate_template_assets. This makes the tool's scope and identity unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an explicit 'When NOT to use' section naming the three main sibling alternatives (modify_entities for changes, add_components for components, instantiate_template_assets for templates). It also gives actionable operational guidance, such as not pausing to ask about Ammo physics and relying on the inline return rather than a follow-up list_entities call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_sceneA

Create a new empty scene in the current project/branch. Returns the created scene record. This does not switch to the new scene; call load_scene with its uniqueId to open it. When NOT to use: to copy an existing scene (use duplicate_scene).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName for the new scene (optional)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish this is a non-read-only, non-idempotent mutation. The description adds valuable behavioral context: it creates an empty scene, returns the scene record, and does not change the current scene. This goes beyond the annotation flags, though it could mention failure modes or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences with no filler. The main action is front-loaded, then the return value and non-switching behavior are stated, and finally the alternative is given. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple create tool with one optional parameter and annotations covering side-effect flags, the description fully covers what happens, what is returned, and how to open the new scene. No critical operational details are missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents the single optional 'name' parameter with 100% coverage, so the description does not need to add parameter details. The description adds no extra semantics beyond what the schema provides, matching the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('create'), resource ('new empty scene'), and scope ('current project/branch'). Explicitly differentiates from load_scene and duplicate_scene with concrete conditions, so an agent can tell them apart without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use guidance: creates a scene but does not switch to it, directing the agent to load_scene for opening. Also provides a clear 'When NOT to use' case and names the alternative duplicate_scene for copying an existing scene.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_texture_atlasA

Duplicate a texture asset as an editable texture atlas and return the new asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSource texture asset id

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the operation duplicates a source texture asset and returns a new asset, making the side effect (creation of a new asset) explicit. Annotations are minimal (all hints false), leaving the description to carry the behavioral burden; it does so reasonably, though it omits details like whether the original is modified or what 'editable' implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that leads with the action and resource, then states the result. Every word earns its place; there is no repetition of the tool name or schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single parameter and minimal annotations, the description covers the core action and return value. However, it does not explain when this is preferable to duplicate_assets or convert_texture_asset, nor does it describe any side effects or copy behavior beyond the simple 'duplicate' wording. The tool is simple, but the surrounding sibling set creates ambiguity that is left unresolved.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the only parameter 'id' is documented as 'Source texture asset id'. The description adds no extra parameter-level meaning beyond what the schema already provides, which meets the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Duplicate'), a clear resource ('a texture asset'), and the intended outcome ('as an editable texture atlas and return the new asset'). This clearly distinguishes it from generic duplicate_assets and other texture-related tools even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives like convert_texture_asset, duplicate_assets, or process_texture_variants. There is no explicit context, prerequisite, or condition that would help an agent choose it over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_assetsA
DestructiveIdempotent

Permanently delete assets by id. This is destructive; entities referencing the deleted assets will lose those references. Returns { deleted: }. When NOT to use: to remove an asset reference from an entity without deleting the asset itself (use modify_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
rejectReferencedNoFail before deletion if any asset is referenced

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the destructiveHint=true annotation by explaining the concrete consequence: entities referencing deleted assets will lose those references. Also discloses the return shape ({ deleted: <count> }). No contradiction with annotations; idempotentHint=true is compatible with a delete operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, each contributing a distinct piece of information: action, consequence, return value, and when not to use. Front-loaded with the core purpose and no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter destructive tool with no output schema, the description covers the essential call semantics: what it does, what side effects occur, what it returns, and the primary alternative. Combined with annotations and schema descriptions, nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, so the description does carry some responsibility for parameter meaning. It references ids generically ('by id') but does not explain rejectReferenced. However, the schema itself provides clear descriptions for both parameters ('Asset ID' and 'Fail before deletion if any asset is referenced'), so the gap is modest. A 3 reflects that the description adds little beyond the schema but does not mislead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Permanently delete assets by id'), and the destructive nature is explicit. Clearly distinguishes from sibling asset operations like modify_assets, move_assets, and duplicate_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a when-not-to-use scenario and names the alternative tool (modify_entities for removing references without deleting the asset). This leaves no ambiguity about tool selection in a key edge case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_branchA
DestructiveIdempotent

DESTRUCTIVE: permanently delete a branch and its checkpoints. Cannot be undone. Cannot delete the current branch or a permanent branch. Does not reload the editor. When NOT to use: to archive a branch reversibly (use close_branch).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchIdYesId of the branch to delete (from list_branches)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint=true, but the description adds meaningful detail beyond that: the operation is permanent and cannot be undone, it affects both the branch and its checkpoints, it refuses current/permanent branches, and it does not reload the editor. This fully informs the agent of behavior the annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the critical DESTRUCTIVE label. Every sentence adds value: permanence, irreversible nature, constraints, editor behavior, and the explicit alternative for reversible use. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool, the description covers all essential context: what gets deleted, reversibility, constraints on what cannot be deleted, side effects on the editor, and when to use a sibling instead. The absence of an output schema is not a gap because the operation is a deletion with no meaningful return contract to document.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers the only parameter with a clear description, 'Id of the branch to delete (from list_branches)', so schema coverage is 100%. The tool description does not need to add much, and it does not meaningfully elaborate on the parameter beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: permanently delete a branch and its checkpoints. It also differentiates from the sibling close_branch by explicitly naming the alternative for reversible archiving, so an agent can distinguish the tool immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly provides when-to-use context and, more importantly, a when-NOT-to-use directive: archive a branch reversibly with close_branch. It also lists exclusions such as current and permanent branches, which gives clear operational guardrails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_buildA
DestructiveIdempotent

Permanently delete a build job and its linked artifact from the designated project.

ParametersJSON Schema
NameRequiredDescriptionDefault
buildIdYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint and readOnlyHint=false. The description adds that deletion is permanent and that the linked artifact is also removed, which is valuable beyond the annotations. It does not discuss behavior for already-deleted builds, but idempotentHint covers that aspect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence front-loads the action and object with no filler. Every phrase contributes: permanent, delete, build job, linked artifact, and project context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool whose annotations already convey safety and idempotency, this description is complete. It clearly states what is removed and that the removal is permanent; a return-value specification is not necessary for a delete operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate for the parameter. 'buildId' is implicitly the identifier of the build job to delete, and the integer schema makes it understandable, but no additional format, source, or lookup guidance is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('delete') and resource ('build job and its linked artifact'), clearly distinguishing it from sibling operations like create_build, list_builds, get_build, and download_build. The word 'permanently' adds important scope about the operation's effect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: use this when a build job and its linked artifact should be permanently removed. It does not explicitly list alternatives or when-not-to-use conditions, but the unique delete action is recognizable among the build-related sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_entitiesA
DestructiveIdempotent

Permanently delete entities and all of their descendants. This is destructive and not undoable via this tool. The scene root cannot be deleted. Returns { deleted: }. When NOT to use: to temporarily hide an entity (set enabled=false via modify_entities instead) or to remove a single component (use remove_components).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint, idempotentHint), the description adds crucial behavioral details: deletion is permanent and not undoable, includes all descendants, excludes the scene root, and returns { deleted: <count> }. This meaningfully exceeds what annotations provide and gives an agent a clear mental model of the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: the primary action comes first, followed by important warnings, return value, and usage alternatives. Every sentence contributes meaningful information with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (one parameter), and the description covers the essential aspects: destructive permanence, descendant deletion, the scene root limitation, return value, and when not to use it. The annotations cover idempotency and destructiveness, so no critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only one parameter and 0% schema description coverage, the description helps by clarifying that the ids refer to entities to be deleted along with their descendants, and that the scene root cannot be deleted. While the schema indicates UUID format, the description adds semantic constraints not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action and scope: 'Permanently delete entities and all of their descendants.' It also distinguishes itself from related tools by explicitly naming alternatives like modify_entities and remove_components, making it easy for an agent to identify when this tool is the right choice.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit 'When NOT to use' guidance with specific alternatives: hiding an entity should use modify_entities, and removing a single component should use remove_components. It also conveys the destructive, permanent nature and the special restriction that the scene root cannot be deleted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_sceneA
DestructiveIdempotent

Permanently delete a scene by its id. This is destructive and cannot be undone. When NOT to use: to switch away from a scene without deleting it (use load_scene).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesScene id to delete (the "id" field from list_scenes)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description reinforces this with 'destructive and cannot be undone,' adding permanence beyond the bare annotation. It does not contradict any annotation and provides useful consequence-level context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The action and consequence are front-loaded, and the when-not-to-use guidance is delivered in a compact, directly actionable sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with annotations covering the safety profile, the description covers purpose, usage boundaries, and consequence. No output schema is needed for a delete operation, and nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema description for 'id' already explains that it is the scene id from list_scenes. The description's 'by its id' adds no new meaning. The baseline of 3 applies because the schema does the documentation work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Permanently delete a scene by its id.' It clearly distinguishes the tool from siblings by naming load_scene as the alternative when the intent is to switch away without deleting. The destructive nature is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a 'When NOT to use' condition and names the correct alternative tool (load_scene). This gives an agent a direct decision rule for choosing between delete_scene and its closest sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_checkpointsA
Read-only

Compute the diff between two checkpoints and return the change data. Branch ids default to the current branch. Read-only; does not reload the editor. Use to inspect what changed before merging or restoring. When NOT to use: to roll back to a checkpoint (use restore_checkpoint).

ParametersJSON Schema
NameRequiredDescriptionDefault
dstBranchIdNoBranch of the destination checkpoint (defaults to the current branch)
srcBranchIdNoBranch of the source checkpoint (defaults to the current branch)
dstCheckpointIdYesId of the destination (newer) checkpoint
srcCheckpointIdYesId of the source (older) checkpoint

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only; does not reload the editor.' It adds useful behavioral context beyond the annotations, such as the current-branch default and the fact that the editor is not reloaded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. The core action is front-loaded, followed by key defaults, use guidance, and a clear exclusion. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is moderately complex, with schema and annotations covering most structured details. The description adds use cases and exclusions, but because there is no output schema and the return is only described as 'change data,' the exact shape of the diff result is left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all 4 parameters with descriptions at 100% coverage, so the baseline is 3. The description adds the current-branch default, which is also present in the schema, and does not need to compensate for missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Compute the diff between two checkpoints and return the change data.' It distinguishes itself from related siblings like list_checkpoints and restore_checkpoint, making it clear this tool is for inspecting differences rather than listing or rolling back.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given: 'Use to inspect what changed before merging or restoring.' It also has a clear exclusion: 'When NOT to use: to roll back to a checkpoint (use restore_checkpoint).' This directly routes the agent to the correct alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_assetA
DestructiveIdempotent

Download an asset to a local file. Downloads are limited to 512 MiB and never overwrite unless overwrite=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesLocal output path
assetIdYesAsset ID
overwriteNo

TDQS

A3.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral context beyond the annotations: the 512 MiB size limit and the overwrite policy ('never overwrite unless overwrite=true'). These are critical for safe invocation and complement the destructiveHint and idempotentHint annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence that front-loads the main purpose and then adds two key constraints. Every clause earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter tool with no output schema, the description covers the essential behaviors: destination type, size limit, and overwrite semantics. It does not describe success/error return values, but the direct wording and schema coverage make it reasonably complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, with assetId and path already documented. The description adds semantics for the overwrite parameter by explaining its effect, which partially compensates for the missing schema documentation on that parameter. However, it adds no further detail on assetId or path.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Download an asset to a local file'), making the tool's core function clear. It does not explicitly differentiate itself from sibling tools like download_build or store_download, but the 'asset' and 'local file' phrasing provides enough distinction for a 4 rather than a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given about when to use this tool versus alternatives such as get_asset, download_build, or store_download. The usage context is only implied by the phrase 'Download an asset to a local file,' with no exclusions or alternative tool references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_buildA
Destructive

Create a static or NPM download build, wait for its artifact, and save the archive to an explicit local path. Existing files are not overwritten unless overwrite=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
formatYes
minifyNo
sceneIdsYesScene ids in the designated project
overwriteNo
outputPathYes
sourceMapsNo
concatenateNo
engineVersionNoConfigured engine channel or exact available engine version
primarySceneIdNoPrimary scene; must also be in sceneIds
optimizeSceneFormatNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral traits beyond the annotations: it waits for the artifact, writes to a local path, and does not overwrite existing files unless overwrite=true. This complements the destructiveHint and readOnlyHint=false annotations without contradicting them, though it does not mention potential long-run wait times or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the main action is front-loaded, and the overwrite caveat follows. Every word earns its place, and the description is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 11 parameters and no output schema, the description covers the core required behavior but omits return value structure, prerequisites for required inputs like sceneIds and name, and the semantics of optional flags. It is adequate for basic invocation but not fully complete given the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaningful context for key parameters: format (static or npm), outputPath (explicit local path), and overwrite behavior. However, schema description coverage is only 27%, and the description does not explain many other parameters (name, minify, sourceMaps, concatenate, optimizeSceneFormat, primarySceneId), so it only partially compensates for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Create'), a resource ('static or NPM download build'), and unique behaviors (waiting for the artifact, saving to a local path). It clearly conveys what the tool does, though it does not explicitly name sibling tools like create_build to differentiate them; the 'download' and local-save aspects make the purpose distinct enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a downloadable build artifact is needed locally, but it provides no explicit when-to-use or when-not-to-use guidance. It does not reference alternatives such as create_build or download_asset, leaving usage largely implied rather than explicitly scoped.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

duplicate_assetsA

Duplicate assets in their current folders and return the created asset summaries.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is a mutating operation (readOnlyHint=false) but not destructive. The description adds useful behavioral context by stating duplicates stay in their current folders and that summaries are returned, but it does not disclose details like naming conventions, reference updates, or potential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the primary action and includes the key scoping detail and return behavior. Every word contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one required parameter and no output schema, the description sufficiently covers the operation and its return value. It could be more complete by explicitly explaining that 'ids' selects the assets to duplicate, but the schema and tool name make this reasonably inferable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the 'ids' parameter beyond implying they are asset identifiers. The schema only provides 'Asset ID' on array items, so the description adds little semantic value for parameter interpretation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Duplicate'), the resource ('assets'), and the scope ('in their current folders'). It also specifies the expected return ('created asset summaries'), which distinguishes it from related asset operations like create_assets, move_assets, or delete_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when you want to duplicate assets while keeping them in their original folders. However, it does not explicitly state when not to use it, nor does it mention alternative tools such as move_assets or create_assets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

duplicate_entitiesA

Duplicate existing entities (including their children) in place under the same parent. Returns the new entity summaries. Set rename=true to auto-suffix names to avoid duplicates. When NOT to use: to create a reusable prefab across scenes (create a template asset instead) or to build a brand-new entity (use create_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesEntity resource_ids to duplicate
renameNoAuto-rename duplicates to keep names unique

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations are minimal (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description adds useful behavioral context: duplication includes children, placement is under the same parent, and it returns new entity summaries. The rename=true auto-suffix detail also clarifies name collision handling, though it stops short of describing side effects, transaction behavior, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four short sentences with no filler. It front-loads the core action and placement, then mentions return value, the optional rename flag, and exclusions in a logical order. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description adequately covers what the tool does, what it returns, when to use it, and when not to use it. It could go deeper on edge cases like invalid entity IDs, partial duplication, or reference handling, but the combination of description, schema, and sibling context is sufficient for an agent to select and call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining that rename=true causes auto-suffixing to avoid name conflicts and framing ids as 'existing entities,' which reinforces the schema's 'Entity resource_ids to duplicate'. This adds value beyond the raw schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Duplicate existing entities') and clarifies scope with 'including their children' and 'in place under the same parent'. It also explicitly distinguishes itself from create_entities and template asset creation, making its purpose unambiguous next to siblings like create_entities and duplicate_scene.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an explicit 'When NOT to use' section naming two distinct alternatives: creating a reusable prefab across scenes (template asset) and building a brand-new entity (create_entities). This gives clear decision criteria for selecting this tool over the nearby create_entities and instantiate_template_assets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

duplicate_sceneA

Duplicate an existing scene by its id, giving the copy a new name. Returns the created scene record. When NOT to use: to create an empty scene (use create_scene).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesScene id to duplicate (the "id" field from list_scenes)
nameYesName for the duplicated scene

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/destructive/idempotent flags. The description adds that the operation returns the created scene record and implies the original scene is unchanged by describing the result as a copy. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each with a purpose: action, return value, and usage exclusion. No filler, and the main action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two simple parameters and no output schema, the description adequately explains the return value and the main alternative. It could additionally clarify name-uniqueness behavior, but for a straightforward create-copy tool it is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents id and name. The description mostly restates the schema's meaning ('by its id', 'new name') without adding non-obvious parameter behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action 'Duplicate an existing scene by its id' and the result 'giving the copy a new name'. Clearly a scene-copying operation, and the 'When NOT to use' note differentiates it from create_scene.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative create_scene for the empty-scene case, preventing misuse. The operation's own trigger (duplicating an existing scene) is clear from the verb and resource.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_entities_by_scriptA
Read-only

List the entities whose script component uses a given (registered) script name. Returns compact entity summaries. When NOT to use: to search entities by name (use search_entities) or to read a script's source (use get_asset_text).

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptYesRegistered script name to look up

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds useful behavior: it returns 'compact entity summaries' and constrains the input to registered script names. This is sufficient for a simple read-only lookup, though it doesn't specify behavior when the script name is not found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences: purpose, return type, and exclusions with alternatives. Every sentence adds value and the key purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read-only tool with no output schema, the description communicates the input, the return nature, and the alternatives to avoid misuse. Nothing critical is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter is already documented as 'Registered script name to look up'. The description echoes this concept but does not add substantive new meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a precise resource ('entities whose script component uses a given registered script name'). It also draws an explicit contrast with siblings like search_entities and get_asset_text, making the tool's unique purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says exactly when not to use this tool and names the alternatives: search entities by name via search_entities, and read script source via get_asset_text. This gives an agent clear routing guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

focus_cameraA
Idempotent

Aim the current editor camera to look at a world-space point from a given distance. Useful for framing an exact location before capture_viewport. When NOT to use: to frame specific entities (use focus_viewport) or to move an in-scene camera entity (use modify_entities on its transform).

ParametersJSON Schema
NameRequiredDescriptionDefault
pointYesWorld-space point [x, y, z] to look at
distanceYesDistance from the point at which to place the camera

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clarifies that the operation affects the current editor camera rather than scene entities or saved transforms, which adds meaning beyond the annotations. It also implicitly signals that this changes viewport framing in preparation for capture_viewport, while idempotentHint and destructiveHint are consistent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences and every sentence earns its place: it states the primary behavior, the intended context, and the key exclusions with alternatives. The main use is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter camera-framing tool, the combination of a clear behavioral statement, explicit usage guidance, and alternative routing is complete. The absence of an output schema is not a problem because this operation primarily changes editor state rather than returning structured data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters and their meaning. The description adds no parameter-specific detail beyond the schema, which is acceptable but not value-adding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Aim the current editor camera to look at a world-space point from a given distance.' It clearly distinguishes itself from related tools by naming focus_viewport and modify_entities as the alternatives for different use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives both a positive use case ('framing an exact location before capture_viewport') and explicit not-to-use cases with direct alternatives ('use focus_viewport' for entities, 'use modify_entities' for in-scene camera entities). This makes selection unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

focus_viewportA
Idempotent

Frame the editor camera on the given entities, optionally from a preset view (top/front/etc.) or a custom yaw/pitch. Useful before capture_viewport. Returns { focused: }. When NOT to use: to move an in-scene camera entity (use modify_entities on its transform).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesEntity resource_ids to frame
yawNoCustom horizontal angle (degrees); ignored if view is set
viewNoPreset camera orientation
pitchNoCustom vertical angle (degrees); ignored if view is set

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that the tool is non-read-only, idempotent, and non-destructive. The description adds useful behavioral context by clarifying that it affects the editor viewport camera rather than scene entities and by revealing the return shape '{ focused: <count> }'. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four short sentences, each contributing a distinct piece of information: the action, the use case, the return value, and the exclusion. It is front-loaded and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though there is no output schema, the description explicitly states the return value. It also provides a positive workflow hint and an explicit mis-use exclusion, which is enough for a simple viewport framing tool. The only minor gap is not directly differentiating from the sibling focus_camera, but the 'editor camera' phrasing resolves most ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage with descriptions, so the baseline is 3. The description paraphrases the schema's 'view' and 'yaw/pitch' concepts without adding new constraints or behavioral details. It does not need to compensate for missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Frame'), a clear resource ('editor camera'), and the target ('given entities'), while also covering optional preset views and custom yaw/pitch. It distinguishes itself from capture_viewport and in-scene camera movement by naming the editor camera as the object being affected.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete workflow context with 'Useful before capture_viewport' and explicitly names an alternative for a common mis-use case: moving an in-scene camera entity via modify_entities. This is strong routing guidance that helps an agent select the correct tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_texture_metadataB
Idempotent

Generate missing pipeline metadata for a texture asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotentHint=true and destructiveHint=false. The description adds the context that only 'missing' metadata is generated, which implies existing metadata is not overwritten. This is useful but minimal; no mention is made of what changes occur or what the tool returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes to the core meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameter documentation, the description leaves critical gaps: what exactly is pipeline metadata, what the return value is, and whether the tool modifies the asset or returns data. For an agent to invoke it confidently, more context is needed even though the tool is simple.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the only parameter 'id' has no schema description. The description implies 'id' refers to a texture asset, but it does not explicitly explain what the id identifies, how to obtain it, or what valid values mean beyond being a positive integer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Generate') and a specific resource ('metadata for a texture asset'). It is reasonably distinct from texture-related siblings like convert_texture_asset or process_texture_variants, though 'pipeline metadata' is somewhat vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus texture conversion or processing siblings. The phrase 'missing pipeline metadata' implies a use case, but the description never states conditions, prerequisites, or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_animation_eventsA
Read-only

Get the stable-id event map for a GLB animation asset, including time and optional number/string payloads.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesGLB animation asset id

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, so the description is not burdened with stating that the operation is read-only. It adds the semantic detail that the event map is stable-id based and includes time and payloads, but it does not describe other behavioral traits such as error handling, ordering, or determinism beyond what the annotation covers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that specifies the action, resource, and key output content without any filler words. Every phrase contributes meaning, from 'stable-id event map' to 'time and optional number/string payloads'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with a readOnlyHint annotation, the description conveys the essential purpose and the shape of the returned data (event map with time and optional payloads). Since there is no output schema, the description partially fills the return-format gap, though 'stable-id event map' could be defined more precisely for agents unfamiliar with the domain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers the single parameter assetId with 100% coverage, including a clear description ('GLB animation asset id') and bounds. The description does not need to add parameter-level detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the operation: getting a stable-id event map for a GLB animation asset, with specific content details (time, optional number/string payloads). The verb 'Get' and the resource 'event map' are explicit, and the tool is clearly distinct from its sibling 'modify_animation_events' which writes rather than reads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies a read-only use case by using 'Get', but it does not explicitly state when to choose this tool over alternatives or mention any exclusions. There is no direct reference to the sibling 'modify_animation_events' for write operations, so usage guidance is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_anim_state_graphA
Read-only

Get the complete structural data for an anim state graph asset, including layers, states, transitions, conditions, and parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesAnim state graph asset id

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description aligns with that by saying 'Get'. It adds useful behavioral context beyond the annotations by enumerating the returned structural content (layers, states, transitions, conditions, parameters), which is valuable given there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, focused sentence that leads with the action and resource, then enriches with a concise list of included data. No filler or redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one well-documented parameter and readOnly annotations, the description is largely sufficient. Since there is no output schema, the explicit 'including' list partially fills the gap, though it does not describe edge cases like missing assets or the exact nesting of returned structures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the assetId parameter is already described as 'Anim state graph asset id'. The tool description does not add extra parameter-level meaning, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), a specific resource ('anim state graph asset'), and the nature of the payload ('complete structural data... including layers, states, transitions, conditions, and parameters'). This clearly distinguishes it from sibling tools like modify_anim_state_graph or get_animation_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this tool is for reading an anim state graph's structure, but it does not explicitly compare it with alternatives such as modify_anim_state_graph or get_animation_events, and it gives no when-not-to-use guidance. Usage is inferable but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assetA
Read-only

Get the complete JSON for one project asset by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAsset ID

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that the result is the complete JSON, which is mildly useful, but it does not disclose error behavior, access permissions, or response shape beyond 'complete JSON'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single clear sentence with no waste. The key scoping ('one', 'by id') and output type ('complete JSON') are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only getter, the description is largely complete: it says what it returns, identifies the lookup key, and annotations confirm safety. It lacks explicit routing to sibling asset tools, but that is not essential for invoking this simple tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the id parameter already has a description ('Asset ID'). The tool description only restates that lookup is by id, adding no new semantic detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), resource ('one project asset'), and selection key ('by id'), and specifies the result is the complete JSON. This distinguishes it from sibling tools like get_asset_references, get_asset_text, and download_asset without requiring the agent to open their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to choose this tool over alternatives or when not to use it. There is no mention of alternatives such as list_assets for querying multiple assets or get_asset_references for reference data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_referencesA
Read-only

List the project assets, entities, or settings that reference an asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAsset ID

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes this is a safe read operation, so the description's main added value is clarifying that the result spans assets, entities, and settings. It does not describe output shape or potential breadth/performance behavior, but for a simple read-only lookup the baseline bar is met.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that immediately conveys the action and scope. There is no redundant wording or filler, and the key behavior is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only lookup tool, the description covers the essential purpose and result categories. The absence of an output schema is not a major gap since the description tells the agent what kinds of items will be listed. A short note about response format would make it fully complete, but it is already sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides full coverage of the single `id` parameter with 'Asset ID'. The description adds only the context that this ID identifies an asset, which is already implied. With 100% schema coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and a precise resource ('project assets, entities, or settings that reference an asset'). It clearly distinguishes this tool from generic asset getters like get_asset by focusing on inbound references rather than the asset itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when you need to discover which project items depend on or reference a given asset, but it does not explicitly state when not to use it or name alternatives. Context is clear but exclusions are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_asset_textA
Read-only

Read the full text contents of a text-based asset (script, text, json, css, html, or shader), returned as text. When NOT to use: to read a script's declared name or attribute definitions (use script_parse), to read binary assets like textures or models, or to list assets (use list_assets).

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesAsset id of a text-based asset (script, text, json, css, html, shader)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds meaningful context by specifying that the full text contents are returned as text and that the tool does not serve binary assets. This is sufficient for a simple read operation, though it doesn't mention potential size limits or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler: the first sentence front-loads the operation and return type, and the second sentence gives precise negative usage guidance. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool, the description fully covers what the tool does, what it returns, what asset types it applies to, and when to use sibling tools instead. No output schema is needed because the return type is stated explicitly as text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents the only parameter, assetId, with the same valid text-based asset types listed in the description. Schema description coverage is 100%, so the description adds little beyond re-emphasizing what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('full text contents of a text-based asset'), and explicitly enumerates valid asset types (script, text, json, css, html, shader). It also distinguishes itself from siblings by naming what it is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit 'When NOT to use' section with concrete alternatives: script_parse for declared name/attribute definitions and list_assets for listing assets. It also rules out binary assets like textures or models, giving clear selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_buildA
Read-only

Get a publish or download build job by id from the designated project.

ParametersJSON Schema
NameRequiredDescriptionDefault
buildIdYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is established. The description adds the useful scoping detail that this applies to publish or download build jobs, but it does not disclose additional behaviors such as return shape, not-found handling, or project designation mechanics. With annotations covering the read-only nature, a middle score is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every phrase contributes meaning: the operation, the resource subtype, the lookup key, and the project scope. It is appropriately sized for a simple single-parameter getter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only getter, the description is mostly complete: it names what is returned and how it is identified. The main gap is that it does not describe what the returned build job object will contain, and 'designated project' is not explained since the schema only accepts buildId. Still, the tool is simple enough that this is a minor omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden for parameter semantics. It only repeats the idea of 'by id' without adding anything beyond the schema property name 'buildId'. The schema itself already provides type and exclusiveMinimum, but the description does not clarify the meaning or origin of the buildId beyond what the property name already implies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation ('Get'), the resource ('a publish or download build job'), the selector ('by id'), and the scope ('from the designated project'). This differentiates it from siblings like list_builds (listing), create_build (creating), and delete_build (deleting), so an agent can identify the intended tool without inspecting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'by id' implies this tool should be used when a specific buildId is already known, and the mention of 'from the designated project' gives some context. However, there is no explicit guidance about when not to use it or which sibling alternative to choose when the buildId is unknown, such as list_builds.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_checkpointA
Read-only

Get a single checkpoint by its id. Returns the checkpoint record ({ id, createdAt, description, user }). When NOT to use: to list a branch's checkpoints (use list_checkpoints).

ParametersJSON Schema
NameRequiredDescriptionDefault
checkpointIdYesId of the checkpoint to get (from list_checkpoints)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds behavioral value by specifying the exact return record shape ({ id, createdAt, description, user }), which is especially useful since no output schema is provided. It does not describe not-found behavior, but this is minor for a simple read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. The primary purpose is front-loaded, the return shape is usefully specified, and the exclusion/alternative is stated efficiently. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with no output schema, the description covers the core call semantics, the return shape, and the main alternative. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter description already explains 'Id of the checkpoint to get (from list_checkpoints).' The tool description adds little beyond restating 'by its id,' so the schema carries the semantic weight. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get a single checkpoint by its id.' It also explicitly differentiates from list_checkpoints by saying not to use it for listing a branch's checkpoints, so an agent can distinguish the tool from its closest sibling without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use context ('Get a single checkpoint by its id') and an explicit when-not-to-use condition with the correct alternative: 'to list a branch's checkpoints (use list_checkpoints).' This is clear routing guidance beyond simple domain inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_conflict_fileA
Read-only

Read the content of one side of a conflicting file so you can decide how to resolve it. Read-only; does not resolve anything. When NOT to use: to choose a resolution (use resolve_conflicts).

ParametersJSON Schema
NameRequiredDescriptionDefault
mergeIdYesId of the merge (from start_merge)
fileNameYesName of the conflicting file (from the conflict record)
resolvedNoFetch the resolved version instead of the original (default false)
conflictIdYesId of the conflict (from the merge's conflicts list)

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only; does not resolve anything,' explicitly naming the side effect it does not perform. It does not describe return shape or edge cases, but for a read-only tool this is a minor gap rather than a serious omission. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences deliver the core action, the read-only safety property, and the explicit exclusion of resolve_conflicts. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only conflict-file reading tool, the description plus the fully documented schema covers what an agent needs to call it correctly. The absence of an output schema is acceptable because the description already states that the tool reads file content, and no nested objects or complex return constraints exist.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a meaningful description explaining its origin, such as 'from start_merge' and 'from the conflict record'. The tool description adds no parameter-specific detail beyond the schema, so the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Read the content of one side of a conflicting file' for the purpose of deciding how to resolve it. It also explicitly distinguishes the tool from resolve_conflicts by stating it is read-only and does not resolve anything.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use the tool — to read conflict content while deciding a resolution — and when not to use it: 'to choose a resolution (use resolve_conflicts)'. This explicit exclusion and sibling routing leaves little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_entityA
Read-only

Get the complete edit-time JSON for one entity by resource_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description does not need to restate safety. It adds the meaningful detail that the return payload is the 'complete edit-time JSON' and that lookup is by resource_id, but it does not disclose behavior such as error handling, whether deleted entities return empty, or the exact structure of the JSON.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence with no filler. The core purpose and the key qualifier ('complete edit-time JSON') are front-loaded, making it immediately scannable and actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with one well-documented parameter and no output schema, the description is mostly sufficient. It communicates what will be returned (complete edit-time JSON) and how to identify the entity. Missing details like error behavior or a return structure example are minor for this tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents the single parameter id as 'Entity ID' with 100% coverage. The description adds the useful clarification that id is the resource_id, linking the parameter to the concept of an entity resource. This is extra meaning beyond the schema, though the mapping is not perfectly explicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get') and resource ('entity'), and specifies it returns the complete edit-time JSON for one entity by resource_id. This clearly distinguishes it from list_entities (which lists entities) and get_selection (which gets selected entities), even without explicitly naming siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied: an agent should use this when it needs the full edit-time JSON for a specific entity identified by its ID. However, there is no explicit guidance about when to prefer alternatives like list_entities, resolve_entities, or get_selection, and no mention of prerequisites such as the entity already existing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mergeA
Read-only

Get the current state of a merge, including its status and full conflict list ({ id, mergeProgressStatus, conflicts, numConflicts }). Use to re-check which conflicts are still unresolved before apply_merge. When NOT to use: to start a merge (use start_merge).

ParametersJSON Schema
NameRequiredDescriptionDefault
mergeIdYesId of the merge (from start_merge)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals safety, and the description adds useful behavioral specificity beyond annotations: it discloses the exact return shape and clarifies that the tool is for inspecting, not initiating, merge progress. It doesn't fully detail possible statuses or conflict structures, but this is minor given the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler: it opens with the core action and return payload, then provides usage context and an exclusion. Every sentence earns its place and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with one parameter and no output schema, this description is fully sufficient. It covers return values, when to use, and when not to use, which is everything an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the only parameter, mergeId, is already documented as 'Id of the merge (from start_merge).' The description implicitly reinforces this by referencing apply_merge and start_merge, but it adds no significant new semantic detail beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), a specific resource ('current state of a merge'), and enumerates the returned fields, making the tool's function unambiguous. It also explicitly names the sibling it is not (start_merge), so an agent can quickly distinguish it from other merge-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit usage context: 're-check which conflicts are still unresolved before apply_merge,' and an explicit negative case with an alternative: 'When NOT to use: to start a merge (use start_merge).' This is ideal routing guidance for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sceneA
Read-only

Get a single scene by its id (not uniqueId). Returns the full scene record. When NOT to use: to load/switch to a scene in the editor (use load_scene) or to list scenes (use list_scenes).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesScene id (the "id" field from list_scenes, not uniqueId)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations by specifying the id ('not uniqueId') and that the full scene record is returned, helping set expectations for the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, all earning their place: the first states the core action, the second the return value, and the third routes away from misuses. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter getter with readOnlyHint=true, the description covers the id source, return shape, and alternative tools. The lack of an output schema is fine because the description explicitly notes the full scene record is returned. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema description already explains the id parameter and its relationship to list_scenes. The description repeats similar id semantics without adding new parameter-specific syntax, format, or edge-case details, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get a single scene by its id'), clarifies it returns the full scene record, and explicitly differentiates from sibling tools load_scene and list_scenes. An agent can immediately understand this is a read-by-id operation for full scene data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides 'When NOT to use' guidance, naming the alternatives load_scene for loading/switching scenes and list_scenes for listing scenes. This gives clear routing context for the agent with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_selectionA
Read-only

Read the editor's current selection. Returns { type: "entity" | "asset" | null, ids: [...] }. Entity ids are resource_ids (strings); asset ids are numbers. When NOT to use: to list all entities/assets (use list_entities/list_assets).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds valuable behavioral detail by specifying the return shape, the possible type values, and the ID type distinction between entity and asset IDs. This goes beyond what annotations alone communicate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler: the action is first, return shape follows, and the exclusion with alternatives is stated crisply. Every sentence adds information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool, the description is fully adequate. It explains the return shape, distinguishes entity vs asset IDs, and routes the agent away from listing tools. No critical information is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the parameter-semantics burden is minimal. The description adds relevant output semantics (return type and ID types) that help an agent understand what the tool will provide even without parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Read') and resource ('the editor's current selection'), and clearly distinguishes itself from list_entities/list_assets by stating what it is not for. This makes it easy to differentiate from sibling tools like set_selection and clear_selection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a 'When NOT to use' section with named alternatives (list_entities/list_assets). This gives clear routing guidance for an agent deciding between selection-reading and entity/asset listing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_template_overridesA
Read-only

Read the current apply/revert override records for a template instance.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityIdYesEntity ID

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description's 'Read' aligns with that. The description adds the context that these are 'current apply/revert override records,' which is useful, but it does not disclose any additional behavioral traits such as empty results, error conditions, or effects on template instance state. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no filler or redundant restating of the tool name. The key operation and resource are front-loaded, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only getter, the description is mostly complete: it names the resource, identifies the parameter semantics, and aligns with the readOnlyHint annotation. However, there is no explicit mention of what the returned override records look like, and no output schema exists to fill that gap, leaving a small amount of ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes entityId only as 'Entity ID' with a UUID format, which is vague. The description adds important meaning by clarifying that the entity ID refers to a template instance whose override records are being read, going beyond the structured schema information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Read' and names a clear resource: 'the current apply/revert override records for a template instance.' This distinguishes it from sibling mutation tools like apply_template_overrides and revert_template_overrides, even without naming them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used to inspect override state for a template instance, but it does not explicitly state when to choose this tool over applying, reverting, or unlinking overrides, nor does it mention any preconditions. The read-only intent is obvious from the verb, but concrete usage guidance is absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hard_reset_checkpointA
DestructiveIdempotent

DESTRUCTIVE: reset the branch head back to a checkpoint and PERMANENTLY ERASE every checkpoint created after it. Cannot be undone. This RELOADS the editor; the tool waits for it to reconnect and returns the resulting vcs_status. When NOT to use: to roll back working state while keeping history (use restore_checkpoint).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchIdNoBranch to hard reset (defaults to the current branch)
checkpointIdYesId of the checkpoint to hard reset to (from list_checkpoints); all later checkpoints are erased

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral traits beyond the destructiveHint annotation: irreversible erasure, editor reload, waiting for reconnect, and returning vcs_status. It does not contradict annotations; the idempotentHint and destructiveHint are consistent with a reset that can be repeated and has destructive side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the destructive warning is front-loaded, key side effects are stated compactly, the return value is noted, and the alternative is given without extra prose. The description is dense but highly readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, editor-reloading operation with no output schema, the description covers the action, the irreversibility, the side effect on the editor, the return value, and the alternative tool. An agent has enough information to decide when to call this tool and what to expect afterward.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both branchId and checkpointId. The description reinforces the meaning of checkpointId indirectly by explaining that later checkpoints are erased, but it does not add new parameter-level detail beyond the schema, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reset the branch head back to a checkpoint, and clearly specifies the destructive consequence: permanently erasing every later checkpoint. It also distinguishes itself from restore_checkpoint, which is a sibling with a similar purpose but a different use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides a 'When NOT to use' condition and names the alternative restore_checkpoint for rolling back working state while keeping history. This gives an agent clear routing guidance beyond mere capability description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inject_inputA

Dispatch keyboard / mouse / touch input to the RUNNING Launch instance so you can drive end-to-end interactions ("press W to move", "click a button", "tap the screen"). Requires launch_start first. Events run in order; coordinates are CSS pixels from the canvas top-left (match capture_runtime's framing). Returns { dispatched }. Patterns: key press with holdMs to move for a duration; mouse click at (x,y); a down→move…→up sequence for dragging; touch tap for mobile UI. After injecting, use capture_runtime / read_runtime_logs / query the scene to observe the effect. When NOT to use: to change entity data directly (use modify_entities) or before launch_start.

ParametersJSON Schema
NameRequiredDescriptionDefault
eventsYesOrdered list of input events to dispatch
betweenMsNoDelay between consecutive events (default 0)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark non-read-only, non-idempotent, non-destructive. The description adds useful behavior beyond that: events run in order, coordinates are CSS pixels from canvas top-left, and returns { dispatched }. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, prerequisite, coordinate framing, return shape, common patterns, follow-up observation, and exclusions. Front-loaded and well structured with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description specifies the return. It also covers prerequisites, ordering semantics, coordinate space, event patterns, how to verify effects, and when to use an alternative. This is complete for an input-injection tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter and enum is already documented in the schema. The description adds practical usage patterns but no new parameter semantics, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: dispatches keyboard/mouse/touch input to the RUNNING Launch instance. Clearly differentiates from siblings like launch_start, capture_runtime, and modify_entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly requires launch_start first, gives post-injection observation tools (capture_runtime / read_runtime_logs / query scene), and lists when NOT to use: for direct entity data changes use modify_entities, or before launch_start.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

instantiate_template_assetsA

Instantiate template assets into the scene, creating entity hierarchies from them. Returns the created entity summaries. When NOT to use: for non-template assets (only type="template" assets can be instantiated) or to build an entity from scratch (use create_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesTemplate asset ids to instantiate
indexNoInsertion index under the parent
parentIdNoParent entity resource_id; defaults to the scene root

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the core behavior beyond the annotations: it creates entity hierarchies in the scene and returns the created entity summaries. It also states the template-only restriction. Annotations already mark the operation as non-read-only and non-idempotent, so the description adds meaningful behavioral context without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences: the first states the operation, effect, and return value; the second gives explicit exclusions and the alternative. No filler, and the key constraint is presented clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with three params, one required, and schema fully documenting them, the description is complete. It states the output, the input restriction, and the alternative for a different use case. An agent has enough context to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all three parameters already documented in the input schema. The tool description doesn't add parameter-specific detail, but it doesn't need to because the schema carries that weight. Repeating parameter meaning would be redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Instantiate') and resource ('template assets') plus the outcome ('creating entity hierarchies from them') and return value. It also explicitly contrasts itself with create_entities, making its purpose unmistakable even among many sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when NOT to use the tool: for non-template assets, since only type="template" assets can be instantiated, and for building an entity from scratch, where create_entities is the alternative. This gives clear decision criteria for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

launch_startA

Start a real Launch runtime instance of the current scene (the editor's Launch button) so scripts, physics, animation and input actually run. Opens the launch page in a new browser window with debug logging on; the editor bridges it automatically. Returns { url, sceneId, ready, adopted } where ready=true means the runtime is usable by capture_runtime / read_runtime_logs, and adopted=true means it attached to an app that was already running instead of starting a new one (which happens only when no options are passed, so pass an option to force a fresh launch). This is the prerequisite for all runtime tools. If ready=false, the page may still be loading or popups were blocked; poll read_runtime_logs or retry. When NOT to use: to screenshot the editor (use capture_viewport); to change the scene (edit-time tools).

ParametersJSON Schema
NameRequiredDescriptionDefault
debugNo
deviceNoGraphics device to launch with (default: project setting)
waitMsNoHow long to wait for the runtime to connect before returning (default 20000)
bundlesNo
profilerNo
miniStatsNo
concatenateNo
engineVersionNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide openWorldHint=true and destructiveHint=false, but the description adds significant behavioral context beyond that: it opens a new browser window, enables debug logging, explains the adopted flag semantics (attaches to existing runtime only when no options passed), describes the ready flag meaning, and notes popup-blocking as a failure mode. The only mild gap is not detailing side effects on a previously running runtime instance, but the adopted explanation covers the main behavioral nuance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: it front-loads the core action and effect, then the return contract, then the prerequisite/retry guidance, and finally the exclusion list. Every sentence earns its place. It is longer than average, but the tool has nontrivial semantics (ready/adopted flags, popup blocking, fresh-launch behavior) that justify the length. Slightly trimmed phrasing on the adopted clause would make it a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity — return flags needing interpretation, a browser-window side effect, failure modes, and prerequisite relationships to many sibling tools — the description covers everything an agent needs to invoke it correctly and interpret its result. The output contract ({ url, sceneId, ready, adopted }) is fully explained, which matters because there is no output schema. The failure handling for ready=false is explicitly specified. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25%, so the description compensates somewhat by explaining that passing any option forces a fresh launch rather than adoption — this adds meaning to the parameter set as a whole. However, the description does not explain individual parameters like debug, bundles, profiler, miniStats, concatenate, or engineVersion, which remain undocumented in both the schema and description. The device enum has a schema description, and waitMs has one, but the remaining booleans are opaque. The baseline is 3 and the description adds aggregate-level semantics, but per-parameter meaning is still missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Start a real Launch runtime instance of the current scene...' It is immediately distinguishable from siblings like capture_viewport (editor screenshot), capture_runtime (uses the launched runtime), and launch_stop (the inverse operation). The phrase 'the editor's Launch button' grounds it in a familiar concept, and the explicit 'When NOT to use' list further differentiates it from capture_viewport and edit-time tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use ('This is the prerequisite for all runtime tools'), what to do if ready=false ('poll read_runtime_logs or retry'), and when NOT to use, naming the alternative tools (capture_viewport for screenshots, edit-time tools for scene changes). It also explains the adoption edge case and how to force a fresh launch by passing an option. This is comprehensive routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

launch_stopA
DestructiveIdempotent

Stop the running Launch instance started by launch_start (closes the launch window). Returns { stopped }. When NOT to use: there is no need to call this between captures — keep the instance running and re-capture.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true), the description adds that the call closes the launch window and returns { stopped }. It does not contradict the annotations and provides useful lifecycle context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences carry all the needed information: purpose, effect, return value, and when not to use it. Every phrase earns its place, and the 'When NOT to use' guidance is clearly separated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter tool with no output schema, the description fully covers the operation, its lifecycle role, return value, and the common misuse case. An agent selecting among the runtime siblings has enough to invoke and reason about launch_stop correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the description cannot add much beyond the empty schema. Per the 0-parameter baseline, a 4 is appropriate; nothing is undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Stop'), a specific resource ('the running Launch instance started by launch_start'), and the concrete effect ('closes the launch window'). This clearly distinguishes the tool from launch_start and the rest of the runtime workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-not guidance is provided: 'there is no need to call this between captures — keep the instance running and re-capture.' This routes the agent away from stopping and toward re-capturing, which is an explicit alternative behavior. The paired use with launch_start is also clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assetsA
Read-only

List project assets, returning compact summaries by default (id, name, type, folder, tags). Results are paginated: use limit (default 50) and offset; the response meta includes total, count, hasMore and nextCursor. Filter with type, name (case-insensitive contains) and/or tag. Use full=true only when you need the complete asset JSON (large). An empty result is a successful, empty list (not an error). When NOT to use: to search the public asset store (use store_search).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter by tag
fullNoReturn full asset JSON instead of the compact summary (much larger)
nameNoFilter by name (case-insensitive contains)
typeNoFilter by asset type
limitNoMax assets to return (default 50)
offsetNoNumber of assets to skip (use nextCursor from a previous page)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, and the description adds meaningful behavioral detail: pagination semantics (limit/offset, nextCursor, meta fields), default compact vs full payloads, and the fact that an empty result is a success, not an error. This is exactly the kind of nuance an agent needs and cannot get from schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then layers pagination, filtering, the full flag, empty-list behavior, and the sibling alternative without wasted words. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with no output schema, the description covers the return contract (compact fields, meta fields), pagination mechanics, filter semantics, performance consideration for full=true, and error semantics for empty results. An agent has enough to call it correctly without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds value beyond the schema by explaining how parameters work together (default limit of 50, offset used with nextCursor, filters combinable by type/name/tag) and when full is worth the size cost.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('List project assets') and immediately defines the default return shape (compact summaries with id, name, type, folder, tags). It also distinguishes itself from the public asset search by explicitly pointing to store_search, which makes it easy to tell apart from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'When NOT to use: to search the public asset store (use store_search)' is an explicit routing rule to the correct sibling. It also states when full=true is appropriate, giving the agent actionable selection criteria beyond the raw schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_branchesA
Read-only

List the project's branches. Returns branch records ({ id, name, createdAt, closed, permanent, latestCheckpointId, user }). Paginates via limit + cursor (meta.nextCursor); set closed:true to include closed branches, favorite:true for your favourites. When NOT to use: to read the current branch (use vcs_status).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax branches to return
closedNoInclude closed branches
cursorNoPagination cursor (a branch id from a previous meta.nextCursor)
favoriteNoList only your favourite branches

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context: pagination via limit + cursor, the meta.nextCursor response mechanism, and the effect of the closed and favorite flags. It does not contradict the annotations and provides useful operational detail beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core purpose and return shape, then covers pagination, filtering, and the key exclusion, all in a compact and scannable form.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list operation with no required parameters and 100% schema coverage, the description fully covers return values, pagination, filtering behavior, and the main alternative tool. No critical information is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are already documented at a basic level. The description adds extra meaning by explaining the pagination relationship between limit and cursor, that cursor comes from a previous meta.nextCursor, and that favorite:true filters to the user's favourites, which goes beyond the schema's one-line descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('List the project's branches') and goes beyond the tool name by detailing the exact return record shape. It also distinguishes itself from sibling vcs_status by explicitly stating when not to use it, which makes the tool's purpose unambiguous among many similar branch/checkout tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when NOT to use the tool ('to read the current branch (use vcs_status)') and names the alternative. It also clarifies how to use filtering parameters for closed branches and favorites, giving an agent clear decision criteria without needing to inspect the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_buildsC
Read-only

List publish and download builds for the designated project, including durable job status and artifacts.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
actorNo
limitNo
branchNo
cursorNo
formatNo
statusNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds some behavioral context by noting that the result includes durable job status and artifacts, but it does not explain pagination, filtering semantics, or what 'durable' means in practice. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise sentence with the main action front-loaded and no filler. It loses a point only because some terms like 'durable job status' are vaguely worded and could be more precise without lengthening the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameter descriptions, the description leaves an agent uncertain about how to filter or paginate results. It mentions status and artifacts as included output, but does not describe the behavior of the cursor, limit, format, actor, or branch parameters. The readOnly annotation helps, but the description is still incomplete for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description bears the burden of explaining parameters. It only hints at the type enum via 'publish and download builds' and at status via 'durable job status,' but leaves actor, limit, branch, cursor, format, and status filter semantics unexplained. This is insufficient for seven parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('List') on a specific resource ('publish and download builds') for a designated project, and adds that results include job status and artifacts. It distinguishes the tool as a listing operation from siblings like get_build or download_build, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus get_build, create_build, or download_build. There is no mention of alternatives, exclusions, or conditions that would lead an agent to choose this tool over a sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_checkpointsA
Read-only

List checkpoints on a branch (the current branch by default), newest first. Returns records ({ id, createdAt, description, user }). Paginates via limit + cursor (meta.nextCursor); backend default limit 25, max 50. Use a checkpoint id with restore_checkpoint / hard_reset_checkpoint. When NOT to use: to list branches (use list_branches).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax checkpoints to return (max 50)
cursorNoPagination cursor (a checkpoint id from a previous meta.nextCursor)
branchIdNoBranch to list checkpoints for (defaults to the current branch)

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already marks this as safe, and the description adds valuable behavioral detail: pagination via limit + cursor with meta.nextCursor, backend defaults (limit 25, max 50), and the exact record shape. These details go beyond the annotation and tell the agent what to expect from the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but compact: purpose, ordering, return shape, pagination, default limits, and a routing directive all fit in four short sentences. Every sentence earns its place and no content is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list operation with zero required parameters and full schema coverage, the description covers everything needed: what is returned, how pagination works, what defaults apply, and how to distinguish it from list_branches. There is no output schema, but the description supplies the essential return contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description goes further by explaining the effective default limit (25), the max boundary (50), the pagination contract via meta.nextCursor, and that branchId defaults to the current branch. This adds practical meaning beyond the raw parameter names and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('List checkpoints'), a clear resource ('on a branch'), and a precise scope (current branch by default) with ordering ('newest first'). It also names its closest alternative, list_branches, and the distinct use case, eliminating any ambiguity between siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the checkpoint id with restore_checkpoint or hard_reset_checkpoint, linking this read tool to the related mutation tools. It also gives a clear 'When NOT to use' directive: to list branches, use list_branches, which is direct guidance an agent can act on.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_entitiesA
Read-only

List entities in the current scene, returning compact summaries by default (resource_id, name, hierarchy path, parent, enabled, tags, component names). Results are paginated: use limit (default 50) and offset to page through large scenes; the response meta includes total, count, hasMore and nextCursor. Filter with name (case-insensitive contains), component (only entities with that component) and/or tag. Use full=true only when you need the complete entity JSON (large; prefer summaries). An empty result is a successful, empty list (not an error). When NOT to use: when you already know an entity id and just need to act on it; for runtime/play-mode state (this returns edit-time data only).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFilter by tag
fullNoReturn full entity JSON instead of the compact summary (much larger)
nameNoFilter by name (case-insensitive contains)
limitNoMax entities to return (default 50)
offsetNoNumber of entities to skip (use nextCursor from a previous page)
componentNoFilter to entities that have this component

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only state readOnlyHint=true and openWorldHint=false. The description adds substantial behavioral detail beyond that: pagination behavior with total/count/hasMore/nextCursor, default limit of 50, empty results being successful rather than errors, and edit-time-only data. This fully informs the agent of expected runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact but information-dense, with each sentence earning its place. It front-loads the core purpose and return format, then covers filters, pagination, full mode, empty results, and exclusions in a logical order without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for this tool's complexity. It covers the return format, pagination meta, filter options, full-mode tradeoff, empty-result semantics, edit-time limitation, and relevant non-use cases. Even without an output schema, an agent has enough information to call this tool correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter. The description does restate some parameter semantics like default limit and full entity size, but adds little new meaning beyond what the schema already provides. This matches the baseline score for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool lists entities in the current scene and describes the compact summary format. It is specific about verb, resource, and scope, but it does not explicitly name sibling tools like search_entities or get_entity to draw a sharp contrast, so it falls slightly short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: when to use pagination, when full=true is appropriate, and when not to use the tool (known entity id, runtime/play-mode state). However, it stops short of explicitly naming the alternative tools to use in those cases, which would make the guidance fully actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_scenesA
Read-only

List the scenes in the current project/branch. Returns scene records including id, uniqueId and name. Use uniqueId with load_scene to switch scenes, and id with get_scene / duplicate_scene / delete_scene. When NOT to use: to list assets (use list_assets).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already provide readOnlyHint, so the description adds useful behavioral context by scoping results to the current project/branch and describing the returned record shape. It does not contradict the annotations and provides meaningful information beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three dense sentences with no filler. It front-loads the core purpose, then provides ID routing and an explicit exclusion, every sentence earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only list tool with no output schema, the description is complete: it specifies scope, return fields, relationships to sibling tools, and the primary alternative. An agent has everything needed to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so there is no parameter documentation burden. The description adds value by explaining the meaning of the returned fields and how they relate to other tools, compensating for the lack of an output schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List the scenes in the current project/branch.' It also names the returned fields (id, uniqueId, name) and explicitly distinguishes itself from list_assets, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives direct usage guidance: use uniqueId with load_scene and id with get_scene/duplicate_scene/delete_scene. It also explicitly says when NOT to use this tool—when listing assets—and names the correct alternative, list_assets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_store_licensesA
Read-only

List valid Store licenses for project imports.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only behavior is covered. The description adds minor scoping with 'valid' and 'for project imports,' but it does not explain what makes a license valid, whether external state is consulted, or what the returned list contains. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that directly states the action and scope. It contains no filler, repetition, or extraneous detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing tool, the description is nearly complete. It could add a bit more context about what qualifies as a 'valid' license or what the returned list looks like, but the current wording is adequate for a simple list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so there is nothing for the description to clarify. The baseline of 4 applies because parameter documentation is not needed here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and identifies a clear resource ('valid Store licenses for project imports'), which is enough to distinguish it from asset searching and downloading siblings. It is concise and meaningful, though it does not explicitly name a differentiating sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use guidance or alternative routing. The phrase 'for project imports' hints at the intended context, but it does not tell an agent when to choose this tool over store_search, store_get, store_download, or my_assets_import.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_sceneA
Idempotent

Load (switch the editor to) a scene by its uniqueId. This unloads the current scene and opens the target one. By default the tool returns after queuing the load. Set wait=true to return only after the requested scene is active. When NOT to use: to read a scene without switching (use get_scene) or to create a new scene (use create_scene).

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNoWait until the editor reports the requested scene is active
uniqueIdYesScene uniqueId (the "uniqueId" field from list_scenes, not id)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it discloses that the current scene is unloaded and that loading is asynchronous by default, returning only after the scene is active with wait=true. These are meaningful side effects and timing behaviors an agent needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short, front-loaded sentences with no filler. Every sentence contributes either core semantics, timing behavior, or routing guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with annotations covering idempotence and destructiveness, the description covers operation, side effects, default behavior, the wait option, and alternatives. No critical calling information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents both parameters, so the baseline is 3. The description adds value by explaining the wait parameter's behavioral effect (queued load vs waiting until active), though it adds little beyond schema for uniqueId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Load (switch the editor to) a scene by its uniqueId') and explains the switching semantics ('unloads the current scene and opens the target one'), making it clearly distinct from read-only operations like get_scene.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when not to use the tool and names the alternatives (get_scene for reading, create_scene for creating), and explains the wait=true option versus the default queued-return behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_animation_eventsA
Destructive

Add, update, or remove GLB animation events as one undoable transaction. Times are normalized from 0 to 1. Event ids remain stable and generated ids are returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesGLB animation asset id
operationsYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true), the description discloses that modifications are undoable, times are normalized to 0–1, event ids remain stable, and generated ids are returned. These are non-obvious behavioral details that significantly help an agent anticipate side effects and return behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences each add a distinct, non-redundant fact: the operation set, transactionality, and the normalization/id behavior. No wasted words and no restating of the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential behavioral contract for a destructive tool: operations, undoability, normalization, and generated IDs. The schema documents the operation structures and constraints. Minor gaps remain around failure modes and the consequences of event.remove, but they are not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only assetId is documented in the input schema; the operations array has no top-level description. The description compensates by explaining that operations are add/update/remove commands and by clarifying the time normalization. It does not elaborate on the properties sub-object, but the schema's anyOf structure already defines that thoroughly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb phrase, 'Add, update, or remove GLB animation events', naming the exact resource and the three operations supported. This clearly distinguishes it from the read-only sibling get_animation_events and from modify_anim_state_graph, which targets a different resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly frames this as the mutation tool for GLB animation events and adds useful context about batching via 'one undoable transaction'. It does not explicitly name alternatives or exclusion conditions, but the scope is evident enough that an agent can decide when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_anim_state_graphA
Destructive

Apply a validated batch of structural operations to an anim state graph as one undoable transaction. Add operations may omit id to allocate one; generated ids and the resulting graph are returned. State deletion also deletes attached transitions. Parameter deletion is rejected while conditions use it. Use layer.update defaultStateId to change a layer default before removing its old default state.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesAnim state graph asset id
operationsYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses important behaviors: the operation runs as one undoable transaction, add operations can omit ids, state deletion cascades to attached transitions, and parameter deletion is rejected while conditions reference it. These are meaningful edge-case behaviors that an agent could not infer from the schema alone and that materially affect invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is packed with useful information and no filler. Each sentence earns its place: transactionality, id allocation and return behavior, cascading deletion, and a specific layer default workflow. The core purpose is front-loaded before edge cases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the absence of an output schema, the description covers the key return value (generated ids plus resulting graph) and several critical constraints. It does not enumerate all operation kinds or describe validation failure behavior, but those are largely captured in the detailed input schema and the high-level contract is sufficiently complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents the operation kinds and their fields in detail, while the description adds semantic value by explaining that add operations may omit id to have one allocated and that generated ids plus the resulting graph are returned. It also clarifies the defaultStateId workflow. With only 50% schema description coverage, the description partially compensates for the gaps, though it does not fully explain every operation contract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: apply a validated batch of structural operations to an anim state graph as one undoable transaction. It specifies a concrete verb, resource, and scope, and goes beyond a simple restatement by mentioning returned generated ids and the resulting graph. This is easily distinguishable from read-only siblings like get_anim_state_graph.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance on when to use this tool: for validated batch mutations that should be undoable. It also provides a specific procedural tip about using layer.update defaultStateId before removing an old default state. It does not explicitly say when not to use it or name alternatives, but the usage context is still sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_assetsA
Destructive

Edit asset name, tags, preload, or data paths. Array operations are supported under data.*. Anim state graph structure and animation events require their dedicated mutation tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
editsYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry destructiveHint=true and readOnlyHint=false, so the mutation safety profile is covered and the bar is lower. The description adds that mutation is limited to scalar fields and data.* array paths, which clarifies scope, but it discloses nothing about partial-failure behavior, whether edits apply atomically, or side effects on references to the asset.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: purpose, array-op capability, and exclusions. The primary scope is front-loaded and there is zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is high-complexity (five operation variants, nested edits array, no output schema), and no schema documentation compensates. The description leaves an agent guessing about op semantics, path conventions, required fields per op, and what the tool returns, so it is not complete enough to invoke correctly on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the schema's single parameter is a polymorphic array with five op variants (set, unset, insert, remove, move) whose path/value/index/to semantics are entirely undocumented in the schema. The description only lists some valid fields (name, tags, preload) and notes data.* for arrays; it never explains what the ops do or what path means, so it only partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Edit asset') and enumerates the editable fields: name, tags, preload, and data paths. It also carves out what it does not cover (anim state graph structure, animation events), distinguishing it from modify_anim_state_graph and modify_animation_events. This is specific enough to differentiate it from the many asset-related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The final sentence gives an explicit when-not: anim state graph structure and animation events are out of scope and require their dedicated mutation tools. However, it never states a positive usage rule or contrasts with other asset-mutation siblings like move_assets or set_asset_text; the when-to-use is only implied by the listed editable fields.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_bundle_assetA
DestructiveIdempotent

Add or remove project assets from a bundle. Returns accepted and rejected ids; invalid asset types and duplicates are rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBundle asset id
addNo
removeNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal mutation, destructiveness, and idempotency. The description adds useful behavioral detail beyond annotations: it returns accepted and rejected IDs and rejects invalid asset types and duplicates. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with the primary action front-loaded. There is no filler, and each sentence contributes either operational meaning or behavioral expectations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operation and return behavior, and annotations provide the safety profile. However, with no output schema and low parameter schema coverage, the description leaves ambiguity about what each parameter represents, especially id and the contents of add/remove.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, and the tool description does not compensate for the gap. It does not explain what id refers to or that the add/remove arrays should contain asset IDs; it only hints at 'project assets' generically.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific operation, 'Add or remove project assets from a bundle', which distinguishes it from generic siblings like modify_assets or delete_assets. It also adds expected behavior by mentioning accepted/rejected IDs and validation rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to choose this tool versus alternatives such as modify_assets or delete_assets, and no explicit exclusions or prerequisites. The agent must infer usage solely from the operation itself, which is not enough for confident tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_entitiesA
DestructiveIdempotent

Set or unset properties on existing entities by dot-notation path. Valid top-level paths: "name", "enabled", "position" ([x,y,z] local), "rotation" ([x,y,z] euler degrees), "scale" ([x,y,z]), "tags". Component properties use "components..", e.g. "components.light.intensity", "components.camera.fov", "components.render.castShadows", "components.script.scripts..attributes." (the entity must already have that component; add it with add_components first). Each edit targets one entity id + one path. Returns the post-edit summaries of the affected entities. Edits are validated on write: an unknown top-level path, or a component path for a component the entity does not have, fails immediately with a message listing the entity's valid paths/components — so you can fix it in one shot instead of retrying blind. When NOT to use: to create entities (use create_entities), to add/remove components (use add_components/remove_components), or to change scene-wide settings (use modify_scene_settings).

ParametersJSON Schema
NameRequiredDescriptionDefault
editsYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag it as a destructive, non-read-only, idempotent write; the description builds on this with write-time validation behavior — unknown paths or missing components fail immediately with an error listing the entity's valid paths, enabling one-shot self-correction — plus the return shape (post-edit entity summaries) and per-edit targeting semantics. No contradiction with annotations; the idempotentHint is consistent with set/unset semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded: the operative verb+resource lands in the first clause, followed by path grammar, then failure behavior, then exclusions. Every sentence carries semantic weight, though some phrasing ('so you can fix it in one shot instead of retrying blind') is mildly editorial and the example list could be trimmed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive write tool with one complex parameter, a low-coverage schema, and no output schema, the description covers virtually everything: valid values, grammar, units, prerequisites, failure mode, return shape, and sibling routing. The one remaining gap is batch semantics — if an edits array contains several entries and a later edit fails, it is not stated whether earlier edits already committed or the whole batch rolled back.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is minimal, and the description compensates fully: it enumerates valid top-level paths with units and coordinate space ([x,y,z] local for position, euler degrees for rotation), gives the component-path grammar with four concrete examples, states the has-component prerequisite, and clarifies that each edit targets exactly one entity id + one path. This goes well beyond the schema's terse 'Property path in dot notation.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource pair — 'Set or unset properties on existing entities by dot-notation path' — and then enumerates the exact valid path space (top-level: name, enabled, position, rotation, scale, tags; component: components.<type>.<prop>). The scope is crisp: this tool mutates properties on entities that already exist, which visibly separates it from create_entities, add_components/remove_components, and modify_scene_settings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'When NOT to use' section naming three alternatives with the exact condition that routes to each: create_entities for creation, add_components/remove_components for component lifecycle, and modify_scene_settings for scene-wide changes. It also gives positive routing guidance ('add it with add_components first') for the component-prerequisite case. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_project_settingsA
Idempotent

Modify project-wide settings such as physics engine, rendering device (WebGL2/WebGPU), layers, loading screen, script loading order, input, and resolution. Pass a partial object of setting path/value pairs (nested objects or dot-paths, e.g. { enableWebGpu: true, "layers.0.name": "World" }); only the provided fields change. Returns the full resulting project settings snapshot. When NOT to use: to change per-scene settings like fog or gravity (use modify_scene_settings) or a single entity (use modify_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
settingsYesPartial project settings to change (path/value pairs); only provided fields are modified

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral semantics: only provided fields change, settings can be nested objects or dot-paths, and the tool returns the full resulting project settings snapshot. Even without meaningful annotation metadata, this gives an agent a clear model of the mutation's scope and return value, though it does not discuss failure cases or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then moves efficiently through the input format, return behavior, and explicit exclusions. Every sentence adds useful information and none of it repeats the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation tool with no output schema, the description is complete: it covers scope, input format, partial-update behavior, return value, and routing to sibling tools. An agent has enough information to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the settings parameter as 'Partial project settings to change (path/value pairs); only provided fields are modified', so coverage is high. The description adds valuable detail beyond the schema by giving concrete examples of nested objects and dot-paths, such as { enableWebGpu: true, "layers.0.name": "World" }, which clarifies the expected format more precisely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Modify project-wide settings') and lists concrete setting domains (physics engine, rendering device, layers, input, resolution). It clearly differentiates this tool from modify_scene_settings and modify_entities by scope, so an agent can identify it without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool (project-wide settings changes) and when not to use it, naming concrete alternatives: modify_scene_settings for per-scene settings like fog or gravity, and modify_entities for a single entity. It also explains how to supply partial settings, which is the key invocation pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_scene_settingsA
Idempotent

Modify scene-wide settings such as physics gravity and rendering (fog, ambient light, skybox, tonemapping, exposure, lightmapping). Only the provided fields are changed. Returns the full resulting scene settings snapshot. When NOT to use: to change a single entity (use modify_entities) or to read settings without changing them (use query_scene_settings).

ParametersJSON Schema
NameRequiredDescriptionDefault
settingsYesScene settings

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation/safety profile is covered. The description adds valuable behavior beyond those annotations: 'Only the provided fields are changed' clarifies partial-update semantics, and 'Returns the full resulting scene settings snapshot' discloses the return behavior even though no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words: purpose, partial-update behavior, return value, and exclusions with alternatives. The most important usage guidance is front-loaded, and each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with a deeply nested settings schema and no output schema, the description sufficiently covers what the agent needs: what it modifies, partial-update semantics, return value, and when to use sibling tools instead. The extensive input schema covers parameter detail, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter detail is well covered by the input schema. The description adds meaning beyond the schema by stating that only provided fields are changed, which clarifies that the settings object is a partial update rather than a full replacement. This is a meaningful semantic distinction for a nested settings object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Modify scene-wide settings' with concrete examples like physics gravity and rendering (fog, ambient light, skybox). It also explicitly distinguishes itself from modify_entities and query_scene_settings, so an agent can separate this from siblings without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use context ('Modify scene-wide settings') and explicit when-not-to-use guidance with named alternatives: use modify_entities for a single entity and query_scene_settings for reading without changes. This is strong routing signal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_settingsA
DestructiveIdempotent

Set or unset arbitrary Editor settings by dot path in project, scene, projectUser, user, session, or projectPrivate scope. Asset import defaults are in projectUser under editor.pipeline.*. Project, scene, and private settings require project write access. Query the scope first to discover current paths and values.

ParametersJSON Schema
NameRequiredDescriptionDefault
editsYes
scopeYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation behavior is covered. The description adds valuable context: permission requirements for specific scopes, the editor.pipeline.* convention for asset import defaults, and the advice to query before modifying. Nothing contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each with a distinct job: core operation + scope list, a concrete path convention example, and a critical prerequisite/guideline. No filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, arbitrary-path mutation tool with no output schema, the description covers the essential what, where, and access requirements, and warns about the discovery workflow. It could be slightly more complete by naming query_settings as the companion read tool, but the current wording is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% at the top level, so the description must compensate. It explains that paths are dot-notation (matching the schema's 'Dot-notation settings path'), lists the scope enum values in prose, and adds opaque-path pragmatics: query first to discover valid paths/value. This is meaningful beyond the schema's bare enum and item descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Set or unset arbitrary Editor settings') and enumerates the exact scopes (project, scene, projectUser, user, session, projectPrivate). This clearly distinguishes it from related siblings like modify_project_settings, which only target a subset, and from query_settings, which is read-only.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives practical guidance: query the scope first to discover current paths and values, and notes that project/scene/private scopes require project write access. It does not explicitly name alternative tools or state when not to use this tool, but the guidance is sufficient for an agent to proceed safely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_sprite_assetA
Idempotent

Modify sprite data (atlas, frame order, pixels per unit, render mode) or replace a texture atlas frame map in one undoable edit.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSprite or texture atlas asset id
propsYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds meaningful behavioral context by stating this is 'one undoable edit,' which tells the agent the operation can be reverted atomically. It also discloses that the tool supports two modes (data modification vs. frame map replacement), going slightly beyond what the schema or annotations imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, dense sentence front-loads the primary action and lists relevant targets without repetition or filler. The alternative mode and undoability are included in a compact way. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with a nested props object and no output schema, the description gives the purpose and the list of change targets but omits details on how to structure the frame map replacement or whether certain fields are mutually exclusive. An agent can make a basic call using `id` and `props` but may struggle with the more complex frame-map replacement path without additional examples or clearer field semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%: only `id` is described in the schema, while the entire `props` object is undocumented. The tool description partially compensates by mapping high-level concepts (atlas, frame order, pixels per unit, render mode) to the likely props fields. However, it does not explain the meaning of `textureAtlasAsset`, the structure of `frames`, or relationships between fields, so the agent still has to guess from property names and nested schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Modify') and resource ('sprite data') and enumerates the exact modification targets: atlas, frame order, pixels per unit, render mode. It also names the second operation mode, replacing a texture atlas frame map. This clearly distinguishes it from generic sibling tools like modify_assets or replace_asset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (when sprite data or a frame map needs changing), but it does not explicitly contrast it with alternatives such as modify_assets, replace_asset, or convert_texture_asset. No exclusions or 'use X instead' guidance is provided, so an agent must infer the boundary from the tool name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_assetsA
Idempotent

Move assets to a folder in the designated project and wait until their paths update. Omit folderId to move them to the root.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
folderIdNoNullable asset reference

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds a meaningful behavioral detail beyond the annotations: the tool waits until asset paths update. This signals that the operation is synchronous and that moving may affect asset paths. Nothing contradicts the readOnlyHint=false or idempotentHint=true annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no wasted words. The core operation is front-loaded, and the optional parameter behavior is given in a clean follow-up.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool, the description covers the essential context: what is moved, destination behavior, and the wait-for-path-update detail. It doesn't explain how the 'designated project' is determined or what the return value is, but the schema and annotations fill in enough for a straightforward call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description partially compensates for the weak schema documentation by clarifying that omitting folderId moves assets to the root. However, it doesn't explicitly define folderId as the destination folder's ID, and the schema's 'Nullable asset reference' provides poor guidance. The ids parameter semantics rely mostly on the schema's item-level 'Asset ID' note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Move assets to a folder'), the resource ('assets in the designated project'), and the key optional behavior ('omit folderId to move them to the root'). This clearly differentiates it from the many asset-related siblings like modify_assets, delete_assets, or duplicate_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied by the operation itself, but there is no explicit guidance about when to choose move_assets over related tools, nor any exclusions or prerequisites. The only usage hint is about omitting folderId, which is parameter guidance rather than tool-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_entity_scriptA
Idempotent

Move a script to a new execution-order index on an entity.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexYesNew execution-order index
scriptYesRegistered script name
entityIdYesEntity ID

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, idempotentHint=true, and destructiveHint=false, covering the core safety profile. The description adds the notion of execution-order index, but does not disclose whether moving affects the indices of other scripts, what the response looks like, or any side effects. With annotations present, some credit is given, but the description adds limited new behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly worded sentence with no filler or repetition. It front-loads the core action and target, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter operation, the description plus annotations and schema are sufficient for an agent to invoke the tool correctly. The operation's purpose and inputs are clear. A small gap is the lack of detail on how the move interacts with other scripts' ordering, but this is not essential for making the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter (entityId, script, index) already having a clear description. The tool description adds no additional meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('Move') and a specific resource ('script') with a clear target context ('to a new execution-order index on an entity'). This clearly differentiates the tool from sibling tools like attach_script, add_entity_scripts, and remove_entity_scripts, which perform different operations on entity scripts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the use case of reordering a script's execution position on an entity, but it does not explicitly state when to use this tool versus alternatives or provide exclusion criteria. The sibling tool names provide context, but the description itself offers no direct guidance on selecting this over add/remove script tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

my_assets_importA

Import an asset owned by the current user into the current project.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAsset ID
nameYes
folderNoAsset ID

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the operation is not read-only, not idempotent, and not destructive, so the safety profile is covered. The description adds useful context about ownership and target project, but does not disclose what actually happens during import, such as whether a duplicate is created, whether the original remains in the user library, or what errors may occur.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler or redundant wording. It front-loads the key facts: the operation is an import, the asset is owned by the current user, and the destination is the current project.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating import tool with no output schema and only basic annotations, the description is too sparse. It does not explain the meaning of required parameters, what the tool returns, prerequisites such as discovering asset IDs, or how this relates to sibling tools like my_assets_search, leaving important gaps for an agent deciding how to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents 'id' and 'folder' as Asset IDs, but the required 'name' parameter has no description, and the tool description adds no parameter-level meaning. With only 67% schema description coverage, the description should compensate for this ambiguity but does not clarify whether 'name' is the source name, the new project-local name, or something else.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Import'), a resource ('an asset owned by the current user'), and a destination ('the current project'), making the tool's function clear. This distinguishes it from related siblings like my_assets_search, sketchfab_import, upload_assets, and create_assets, since only this tool imports an already user-owned asset into the current project.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the appropriate use case: an agent should call this when it needs to bring an asset from the current user's own collection into the current project. However, it provides no explicit guidance about when not to use it or which sibling tools are alternatives, such as my_assets_search for finding assets first or create_assets for creating new ones.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_branchA
Idempotent

Re-open a previously closed branch. Find closed branches with list_branches({ closed: true }). Does not reload the editor. When NOT to use: to switch the editor onto the branch (use switch_branch).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchIdYesId of the closed branch to re-open (from list_branches with closed:true)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds the meaningful behavioral detail 'Does not reload the editor,' which is not captured in the annotations and helps an agent predict side effects. It does not exhaustively describe what happens if the branch is already open, but that is a minor gap given the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: the core action, the discovery method, and the key exclusion. The most important content is front-loaded. There is no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with rich annotations, the description is fully sufficient. It tells the agent what the tool does, how to obtain the required identifier, which related tool is not appropriate, and the key side-effect characteristic. No output schema exists, but the description need not explain return values for this simple operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the branchId parameter already includes 'from list_branches with closed:true.' The main description repeats this same guidance rather than adding genuinely new parameter semantics. This meets the baseline for parameter clarity but does not go beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Re-open a previously closed branch.' It distinguishes itself from the related switch_branch tool by explicitly saying that switching the editor onto the branch is a different operation. The mention of list_branches({ closed: true }) further reinforces its exact role in the branch lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent how to find the closed branches to operate on via list_branches({ closed: true }). It also provides a clear 'When NOT to use' condition with the correct alternative tool, switch_branch. This is strong, unambiguous routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

prefilter_cubemapC
DestructiveIdempotent

Generate runtime lighting data for a cubemap.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
legacyNoGenerate the compatibility DDS format for older engines

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the safety profile is known. The description adds no behavioral context such as what data gets overwritten or whether the operation modifies the asset in place. Since annotations cover the main traits, the lack of additional context is acceptable but not additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one short sentence with no filler or repetition. It is front-loaded with the core purpose. However, it is almost too sparse, sacrificing useful context for brevity, so it is not a perfect 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a required integer id, a destructive hint, and no output schema, the description is under-specified. It does not clarify what the id refers to, what happens to existing prefilter data, or what a successful invocation returns. Given the rich sibling list, this description leaves important operational gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50% because the required 'id' parameter lacks a schema description. The tool description says 'a cubemap' but never explicitly states that 'id' identifies the cubemap asset. The 'legacy' parameter is documented in the schema, but the description does not compensate for the undocumented required argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Generate runtime lighting data for a cubemap.' It distinguishes the operation from related siblings such as create_cubemap_from_texture and clear_cubemap_prefilter by focusing on the prefiltering step. However, it does not explicitly contrast against those siblings, so it stops short of a perfect 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives. Siblings like clear_cubemap_prefilter, create_cubemap_from_texture, and convert_texture_asset imply related workflows, but the description neither mentions them nor states conditions for choosing prefilter_cubemap. The agent is left to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_font_assetA
DestructiveIdempotent

Rebuild a font asset for an explicit character set and optional inversion setting.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
invertNo
charactersYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, and the description's 'Rebuild' wording is consistent with those. It adds that the operation is scoped to a supplied character set and inversion setting, but it does not disclose side effects such as overwriting existing font data, breaking references, or long-running processing behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes to the core operation and its key options, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is minimally viable for a simple three-parameter operation, and annotations cover the destructive and idempotent aspects. Still, for a destructive tool with no output schema and no usage guidance, it leaves gaps around when to use it, what exactly gets replaced, and what the caller should expect after invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaning by relating 'characters' to the explicit character set and 'invert' to the optional inversion setting. However, it does not explain the role of 'id' or clarify the expected format of the characters string or the precise meaning of inversion, so the compensation is only partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Rebuild' with a clear resource 'font asset' and specifies the exact scope: an explicit character set and optional inversion setting. This distinguishes it from related asset-processing siblings like process_texture_variants and from generic modify_assets operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives. It does not name sibling tools, state prerequisites, or provide exclusion conditions, leaving the agent to infer the appropriate context among many asset-related operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_texture_variantsB
DestructiveIdempotent

Compress or remove explicit texture variants and wait for processing to settle.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
forceNo
removeNo
formatsYes

TDQS

B3.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavior beyond annotations: it mentions both destructive removal and waiting for processing to settle. This complements the existing destructiveHint=true and idempotentHint=true annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the primary action and then adds the wait behavior. Every clause adds information, though 'wait for processing to settle' is slightly vague.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, no parameter descriptions, and 4 parameters to handle, the description is not complete enough for an agent to invoke this tool confidently. It fails to clarify how formats, remove, and force interact, and what 'settle' means operationally.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it does not explain the force, remove, or formats parameters. The word 'remove' hints at the remove boolean, but the id, formats, and force semantics remain unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Compress or remove explicit texture variants', which clearly states what the tool does. It distinguishes itself from texture conversion/atlas/metadata siblings by focusing on variant processing, though 'explicit texture variants' is somewhat domain-specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as convert_texture_asset or generate_texture_metadata. It only states the action, not the conditions or exclusions that would help an agent choose it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_project_settingsA
Read-only

Read the current project-wide settings (physics, rendering device, layers, loading screen, script loading order, input, resolution). Returns the full settings object. When NOT to use: to change settings (use modify_project_settings) or to read per-scene settings (use query_scene_settings).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read'. It adds useful behavioral context by stating that it 'Returns the full settings object' and listing the covered settings domains, which clarifies what an agent can expect beyond the annotation. No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core action and scope, briefly states the return content, and ends with a clearly marked negative usage instruction with alternatives. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool, the description fully covers what the tool does, what it returns, and how it differs from related tools. The annotations cover the safety profile, and no output schema is needed because the return type is described as 'the full settings object'. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so parameter documentation is not needed. The schema description coverage is effectively 100%, and the description clarifies the return value rather than parameters, which is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Read') and a specific resource ('current project-wide settings'), then enumerates the settings categories included. It also distinguishes itself from the obvious sibling 'modify_project_settings' and 'query_scene_settings' by naming them in the usage note.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when not to use the tool and names the exact alternatives: use modify_project_settings for changes and query_scene_settings for per-scene settings. This is direct, actionable routing guidance that leaves little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_runtime_stateA
Read-only

Read the LIVE runtime state of entities in the RUNNING Launch instance — the non-visual ground-truth read-back for verifying play-mode behaviour without guessing screenshot timing. Requires launch_start first. For each matched entity returns world position, local position, euler rotation, scale, enabled, component names, plus rigidbody (type/mass/linearVelocity/angularVelocity) and element (type/text, e.g. a HUD score label) when present. Filter with ids (editor resource_ids — the runtime uses the same GUIDs) or name (case-insensitive substring); omit both to page through every entity. Paginated via limit (default 50) + offset (meta has total/count/hasMore/nextCursor). Use this to answer questions the camera cannot: "did the ball actually move / fall through the floor?", "is the rigidbody simulating (velocity != 0)?", "what does the score HUD say?". An empty result is success, not an error. When NOT to use: for edit-time scene data (use list_entities); before launch_start; to change state (use modify_entities / inject_input).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoEntity resource_ids to inspect (same GUIDs as edit-time). Omit to filter by name or list all.
nameNoFilter by entity name (case-insensitive substring)
limitNoMax entities to return (default 50)
offsetNoEntities to skip (use nextCursor from a previous page)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, and the description reinforces this with 'Read' and clarifies important behavioral details: it requires launch_start first, empty results indicate success rather than error, the runtime shares the same GUIDs as edit-time, and it returns specific fields including rigidbody and element data when present. This is substantial beyond what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but intentionally so, given the tool's complexity and the absence of an output schema. It is front-loaded with the core purpose, then covers return fields, filtering, pagination, use-case examples, and exclusions in a logical order with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a runtime inspection tool with no output schema, the description is comprehensive: it explains prerequisites, return contents, filtering semantics, pagination metadata, success semantics, and alternatives. An agent has everything needed to decide when to call it and what to expect in response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a clear description in the schema. The tool description adds useful context beyond the schema, such as omitting both filters to page through every entity, the runtime using the same GUIDs, and the meaning of offset via nextCursor, though most parameter semantics are already well documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read'), a precise resource ('LIVE runtime state of entities in the RUNNING Launch instance'), and distinguishes this from edit-time scene data by calling it the 'non-visual ground-truth read-back'. It also explicitly contrasts with sibling tools like list_entities and query_viewport_state, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance with concrete example questions ('did the ball actually move?', 'is the rigidbody simulating?'), and an explicit 'When NOT to use' section naming list_entities, pre-launch usage, and modify_entities/inject_input. It also states the prerequisite launch_start and explains when to use ids vs name vs neither.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_scene_settingsA
Read-only

Read the current scene-wide settings (physics + rendering). Returns the full settings object. When NOT to use: to change settings (use modify_scene_settings).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, so the read-only safety profile is covered. The description adds useful behavior: it returns the full settings object and specifies that the scope is scene-wide physics and rendering. No side effects are described, but for a zero-parameter read operation this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: what the tool does, what it returns, and when not to use it. The key scoping information is front-loaded and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter read-only tool with a clear sibling for mutations, the description fully covers what is read, what is returned, and when to avoid it. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to add beyond what the input schema already shows. The description's scene-scope clarification adds context, but no parameter-specific semantics are needed. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads current scene-wide settings, specifically physics and rendering, and returns the full settings object. This distinguishes it from query_settings and query_project_settings by its scene scope, and from modify_scene_settings by the read vs. change intent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when NOT to use the tool (to change settings) and names the alternative tool (modify_scene_settings). It also implies the correct use case: reading current scene settings. This is direct and leaves no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_settingsA
Read-only

Read any Editor settings scope: project, current scene, per-project user preferences (including editor.pipeline asset import defaults), global user preferences, session settings, or private project settings. Omit path for the complete scope or provide a dot path for one value.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
scopeYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description consistently says 'Read', so there is no contradiction. The description adds behavioral context beyond the annotation by explaining the complete-scope versus dot-path behavior and by giving examples of the settings families covered (including editor.pipeline asset import defaults under per-project user preferences).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences convey the full purpose, the complete list of scopes, and the path behavior with no filler. The most important information is front-loaded in the first clause, making it easy for an agent to quickly classify this as a read-only settings query tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only tool with no output schema, the description is nearly sufficient. It covers scope semantics and path behavior, and the readOnlyHint covers safety. It does not detail the return shape or error behavior, but that is a minor gap for a settings query tool whose name and description already convey what it returns conceptually.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of explaining the parameters. It does this well: it maps the scope enum values to meaningful setting categories and explains how the optional path parameter behaves ('Omit path for the complete scope or provide a dot path for one value'). Some additional detail about path dot-format edge cases would be useful, but the essentials are present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the verb 'Read' and a specific resource ('any Editor settings scope'), then enumerates each supported scope explicitly (project, scene, per-project user preferences, global user preferences, session, private project settings). This clearly differentiates it from sibling tools like query_project_settings or query_scene_settings by signaling it is the general-purpose settings reader.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete operational guidance: omit path for the complete scope or provide a dot path for a single value, and it clarifies which scopes are covered. It does not explicitly name sibling alternatives or state when not to use this tool, but the 'any ... scope' phrasing makes the intended usage clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_viewport_stateA
Read-only

Read the exact editor viewport camera and overlay state so it can be restored after visual inspection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, and the description aligns by saying 'Read'. It adds meaningful behavioral context beyond the annotation: the tool captures exact state for later restoration, implying a pairing with a set/restore operation. No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with the core action and resource, and every clause earns its place. The restoral purpose adds useful context without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, a read-only annotation, and no output schema, the description gives enough context for an agent to call the tool: it explains what is read and why. It could more precisely enumerate the returned state fields, but this is a minor gap given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so the description carries no parameter burden. The baseline of 4 applies because there is nothing to document and the description correctly focuses on semantics of the operation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool 'Reads' a specific resource (viewport camera and overlay state) with 'exact' precision. It is easily distinguished from sibling tools like set_viewport_state (write) and query_viewport_visibility (only visibility).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'so it can be restored after visual inspection' communicates the intended workflow and context for using this tool. It implicitly contrasts with set_viewport_state and query_viewport_visibility, though it does not explicitly name alternatives or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_viewport_visibilityA
Read-only

List entities hidden only in the editor viewport. This does not read or change persisted entity enabled values.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals no writes, but the description adds context beyond that by clarifying it does not even read persisted entity enabled values. This explains that the operation is scoped to transient viewport state, which is useful behavior not present in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The primary action is front-loaded, and the clarifying scope constraint is provided immediately after. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only query tool, the description is complete: it states the exact result ('list entities hidden only in the editor viewport') and the safety profile is already covered by annotations. No output schema exists, but 'list entities' sufficiently conveys what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, so there is no parameter semantics burden on the description. The baseline of 4 applies because with zero parameters, nothing is missing or ambiguous about invocation inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a specific resource ('entities hidden only in the editor viewport'). The clarifying clause about not reading or changing persisted enabled values distinguishes it from operations dealing with persisted entity state, so an agent can tell this apart from sibling set/query tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage for transient editor-viewport-only hidden entities and explicitly notes it does not read or change persisted enabled values, but it never names an alternative tool or states when to prefer this over siblings like query_viewport_state or set_viewport_visibility. The guidance is inferable rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_editor_logsA
Read-only

Read recent edit-time Editor console logs with filters and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sinceNoMinimum Unix timestamp in milliseconds
typesNo
offsetNo
searchNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers the safety profile. The description adds useful context about recency, edit-time scope, and support for filters/pagination, but it does not disclose default recency windows, ordering behavior, or how pagination behaves when no parameters are supplied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly worded sentence with no filler. It front-loads the core behavior and then names the key capabilities.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description should clarify what the tool returns, but it only says 'logs' without specifying response shape or fields. It also omits default behavior when no parameters are provided and does not explain the search filter's semantics. Given five optional parameters, this leaves meaningful gaps for an agent trying to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20% (only 'since' is documented). The description mentions 'filters and pagination' but does not clarify which parameters map to those concepts, what 'search' targets, or default limits. The parameter names are somewhat self-explanatory, but the description does not sufficiently compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Read'), the resource ('edit-time Editor console logs'), and the scope ('recent'). It also distinguishes itself from the sibling read_runtime_logs by explicitly calling out 'edit-time Editor' logs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'edit-time Editor console logs' implies when this tool is appropriate, and the presence of read_runtime_logs suggests the alternative. However, the description does not explicitly state when to use this tool versus the runtime-log sibling, so the guidance remains implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_runtime_logsA
Read-only

Read console output (log/info/warn/error), uncaught exceptions and unhandled rejections from the RUNNING Launch instance — the first-line signal for runtime bugs. Requires launch_start first. Returns the most recent entries first, paginated (meta has total/count/hasMore/nextCursor). Defaults to warnings + errors; set level="all" (or debug/info/warn/error as a minimum severity) to widen, and keyword to filter. An empty result is success, not an error. When NOT to use: to read edit-time editor logs (this is the launched app only).

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoMinimum severity to include (default: warn)
limitNoMax entries to return (default 100)
offsetNoEntries to skip from the newest (use nextCursor)
keywordNoOnly include entries whose text contains this (case-insensitive)

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses essential runtime behavior: newest entries first, pagination metadata, default level behavior, filter semantics, and that an empty result means success rather than failure. This is rich, actionable context that goes well beyond what annotations already provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, prerequisite, ordering, pagination, defaults, filtering, empty-result semantics, and an explicit exclusion. It is front-loaded with the tool's core value and immediately clarifies boundaries with the sibling editor-log tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only logging tool with no output schema, the description covers the essential operational context: when it applies, what it returns, how results are ordered and paginated, how to widen/narrow results, and when not to use it. Nothing critical is left to guesswork.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning: it clarifies that the default level means 'warnings + errors', explains how level='all' widens the search, and describes pagination fields (total/count/hasMore/nextCursor) that help an agent interpret results. This is meaningful added value beyond the raw parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Read') applied to a specific resource ('console output... from the RUNNING Launch instance'), and explicitly labels it as 'the first-line signal for runtime bugs.' It also distinguishes itself from sibling read_editor_logs by noting this is the launched app only, preventing confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the prerequisite ('Requires launch_start first') and provides a direct 'When NOT to use' clause pointing to edit-time editor logs, which is the key alternative. It also clarifies default behavior, filtering options, and empty-result semantics, giving an agent clear decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redoA

Redo the last undone edit in the editor. Returns whether anything was redone plus the resulting { canUndo, canRedo } state. When NOT to use: to repeat an arbitrary action (redo only re-applies an edit that was just undone).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains the return behavior (whether something was redone plus the canUndo/canRedo state) and clarifies the non-idempotent nature by saying it re-applies a previously undone edit. Annotations provide no detailed behavioral hints beyond booleans, so the description adds meaningful context without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no filler. The primary action is front-loaded, followed by return value information and a clear exclusion. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool, the description fully covers what it does, what it returns, and when not to use it. No output schema exists, so the explicit return-state description is especially valuable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are trivially complete. The description correctly focuses on behavior rather than inputs, and schema coverage is effectively 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (redo) on a specific resource (the last undone edit in the editor). It clearly distinguishes itself from the sibling 'undo' tool and clarifies its narrow scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-not-to-use guidance: it should not be used to repeat an arbitrary action, only to re-apply an edit that was just undone. This gives an agent clear selection criteria relative to other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reimport_assetsA
Destructive

Re-run the import pipeline for existing source assets and return succeeded and failed entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
settingsNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description doesn't need to restate that this is a mutating operation. The description adds that the tool returns succeeded/failed entries, but doesn't disclose more about what the pipeline overwrites or changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that immediately conveys action, scope, and return behavior. Every word earns its place, and the description is easy to parse with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite destructive annotations and a complex settings object, the description gives no guidance on expected side effects, settings semantics, or result format. With no output schema, the promised 'succeeded and failed entries' needs more detail to be actionable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description bears the burden of explaining parameters. It only hints that 'existing source assets' maps to the ids parameter; the large settings object with ~20 fields is entirely unexplained, leaving agents without meaningful guidance for those options.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('re-run the import pipeline') and clearly scopes it to 'existing source assets', which distinguishes it from create/upload/import tools. It also states the outcome ('return succeeded and failed entries'), making the tool's purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Existing source assets' provides clear context that this tool is for re-processing already-imported assets, not for creating or uploading new ones. It doesn't explicitly name alternatives or exclusions, but the scope is clear enough for an agent to infer when it applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_componentsA
DestructiveIdempotent

Remove one or more components from an entity by component name. Returns the updated entity summary. When NOT to use: to delete the whole entity (use delete_entities) or to just disable a component (set components..enabled=false via modify_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID
componentsYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry destructiveHint=true, readOnlyHint=false, and idempotentHint=true, so the destructive safety profile is covered. The description adds value beyond that by disclosing the return behavior ('Returns the updated entity summary') and implicitly clarifying that removal physically deletes the component rather than merely toggling it, which is a meaningful behavioral distinction. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler: action first, then return value, then exclusionary routing. Every sentence earns its place, and the most decision-relevant information (what it removes and when not to use it) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-param, no-output-schema, idempotent-destructive tool, the description covers the action, parameter semantics, return value, and sibling routing. The only real gap is unstated behavior when a named component doesn't exist on the entity (error vs no-op), which an agent might want to know, but this is minor given idempotentHint=true and the overall simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: 'id' has a description but the 'components' property itself does not (only its items get 'Editor component type'). The description's 'by component name' fills this gap by clarifying that the array entries are component names, resolving the ambiguity of 'type' vs 'name' in the schema. It doesn't cover edge cases like nonexistent component names, but for a 2-param tool it compensates well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Remove'), resource ('components from an entity'), and method ('by component name'), immediately distinguishing it from delete_entities and modify_entities. The return value is also disclosed ('Returns the updated entity summary'). This is exactly what an agent needs to tell this tool apart from its many siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an explicit 'When NOT to use' section naming two alternatives (delete_entities for whole-entity deletion, modify_entities with components.<name>.enabled=false for disabling) with the precise conditions that select them. This is textbook routing guidance that leaves nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_entity_scriptsC
DestructiveIdempotent

Remove a script from one or more entities.

ParametersJSON Schema
NameRequiredDescriptionDefault
scriptYesRegistered script name
entityIdsYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description merely restates the operation and adds no behavioral context beyond what the annotations already provide. The annotations mark the tool as destructive and idempotent, but the description does not explain side effects, permanence, or behavior when the script is not attached.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short, front-loaded sentence with no filler or redundant wording. It communicates the core action efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with destructive and idempotent annotations, the core action and required parameters are adequately conveyed. However, lack of usage guidance and behavioral detail leaves the description only minimally complete for an agent making a nuanced decision.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, and the description does not clarify that 'script' means a registered script name or that 'entityIds' identifies the target entities. The phrase 'one or more entities' adds little beyond the schema's existing property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete action ('Remove') and a specific resource ('a script from one or more entities'), so an agent can understand the operation. It does not explicitly differentiate from sibling tools like add_entity_scripts or move_entity_script, but the verb 'remove' contrasts clearly enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool instead of alternatives such as remove_components, add_entity_scripts, or move_entity_script. There are no conditions, prerequisites, or exclusions stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rename_sceneB
Idempotent

Rename the currently loaded scene. Load another scene first to rename it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds a useful state-dependent trait — the tool only works after another scene is loaded — but the self-contradictory phrasing muddles which scene is actually renamed, so the behavioral truth is not clearly disclosed. No contradiction with annotations: renaming is a non-destructive, idempotent mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and no filler. It loses a point because a slightly longer, more explicit phrasing could have resolved the contradiction between 'currently loaded scene' and 'load another scene first'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter mutation with no output schema and adequate annotations, the description covers the action and a precondition — close to sufficient. But the internal inconsistency plus total silence on naming constraints means an agent may need to attempt the call to discover the actual contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, yet it never addresses the 'name' parameter directly. An agent can infer that name is the new scene name from the tool name alone, but there is no guidance on format, uniqueness, disallowed characters, or whether an extension is appended — leaving a single required parameter underspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a clear verb (rename) and resource (a scene), and the phrase 'currently loaded scene' differentiates it from siblings like create_scene, duplicate_scene, delete_scene, and load_scene. However, the second sentence ('Load another scene first to rename it') introduces ambiguity about which scene is actually being renamed, suggesting the current one must first be unloaded — the two sentences sit in tension.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an actionable precondition ('Load another scene first to rename it'), which tells an agent when the call is valid. But it never names alternatives or explains when to prefer this tool over scene-related siblings, and the precondition's relationship to the 'currently loaded scene' claim is left unclear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reparent_entityA
Idempotent

Move an entity to a new parent in the hierarchy, optionally at a specific child index. Set preserveTransform=true to keep the entity at the same world position after moving. Returns the moved entity summary (including its new hierarchy path). When NOT to use: to change position/rotation values directly (use modify_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID
indexNoInsertion index among the parent's children
parentYesNew parent entity resource_id
preserveTransformNoKeep the same world transform after reparenting

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as non-readonly, non-destructive, and idempotent. The description adds useful context beyond that: it returns the moved entity summary including the new hierarchy path, and clarifies that preserveTransform keeps the world position. It does not disclose potential edge cases like cycle prevention or default index behavior, but the provided behavioral context is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler: the action comes first, optional behavior second, return value third, and the exclusion with alternative last. Every sentence earns its place and the structure is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter tool with no output schema, the description covers the return value, key behavioral option, and routing to an alternative. It does not specify what happens when index is omitted or how hierarchy constraints are handled, but the essential information for correct invocation is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all four parameters. The description adds only modest reinforcement, such as rephrasing preserveTransform as 'keep the entity at the same world position' and mentioning the child index. This is sufficient but not a major value-add over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: 'Move an entity to a new parent in the hierarchy'. It also identifies what this tool is not for by naming modify_entities as the alternative for changing position/rotation directly, clearly distinguishing it from related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use the tool (reparenting an entity) and when not to use it ('to change position/rotation values directly'), naming the alternative tool modify_entities. It also explains the optional preserveTransform behavior, which helps agents decide whether to set it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replace_assetA
Idempotent

Replace references to one asset with another asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesAsset ID
replacementIdYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds a small behavioral nuance by emphasizing that it updates references rather than modifying or deleting the asset itself, but it does not explain the scope of the replacement, reversibility, or side effects beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that immediately conveys the operation. There is no redundant wording or unnecessary detail, and the key distinction ('references') is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with annotations covering idempotency and destructiveness, the description plus schema is largely sufficient. While it does not mention return values or edge cases like whether assetId and replacementId must differ, these are minor gaps given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only describes both parameters generically as 'Asset ID', while the description clarifies their roles: assetId is the source asset whose references are replaced, and replacementId is the target asset. This added semantic meaning helps an agent correctly map values to the two required parameters despite weak schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Replace') and a precise resource ('references to one asset with another asset'), which clearly distinguishes it from sibling tools like delete_assets, move_assets, or modify_assets. It tells the agent exactly what operation is performed without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives such as get_asset_references, delete_assets, or duplicate_assets. There are no stated prerequisites, exclusions, or routing hints, leaving the agent to infer the appropriate context from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_conflictsA
Idempotent

Resolve one or more merge conflicts by picking a side, or revert them to unresolved. resolution "source" keeps the merged-in branch's version, "dest" keeps the current branch's version, "revert" un-resolves. Returns the updated conflict records. Repeat until get_merge shows no unresolved conflicts, then apply_merge. When NOT to use: to inspect a conflict's content first (use get_conflict_file).

ParametersJSON Schema
NameRequiredDescriptionDefault
mergeIdYesId of the merge (from start_merge)
resolutionYes"source" = keep the merged-in branch, "dest" = keep the current branch, "revert" = un-resolve
conflictIdsYesIds of the conflicts to resolve (from the merge's conflicts list)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a non-read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond that: the meaning of each resolution value, the fact that it returns updated conflict records, and that 'revert' un-resolves rather than destroys. It could go further on failure behavior, but the core mutation semantics are clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences carry the full useful payload: what the tool does, how the resolution values behave, what is returned, the sequencing with sibling tools, and the primary when-not-to-use case. No filler or redundant restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the essential context: it explains the input semantics, the return value, the correct place in the merge workflow, and the situation where a different tool should be used. An agent has enough information to invoke it correctly and integrate it with the surrounding merge lifecycle.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already fully describes mergeId, resolution, and conflictIds. The description restates the enum semantics and workflow but adds little beyond the schema's parameter descriptions; for example, both already specify that conflictIds come from the merge's conflicts list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair: 'Resolve one or more merge conflicts by picking a side, or revert them to unresolved.' It clearly distinguishes this tool from siblings by naming get_merge, apply_merge, and get_conflict_file and explaining how they fit into the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit workflow guidance: repeat resolution until get_merge shows no unresolved conflicts, then call apply_merge. It also provides a direct exclusion: use get_conflict_file when you need to inspect a conflict's content first, not resolve_conflicts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_entitiesA
Read-only

Resolve entities by name into their resource_ids and hierarchy paths, so you can drive follow-up calls without shuttling UUIDs. By default matches case-insensitive substrings; set exact=true to match the full name. Returns summaries (resource_id, name, path, components). An empty result is a successful, empty list (not an error). When NOT to use: when you need filtering by component/tag or pagination (use list_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesEntity name to look up
exactNoRequire an exact (case-insensitive) name match instead of substring

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses matching semantics ('case-insensitive substrings', 'exact=true'), the return shape ('summaries (resource_id, name, path, components)'), and error behavior ('empty result is successful, empty list (not an error)'. This is rich behavioral context that an agent needs for correct invocation and interpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each with a distinct purpose: purpose/value, matching default, return shape, and anti-guidance. It's front-loaded and every sentence earns its place. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only tool with no output schema, the description covers purpose, parameters, return format, error semantics, and routing to an alternative. Nothing critical for an agent to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers both parameters at 100% description coverage. The description addds meaningful behavior: it explains the default case-insensitive substring matching and explicitly connects exact=true to full-name matching. While somewhat redundant with the schema, it adds the default-behavior context that the schema only implies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a precise verb and resource: 'Resolve entities by name into their resource_ids and hierarchy paths'. It clearly states what is produced and why, and the final sentence explicitly differentiates from list_entities. The agent can confidently tell this tool apart from siblings without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a concrete use case ('drive follow-up calls without shuttling UUIDs') and an explicit 'When NOT to use' with the correct alternative (list_entities). It also explains when to set the exact parameter. Both positive and negative guidance are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_checkpointA
Idempotent

Restore (soft revert) the current branch's working state to a checkpoint. History is preserved — later checkpoints remain. This RELOADS the editor; the tool waits for it to reconnect and returns the resulting vcs_status. When NOT to use: to permanently erase later checkpoints (use hard_reset_checkpoint).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchIdNoBranch to restore on (defaults to the current branch)
checkpointIdYesId of the checkpoint to restore (from list_checkpoints)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description discloses key behavioral traits: history is preserved, the editor reloads, the tool waits for reconnection, and it returns vcs_status. These details meaningfully inform the agent about side effects and execution behavior beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences long, with no filler. It front-loads the core purpose, then adds crucial behavioral side-effects and an explicit exclusion, each sentence earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool without an output schema, the description covers the return value (vcs_status), the reload side-effect, the history-preservation semantics, and the routing to the hard reset sibling. This is sufficiently complete for an agent to invoke and understand the tool's behavior correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters with 100% coverage, including the source of checkpointId and the default behavior of branchId. The description does not add additional parameter-specific detail, so the baseline of 3 for high schema coverage is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Restore (soft revert) the current branch's working state to a checkpoint') and immediately distinguishes itself from the hard-reset sibling, so the agent knows exactly what this tool does and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when NOT to use the tool and names the correct alternative: 'to permanently erase later checkpoints (use hard_reset_checkpoint).' This gives the agent a clear decision rule for choosing between restore_checkpoint and hard_reset_checkpoint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revert_template_overridesA
Destructive

Revert all overrides on a template instance, or only the supplied override records.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityIdYesEntity ID
overridesNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The destructiveHint annotation is true, and the description adds valuable scoping context by explicitly differentiating 'all overrides' from 'only the supplied override records', clarifying what will be affected. It does not state whether the operation is reversible, but given the annotation already signals destructiveness, this description provides sufficient behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence communicates the core action and the two modes without fluff. Every word earns its place, and the sentence structure makes the optional scope immediately obvious.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple destructive tool with one required parameter and an optional array, the description covers both invocation modes and clearly identifies the target. It could additionally reference get_template_overrides as the source for override records, but the schema and sibling tool names make that connection discoverable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: only entityId has a description, and it is merely 'Entity ID'. The description helps by implying entityId refers to a template instance and that overrides specifies a subset of override records. However, it does not explain the fields within each override record (resource_id, override_type, path), so parameter semantics remain partially under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Revert'), a clear resource ('overrides on a template instance'), and distinguishes two modes: all overrides vs only supplied override records. It fits its sibling set, particularly alongside get_template_overrides and apply_template_overrides, and tells an agent exactly what operation is offered.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: when a template instance's overrides need to be undone, either wholesale or selectively. It does not explicitly name alternatives or conditions for choosing this over apply_template_overrides, get_template_overrides, or unlink_template_instances, but the two-mode phrasing gives functional context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

script_parseA
Read-only

Parse a script asset to extract its declared script name(s) and attribute definitions. Run this after set_script_text. Returns the parsed script metadata. When NOT to use: to read entity-level script attribute values (use list_entities/modify_entities).

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesScript asset id

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description is not required to restate safety. It adds useful context beyond annotations: the required sequencing after set_script_text and the fact that it returns parsed metadata. No behavioral contradictions exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each earning its place: the first states purpose, the second gives sequencing, and the third provides an exclusion with alternatives. The description is front-loaded and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with no output schema, the description is complete: it covers what the tool does, what it returns, when to run it, and when not to use it. An agent has enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, assetId, is already fully described in the schema with 100% coverage. The description does not add extra parameter-level detail, but it does not need to because the schema carries the full semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Parse') and resource ('script asset') and names the concrete outputs: declared script names and attribute definitions. It also distinguishes itself from entity-level script access tools, so an agent can tell it apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to run this tool after set_script_text and gives a direct 'When NOT to use' instruction with the alternative tools list_entities/modify_entities. This leaves no ambiguity about when the tool should be selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_entitiesA
Read-only

Fuzzy-search entities by name and return the best matches ranked by relevance (each as a compact summary). Use this to find an entity when you only know part of its name. When NOT to use: to filter by component or tag (use list_entities) or to find entities using a script (use find_entities_by_script).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return (default: all matches)
queryYesName (or partial name) to fuzzy-match against

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safe-read behavior is covered. The description adds relevant behavioral context: fuzzy matching, ranking by relevance, and compact summaries. It does not detail pagination behavior for the default all-matches case, but the schema covers a limit parameter, so a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The core behavior is front-loaded, and the exclusion guidance is succinctly placed at the end. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only fuzzy search tool with full parameter coverage and no output schema, the description covers the main agent decision points: what it returns, when to use it, and which siblings to prefer for other cases. A small gap is not spelling out what 'compact summary' contains, but the read-only annotation and simple output expectation make this minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters meaningfully. The description reinforces the query semantics by saying the name may be partial and that limit caps the results, but it adds only marginal behavioral nuance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Fuzzy-search entities by name and return the best matches ranked by relevance (each as a compact summary).' It distinguishes this tool from related entity-lookup tools by describing the fuzzy by-name match behavior and the compact-summary return form.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it — 'when you only know part of its name' — and when NOT to use it, naming two sibling alternatives: filter by component or tag (list_entities) and find entities using a script (find_entities_by_script).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_asset_textC
Idempotent

Overwrite the full contents of a CSS, HTML, JSON, script, shader, or text asset.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesFull replacement contents
assetIdYesText-based asset id

TDQS

C2.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'Overwrite the full contents,' which implies destructive replacement of existing text, yet annotations declare destructiveHint=false. This directly contradicts the annotation and obscures the irreversible impact on prior content. No additional behavioral nuance about side effects or reversibility is provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. The verb, scope, and target asset types appear immediately, and every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema and idempotentHint cover the basic invocation surface, and the operation is simple. However, the destructiveHint contradiction leads the description incomplete on behavioral safety, and the lack of alternative routing leaves selection ambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: assetId and text are already clearly documented with 'Text-based asset id' and 'Full replacement contents.' The description adds no further parameter meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific action ('Overwrite'), the full-content scope, and enumerates supported asset types, making the tool's purpose clear. It does not explicitly differentiate from the sibling set_script_text, which overlaps in the 'script' case, but the resource listing is otherwise distinctive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to prefer this tool over alternatives such as set_script_text, get_asset_text, or modify_assets. The asset-type list implies a use case, but there are no explicit conditions, exclusions, or sibling comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_material_diffuseA
Idempotent

Set only the diffuse (base) color of a material. Color is [r,g,b] in 0-1. When NOT to use: to change any other material property, or to set several properties at once (use set_material_properties).

ParametersJSON Schema
NameRequiredDescriptionDefault
colorYesRGB color [r,g,b] 0-1
assetIdYesAsset ID

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the description carries a lighter burden. It adds meaningful behavioral context by guaranteeing the operation touches 'only' the diffuse color and will not modify other material properties — a scope guarantee beyond what annotations express. No contradiction exists between the write semantics ('Set') and readOnlyHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero filler. The action is front-loaded in the first sentence, followed by the color format, then the when-not-to-use guidance. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter write tool with no output schema and no nested objects, the description is complete: it covers the action, the value format, the scope limitation, and the routing to the alternative tool. Annotations cover the idempotence and safety profile. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description states 'Color is [r,g,b] in 0-1,' which largely duplicates the schema's 'RGB color [r,g,b] 0-1' for the color parameter, and adds nothing about assetId beyond the schema's 'Asset ID.' The description does not meaningfully exceed what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Set only the diffuse (base) color of a material.' The word 'only' precisely scopes the operation and differentiates it from set_material_properties, which is the key sibling for broader material changes. An agent can immediately know what this tool does and what it deliberately does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a 'When NOT to use' clause: to change any other material property, or to set several properties at once, and names the alternative tool (set_material_properties). This is exactly the explicit when/when-not/alternative guidance the dimension rewards, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_material_propertiesA
Idempotent

Set any combination of properties on a material asset in one call (diffuse, emissive, metalness, gloss/shininess, opacity, maps, etc.). Only the provided fields are changed; all fields are optional. Colors are [r,g,b] 0-1; map fields take asset ids. Returns the updated asset summary. When NOT to use: to change only the diffuse color (set_material_diffuse is a shorthand) or to create a new material (use create_assets type="material").

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYesAsset ID
propertiesYesMaterial properties to set (only included fields are changed)

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds genuinely useful behavioral context beyond those flags: partial-update semantics ('Only the provided fields are changed; all fields are optional') and the return behavior ('Returns the updated asset summary'). This is consistent with idempotentHint and clarifies the non-destructive update model. No contradictions found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, each earning its place: purpose, patch semantics, value formats, return value, and exclusion routing. Front-loaded with the operation, zero fluff, and no repetition of what the schema already states.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a ~200-property nested schema and no output schema, the description covers everything an agent needs to invoke it correctly: what it does, partial-update semantics, value/format conventions, the return value, and when to use alternatives. The massive schema carries per-property detail while the description carries the behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both top-level parameters and most nested properties with descriptions like 'RGB color [r,g,b] 0-1' and 'Nullable asset reference'. The description adds cross-cutting conventions that apply across the whole properties object: color format, map fields taking asset ids, and patch behavior. This exceeds the baseline 3 by clarifying semantics no single schema entry can express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+scope: 'Set any combination of properties on a material asset in one call.' It enumerates representative property families (diffuse, emissive, metalness, gloss/shininess, opacity, maps) and explicitly distinguishes itself from set_material_diffuse and create_assets. An agent can tell exactly what this tool does versus its siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'When NOT to use' section naming two alternatives with concrete conditions: set_material_diffuse for single diffuse color changes and create_assets type='material' for material creation. This is exactly the routing guidance that prevents wrong tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_primary_buildA
Idempotent

Set a completed publish build as the project primary build.

ParametersJSON Schema
NameRequiredDescriptionDefault
buildIdYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate that this is a mutating (readOnlyHint=false), idempotent, and non-destructive operation. The description adds the prerequisite that the build must be a completed publish build, but it does not disclose what happens to the previous primary build or whether an incomplete build causes an error.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or redundant wording. It conveys the action, the object, and the key prerequisite efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter setter with annotations covering safety and idempotency, the description is largely sufficient. It identifies the essential precondition (completed publish build) and the tool's purpose, though it could mention how the buildId is obtained or whether the primary build is replaced.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only provides buildId as an integer with exclusiveMinimum 0, and schema description coverage is 0%. The description helps by indicating that the buildId must refer to a completed publish build, but it does not explicitly name the parameter or explain how to obtain a valid buildId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific operation: setting a completed publish build as the project primary build. It clearly distinguishes this from sibling build tools like create_build, get_build, list_builds, download_build, and delete_build.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'completed publish build' implies that only builds that have finished publishing are valid targets, providing a usage condition. However, it does not explicitly name alternatives or state when not to use this tool, so the guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_script_textA
Idempotent

Overwrite the source code of an existing script asset. Provide the full file contents in text. After changing the code, call script_parse so the editor re-reads the script's name and attributes. When NOT to use: to attach a script to an entity (use attach_script) or to create the script asset itself (use create_assets type="script").

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesFull JavaScript/TypeScript source of the script
assetIdYesScript asset id

TDQS

A4.1/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description says 'Overwrite the source code,' which is a destructive/overwriting operation, but the annotation destructiveHint is false. This is a direct annotation contradiction, so behavioral transparency must score 1 despite the description otherwise being transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler. The core action is front-loaded, the necessary post-step is included, and the when-not-to-use guidance is concise. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema, the description covers the action, the required next step, and when to choose sibling tools. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are already documented at 100% schema coverage. The description adds the important nuance that text must contain the full file contents, reinforcing overwrite semantics rather than a partial edit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Overwrite the source code of an existing script asset.' It also explicitly contrasts itself with attach_script and create_assets, so an agent can distinguish it from the most relevant siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'When NOT to use' section names exact alternatives: attach_script for attaching a script to an entity, and create_assets type="script" for creating the asset. It also gives a concrete follow-up instruction to call script_parse after editing, which is strong usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_selectionA
Idempotent

Replace the editor's selection with the given entities or assets. Selecting shows them in the inspector and highlights them in the viewport/tree. Pass type "entity" (ids are resource_ids) or "asset" (ids are numbers). An empty ids array clears the selection. When NOT to use: to modify the selected items (use modify_entities) or to frame them in the viewport (use focus_viewport).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesIds to select (entity resource_ids or asset ids); empty clears the selection
typeYesWhat kind of items the ids refer to

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey idempotency and non-destructiveness. The description adds meaningful behavioral context: replacing the selection, showing items in the inspector, highlighting in the viewport/tree, and clearing the selection with an empty ids array. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core action appears first, followed by the visible effects, parameter conventions, and exclusions. Every sentence earns its place with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool with strong annotations and no output schema, the description is complete. It covers the action, effect, parameter semantics, clearing behavior, and the key sibling alternatives, giving an agent everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters well. The description reinforces the type-to-id mapping and empty-array clearing behavior, but it largely restates what the schema already provides rather than adding new semantic depth.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Replace the editor's selection with the given entities or assets.' It also clarifies the observable effect (showing in inspector, highlighting in viewport/tree) and distinguishes itself from related selection operations by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit and actionable: it states when not to use the tool, naming modify_entities for modifying selected items and focus_viewport for framing them. It also explains the type-specific id formats and the empty-array behavior for clearing selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_transform_gizmoA
Idempotent

Set the viewport transform gizmo: mode (translate/rotate/scale/resize), coordinate space (world/local), and/or snapping. Only the provided fields change. Returns the resulting { mode, space }. When NOT to use: to actually move/rotate/scale an entity (use modify_entities on its transform).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoTransform gizmo mode
snapNoEnable or disable grid/angle snapping
spaceNoCoordinate space the gizmo operates in

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as non-destructive and idempotent, and the description avoids contradiction. It adds useful behavioral detail: only supplied fields are modified and the tool returns the resulting mode/space, which tells the agent the observable effect and response shape without an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler: the core action and accepted values come first, the partial-update contract and return value are second, and the exclusion/alternative is last. Every sentence carries information needed to call the tool safely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, fully-optional-parameter setter with rich schema descriptions, the description covers the action, the exact settings, the partial-update behavior, the return value, and the key alternative. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the three parameters are already described with enums and types. The description adds value by restating the semantic groups (mode, coordinate space, snapping) and, more importantly, by stating the partial-update behavior that governs how the optional parameters should be passed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Set the viewport transform gizmo', naming a specific verb and resource, then enumerates exactly what can be controlled: mode, coordinate space, and snapping. It also distinguishes itself from the nearby transform-modification tools by warning that it does not actually move/rotate/scale entities, which is the key sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when not to use the tool ('to actually move/rotate/scale an entity') and names the alternative ('use modify_entities on its transform'). It also clarifies that only provided fields change, so callers know they can issue partial updates without respecifying all settings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_viewport_stateA
Idempotent

Set the editor viewport camera transform, projection, grid, bones, icon size, and expanded state. This controls the editor view, not an entity's persisted enabled state.

ParametersJSON Schema
NameRequiredDescriptionDefault
gridNo
bonesNo
cameraIdNoEditor camera name (perspective/top/front/etc.) or camera entity resource_id
expandedNo
iconSizeNo
positionNo
rotationNo
projectionNo
orthoHeightNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the bar is lower. The description adds the key disclosure that the mutation targets transient editor view state rather than persisted entity data, effectively delimiting the write footprint and assuring non-persistence of effects. This complements the annotations and does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, roughly 30 words, front-loaded with the action and resource enumeration followed by the scoping caveat. Every sentence earns its place and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Reasonable for a state-setter whose safety profile is carried by annotations. The main gaps are uncovered parameter interactions (orthoHeight only meaningful with orthographic projection), what an all-optional empty call does, and no acknowledgment of the read counterpart query_viewport_state for verification — though since no output schema exists, silence on return values is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 11% schema description coverage (only cameraId is documented in-schema), the description must compensate. It maps parameter groups to aspects — 'camera transform' covers position/rotation/cameraId/orthoHeight, 'grid' covers the nested grid object, 'expanded state' covers expanded — which adds some meaning. However, per-parameter semantics remain undefined: rotation units, orthoHeight's relevance only to orthographic projection, the meaning of grid size vs divisions, and the behavior of an empty call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Set') and resource with an explicit enumeration of covered aspects: camera transform, projection, grid, bones, icon size, and expanded state. The second sentence adds a useful boundary by ruling out entity persisted enabled state, preventing a plausible category confusion. It does not explicitly name sibling tools, but the set/query verb split makes the contrast with query_viewport_state reasonably evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers one meaningful exclusion — 'not an entity's persisted enabled state' — which steers agents away from a real misuse scenario. However, it gives no explicit when-to-use guidance and does not route among the tightly related viewport siblings (query_viewport_state, set_viewport_visibility, focus_camera, focus_viewport), leaving usage largely implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_viewport_visibilityA
Idempotent

Hide or show entities only in the editor viewport without changing their persisted enabled values.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
hiddenYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the key behavioral trait: the effect is limited to the editor viewport and persisted enabled values are untouched. Annotations already communicate idempotentHint=true and destructiveHint=false, so the description adds meaningful context about what state is and is not affected. It does not contradict any annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It front-loads the action ('Hide or show entities'), then states the scoping constraint ('only in the editor viewport') and the critical non-effect ('without changing their persisted enabled values'). Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, no-output-schema tool, the description covers what the tool does, where it applies, and what it does not persist. It could briefly mention that visibility changes are editor-session only, but the phrase 'only in the editor viewport' already implies this. The tool is simple enough that nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Given the schema has 0% description coverage, the description helps by mapping 'entities' to the ids parameter and 'Hide or show' to the hidden boolean parameter. It does not explicitly state that hidden=true means hide and hidden=false means show, but the connection is straightforward. This adds meaning beyond the bare property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair, 'Hide or show entities', and clearly scopes the effect to the editor viewport. It also differentiates itself from persisted entity changes by stating that enabled values are not changed, distinguishing it from sibling tools like modify_entities or set_viewport_state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates this tool is for viewport-only visibility changes and excludes persisted enabled-value changes. It does not explicitly name an alternative tool such as query_viewport_visibility for reading visibility or modify_entities for persisted changes, but the context and scoping are sufficient for an agent to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sketchfab_getA
Read-only

Get a Sketchfab model by uid.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not contradict them. It adds no extra behavioral context beyond 'by uid,' such as response shape, error behavior, or side effects, but for a simple read-only getter this is acceptable and not misleading.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one short, front-loaded sentence with no filler. Every word contributes to identifying the operation, and the key detail ('by uid') is included upfront.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity—one required parameter, read-only annotations, and no nested schema—the description covers the essential information needed to call the tool. It does not describe the return value or not-found behavior, but for a simple get-by-id operation this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only defines 'uid' as a required string with no description. The description's 'by uid' clarifies that this parameter is the lookup key for the model, adding operational meaning. However, it does not elaborate on the expected format or provenance of the uid, though the single simple parameter is largely self-explanatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Get a Sketchfab model by uid.' It identifies the access method (by uid), which distinguishes it from sibling operations like sketchfab_search or sketchfab_import, though it does not explicitly name or contrast those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: this tool is for retrieving a model when you already have its uid. However, the description gives no explicit guidance about when to use this instead of sketchfab_search, sketchfab_import, or store_get, and no alternatives are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sketchfab_importB

Import a downloadable Sketchfab model into the current project.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
nameYes
folderNoAsset ID
licenseYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the readOnly/idempotent/destructive profile. The description adds that the source must be 'downloadable' and that the operation affects the 'current project'. It does not state what project state changes occur, e.g. whether a new asset is created or how license data is handled, so the behavioral value beyond annotations is modest.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence with no filler, starts with the action, and conveys the core operation immediately. It is appropriately concise for the amount of information it attempts to deliver.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

At 25% schema description coverage and no output schema, the description must carry much more weight. It covers only the source and target of the operation, leaving parameter semantics, side effects, and relationship to sibling import/asset tools unspecified. This is a meaningful gap for a tool with four parameters and no structured return description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema description coverage is only 25%, and the description does not compensate. uid, name, license, and license's nested fields have no semantic explanation in either schema or description. An agent cannot tell what uid refers to, what name should be, or why the license object is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Import'), a resource ('downloadable Sketchfab model') and a target ('current project'), making the primary purpose clear. It does not explicitly call out sibling differentiators, but the verb/resource combination distinguishes it from search/get-style siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'downloadable Sketchfab model' and 'into the current project' imply when the tool applies, but there is no explicit comparison to alternatives like my_assets_import, store_download, or download_asset. An agent must infer the intended use case rather than being told when to prefer it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_mergeA

Start merging a source branch into the CURRENT branch (the destination is always the branch the editor is on). Waits for the auto-merge to finish and returns the merge ({ id, mergeProgressStatus, conflicts, numConflicts }). If conflicts is non-empty, resolve them with resolve_conflicts, then apply_merge. Does not reload the editor. When NOT to use: to inspect an in-progress merge (use get_merge).

ParametersJSON Schema
NameRequiredDescriptionDefault
closeSourceNoClose the source branch after the merge is finalized (default false)
sourceBranchIdYesId of the branch to merge into the current branch (from list_branches)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no meaningful behavioral hints beyond non-read-only status, so the description carries the burden. It discloses important traits: the call waits for auto-merge to finish, returns a specific merge object, does not reload the editor, and reports conflicts for follow-up. It could go further by noting side effects on the current branch, but the disclosed behavior is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then efficiently packs in blocking behavior, return shape, conflict handling, an editor side-effect note, and an exclusion. Every sentence adds actionable value with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even without an output schema, the description specifies the returned merge fields and the conflict-resolution path. It covers when to start a merge, what happens while waiting, how to handle conflicts, and when to use get_merge instead. For a tool with only two documented parameters, this is fully sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents sourceBranchId and closeSource. The description adds no new parameter-level detail beyond what is already in the schema, matching the baseline for high coverage. It does reinforce that sourceBranchId is the branch to merge into the current branch.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific action: 'Start merging a source branch into the CURRENT branch' and clarifies that the destination is always the editor's current branch. It also distinguishes itself from related merge tools by mentioning the blocking wait and returned merge object, making its role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit workflow guidance: when conflicts exist, use resolve_conflicts then apply_merge. It also explicitly states when NOT to use the tool: 'to inspect an in-progress merge (use get_merge).' This provides clear routing among the sibling merge tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

store_downloadA

Clone/import a public store asset into the current project. Requires the license fields returned by store_get. Reaches an external service over the network and adds new assets to the project. When NOT to use: for assets already in the project.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesStore asset id (from store_search)
nameYesName for the imported asset
folderNoAsset ID
licenseYesLicense info from store_get

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, openWorldHint=true, and idempotentHint=false. The description adds useful behavioral context beyond these: it 'reaches an external service over the network' and 'adds new assets to the project,' which clarifies the side-effect profile. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, all substantive and front-loaded. The main action and scope come first, followed by prerequisites and side effects, with the exclusion last. No filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a network-reaching mutation tool with no output schema, the description covers the core call requirements: purpose, prerequisite, external side effect, and when not to use it. It does not describe return values, but with no output schema and a clear effect statement, the definition is still reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds minimal parameter meaning beyond the schema: it refers to the license fields returned by store_get, but the schema already says 'License info from store_get.' No additional semantic value is provided for id, name, or folder.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Clone/import a public store asset into the current project.' It clearly distinguishes store_download from generic download_asset and sketchfab_import by specifying 'store asset' and 'public'. This is enough for an agent to know what the tool does and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear prerequisite: 'Requires the license fields returned by store_get.' It also provides an explicit exclusion: 'When NOT to use: for assets already in the project.' However, it does not name an alternative tool to use in that exclusion case, so it stops short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

store_getA
Read-only

Get full details (including license info needed to download) for a single public store asset by id. Reaches an external service over the network. When NOT to use: to fetch a project-local asset (use list_assets).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesStore asset id (from store_search)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal read-only and open-world behavior. The description adds useful context by stating that the tool reaches an external service over the network and that the returned details include license info needed for download, which helps set latency and failure expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences: purpose first, then the network behavior, then the exclusion and alternative. Every sentence earns its place and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only getter, the description covers what the tool returns, the external nature of the service, and when not to use it. The lack of an output schema is mitigated by specifying that it returns full details including license info needed to download.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter, id, is already fully described in the schema as 'Store asset id (from store_search)'. The description merely says 'by id' and does not add meaningful parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific operation: retrieving full details for a single public store asset by ID, including license info needed for download. This distinguishes it from the related sibling tools like store_search and store_download, and from project-local get_asset/list_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a when-not-to-use case: fetching a project-local asset, and names the alternative tool (list_assets). The external-service/network note also sets expectations about when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

switch_branchA
Idempotent

Switch (checkout) the editor to an existing branch by its id (from list_branches). This RELOADS the editor; the tool waits for it to reconnect and returns the resulting vcs_status on the target branch. When NOT to use: to create a new branch (use create_branch).

ParametersJSON Schema
NameRequiredDescriptionDefault
branchIdYesId of the branch to switch to (the "id" field from list_branches)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description surfaces important runtime behavior beyond the annotations: the editor reloads, the tool waits for reconnection, and it returns the resulting vcs_status. This is useful context that annotations do not provide. It does not mention edge cases like unsaved changes, but the disclosed behavior is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentence sentences earn their place: the first states the action and behavior, the second provides an explicit exclusion. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a one-parameter tool with clear annotations and rich behavioral detail. It covers what happens, what is returned, and the main alternative. It could go slightly further in contrasting with open_branch/close_branch siblings, but that is not necessary for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already explains that branchId is the id of the branch to switch to. The description reinforces the schema's own reference to list_branches but does not add substantially new parameter meaning. With full schema coverage, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Switch (checkout) the editor') and the resource ('an existing branch by its id'), with a specific source for IDs ('from list_branches'). It also distinguishes itself from create_branch by explicitly stating it only switches to existing branches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when to use the tool ('Switch the editor to an existing branch by its id') and explicitly names a non-use case ('When NOT to use: to create a new branch') with the alternative tool ('use create_branch'). This gives the agent concrete decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

undoA

Undo the last edit in the editor. Returns whether anything was undone plus the resulting { canUndo, canRedo } state. Use this to roll back a change you just made. When NOT to use: to switch scenes (use load_scene).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false, indicating a mutating but non-destructive operation. The description adds meaningful behavior beyond that: it returns whether anything was undone and the resulting { canUndo, canRedo } state. This helps the agent understand no-op situations and stack state without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, all carrying distinct value: action, return behavior, usage, and an exclusion with alternative. Front-loaded with the core purpose and no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool with no output schema, the description covers all necessary aspects: what it does, what it returns, when to use it, and when not to use it. An agent can invoke it correctly without needing any additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so schema coverage is trivially 100%. Baseline for 0-param tools is 4, and the description appropriately focuses on return behavior rather than parameter details. Nothing further is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Undo the last edit in the editor.' It also includes a clear when-not-to-use with a named alternative (load_scene), which differentiates it from at least one sibling. It does not explicitly contrast with redo, but the core operation is unambiguous from the name and phrasing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use is given: 'Use this to roll back a change you just made.' An explicit when-not-to-use is also provided: 'to switch scenes (use load_scene).' This fully satisfies the highest bar for usage guidance, including an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unwrap_model_assetA
Idempotent

Generate UV1 data for a model asset using the editor's unwrap worker and update its source file.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesModel asset id
paddingNoUV island padding in pixels (default 2)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey idempotentHint=true, destructiveHint=false, and readOnlyHint=false, and the description adds meaningful behavioral context by disclosing that the operation updates the asset's source file. This goes beyond the annotations, which only say the tool is not read-only without specifying what mutation occurs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence that front-loads the main action ('Generate UV1 data') and then adds the relevant mechanism and side effect. There is no redundant wording or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core operation but omits useful context about the 'unwrap worker' workflow, such as whether the call is asynchronous, how completion is signaled, or that cancel_model_unwrap exists as a cancellation sibling. With no output schema, agents are left to guess about return behavior and post-call status.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both 'id' and 'padding' clearly. The description does not add additional parameter-level meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Generate UV1 data'), a clear resource ('model asset'), and a concrete side effect ('update its source file'). This distinguishes it from adjacent siblings like cancel_model_unwrap and bake_lightmaps, so an agent can tell what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives. It does not mention cancel_model_unwrap, nor does it state prerequisites or situations where another unwrap-related tool would be preferable. Usage context is only implied by the tool name and action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_assetsA
Destructive

Upload local files into the designated project, or replace an existing asset source by providing its id. Files are limited to 512 MiB each; the result separates succeeded and failed entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetsYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, so the description does not need to restate that basic safety posture. It adds a concrete 512 MiB per-file limit and discloses that the result separates succeeded and failed entries, giving useful behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences carry the full core message with no filler. The primary action is front-loaded, and each added clause earns its place by covering replacement, limits, and result behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the destructive annotation and the complex nested assets schema, the description covers the main behaviors but leaves operational gaps: how replacement items should be structured relative to the required path/type fields, and what 'designated project' means in practice. With no output schema, the partial-success mention helps but is not a full contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The top-level assets parameter has no schema description, but the description does add meaning by explaining new-upload versus replace-by-id behavior and by mentioning file-size limits and result partitioning. It does not explain how the required path and type fields interact with replacement items, though the nested schema descriptions partially compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: uploading local files into the project, plus a second replacement mode keyed by asset id. This makes the core purpose clear, but it does not explicitly distinguish the replacement mode from sibling tools like replace_asset or create_assets, so some differentiation effort remains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The two modes imply when to use the tool: upload new local files or replace an existing asset source by id. However, it never names alternatives such as create_assets or replace_asset, nor does it say when not to use those tools, so usage guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vcs_statusA
Read-only

Read the current version-control state: the active branch ({ id, name, latestCheckpointId }), the projectId, and whether a merge is in progress. Use this to confirm which branch you are on, especially after create_branch/switch_branch/restore_checkpoint/hard_reset_checkpoint (which reload the editor). When NOT to use: to list branches (use list_branches) or checkpoints (use list_checkpoints).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds value beyond annotations by disclosing the return shape and the behavioral nuance that the listed mutation operations 'reload the editor,' implying the agent should re-query state afterward. It does not contradict the read-only annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler. The core purpose and return payload are front-loaded in sentence one, usage triggers in sentence two, and exclusions in sentence three. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only status check with no output schema, the description is complete: it fully specifies what is returned, when to invoke it (including triggering operations), and which sibling tools to use instead for related but different queries. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty schema, so the baseline of 4 applies—there is no parameter documentation burden. The description instead documents the return payload, which is the meaningful input/output contract for a parameterless status tool; no parameter semantics are missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Read the current version-control state') and enumerates the exact return payload: the active branch ({ id, name, latestCheckpointId }), projectId, and merge-in-progress flag. This distinguishes it sharply from siblings like list_branches (lists all branches) and list_checkpoints (lists checkpoints).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use guidance is provided: 'Use this to confirm which branch you are on, especially after create_branch/switch_branch/restore_checkpoint/hard_reset_checkpoint (which reload the editor).' It also gives explicit when-not-to-use instructions with named alternatives ('to list branches (use list_branches) or checkpoints (use list_checkpoints)').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 124 tool updatesv0.7.0
    • Changedadd_components218 fields changed
      • changedInput schema / properties / components / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / description
        Previous value: -"A dictionary that contains the components of the entity and their data."New value: +"Entity components"
      • addedInput schema / properties / components / properties / anim
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Anim component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / components / properties / animation
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Animation (legacy) component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / components / properties / audiolistener / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / audiolistener / description
        Previous value: -"The data for the audio listener component."New value: +"Audio listener component"
      • removedInput schema / properties / components / properties / audiolistener / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • addedInput schema / properties / components / properties / button
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Button component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / components / properties / camera / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / camera / description
        Previous value: -"The data for the camera component."New value: +"Camera component"
      • changedInput schema / properties / components / properties / camera / properties / clearColor / description
        Previous value: -"The color used to clear the camera's render target. Default: [0.118, 0.118, 0.118, 1]"New value: +"Clear color"
      • changedInput schema / properties / components / properties / camera / properties / clearColor / items
        Previous value: -[
        -  {
        -    "description": "Red",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Green",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Blue",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Alpha",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  }
        -]New value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / components / properties / camera / properties / clearColorBuffer / description
        Previous value: -"If true, the camera will explicitly clear its render target to the chosen clear color before rendering the scene. Default: true"New value: +"Clear color buffer"
      • changedInput schema / properties / components / properties / camera / properties / clearDepthBuffer / description
        Previous value: -"If true, the camera will explicitly clear the depth buffer of its render target before rendering the scene. Default: true"New value: +"Clear depth buffer"
      • removedInput schema / properties / components / properties / camera / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / components / properties / camera / properties / farClip / description
        Removed value: -"The distance in camera space from the camera's eye point to the far plane. Default: 1000"
      • changedInput schema / properties / components / properties / camera / properties / fov / description
        Previous value: -"The angle (in degrees) between top and bottom clip planes of a perspective camera. Default: 45"New value: +"Field of view degrees"
      • removedInput schema / properties / components / properties / camera / properties / frustumCulling / description
        Removed value: -"Controls the culling of mesh instances against the camera frustum. If true, culling is enabled. If false, all mesh instances in the scene are rendered by the camera, regardless of visibility. Default: true"
      • changedInput schema / properties / components / properties / camera / properties / gammaCorrection / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "GAMMA_NONE",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "GAMMA_SRGB",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "None",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "sRGB",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / camera / properties / gammaCorrection / description
        Removed value: -"The gamma correction to apply to the final color of the camera. Default: 1 (GAMMA_SRGB)"
      • removedInput schema / properties / components / properties / camera / properties / layers / description
        Removed value: -"An array of layer id's that this camera will render. Default: [0, 1, 2, 3, 4]"
      • removedInput schema / properties / components / properties / camera / properties / nearClip / description
        Removed value: -"The distance in camera space from the camera's eye point to the near plane. Default: 0.1"
      • changedInput schema / properties / components / properties / camera / properties / orthoHeight / description
        Previous value: -"The distance in world units between the top and bottom clip planes of an orthographic camera. Default: 4"New value: +"Ortho height"
      • removedInput schema / properties / components / properties / camera / properties / priority / description
        Removed value: -"A number that defines the order in which camera views are rendered by the engine. Smaller numbers are rendered first. Default: 0"
      • changedInput schema / properties / components / properties / camera / properties / projection / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "PROJECTION_PERSPECTIVE",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "PROJECTION_ORTHOGRAPHIC",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Perspective",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Orthographic",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / camera / properties / projection / description
        Removed value: -"The projection type of the camera. Default: 0 (PROJECTION_PERSPECTIVE)"
      • changedInput schema / properties / components / properties / camera / properties / rect / description
        Previous value: -"An array of 4 numbers that represents the rectangle that specifies the viewport onto the camera's attached render target. This allows you to implement features like split-screen or picture-in-picture. It is defined by normalized coordinates (0 to 1) in the following format: [The lower left x coordinate, The lower left y coordinate, The width of the rectangle, The height of the rectangle]. Default: [0, 0, 1, 1]"New value: +"Viewport rect [x,y,w,h]"
      • changedInput schema / properties / components / properties / camera / properties / rect / items
        Previous value: -[
        -  {
        -    "description": "X",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Y",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Z",
        -    "type": "number"
        -  },
        -  {
        -    "description": "W",
        -    "type": "number"
        -  }
        -]New value: +{
        +  "type": "number"
        +}
      • removedInput schema / properties / components / properties / camera / properties / renderSceneColorMap / description
        Removed value: -"If true, the camera will render the scene color map. Default: false"
      • removedInput schema / properties / components / properties / camera / properties / renderSceneDepthMap / description
        Removed value: -"If true, the camera will render the scene depth map. Default: false"
      • changedInput schema / properties / components / properties / camera / properties / toneMapping / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "TONEMAP_LINEAR",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "TONEMAP_FILMIC",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "TONEMAP_HEJL",
        -    "type": "number"
        -  },
        -  {
        -    "const": 3,
        -    "description": "TONEMAP_ACES",
        -    "type": "number"
        -  },
        -  {
        -    "const": 4,
        -    "description": "TONEMAP_ACES2",
        -    "type": "number"
        -  },
        -  {
        -    "const": 5,
        -    "description": "TONEMAP_NEUTRAL",
        -    "type": "number"
        -  },
        -  {
        -    "const": 6,
        -    "description": "TONEMAP_NONE",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Linear",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Filmic",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "Hejl",
        +    "type": "number"
        +  },
        +  {
        +    "const": 3,
        +    "description": "ACES",
        +    "type": "number"
        +  },
        +  {
        +    "const": 4,
        +    "description": "ACES2",
        +    "type": "number"
        +  },
        +  {
        +    "const": 5,
        +    "description": "Neutral",
        +    "type": "number"
        +  },
        +  {
        +    "const": 6,
        +    "description": "None",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / camera / properties / toneMapping / description
        Removed value: -"The tonemapping transform to apply to the final color of the camera. Default: 0 (TONEMAP_LINEAR)"
      • changedInput schema / properties / components / properties / collision / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / collision / description
        Previous value: -"The data for the collision component."New value: +"Collision component. Requires the Ammo physics module to be enabled in the project (IMPORT AMMO) to take effect. halfExtents/radius are in LOCAL space and are multiplied by the entity world scale — size the collider via these fields rather than relying on entity scale."
      • changedInput schema / properties / components / properties / collision / properties / angularOffset / description
        Previous value: -"The rotational offset of the collision shape from the Entity rotation in local space. Default: [0, 0, 0]"New value: +"[x,y,z]"
      • changedInput schema / properties / components / properties / collision / properties / asset / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Asset ID",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / components / properties / collision / properties / asset / description
        Previous value: -"The `id` of the model asset that will be used as a source for the triangle-based collision mesh. Default: null"New value: +"Model asset"
      • removedInput schema / properties / components / properties / collision / properties / axis / description
        Removed value: -"Aligns the capsule/cylinder with the local-space X, Y or Z axis of the entity. Default: 1"
      • removedInput schema / properties / components / properties / collision / properties / convexHull / description
        Removed value: -"If true, the collision shape will be a convex hull. Default: false"
      • removedInput schema / properties / components / properties / collision / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • changedInput schema / properties / components / properties / collision / properties / halfExtents / description
        Previous value: -"The half-extents of the collision box. This is an array of 3 numbers: local space half-width, half-height, and half-depth. Default: [0.5, 0.5, 0.5]"New value: +"Box half-extents"
      • changedInput schema / properties / components / properties / collision / properties / halfExtents / items
        Previous value: -[
        -  {
        -    "description": "X",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Y",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Z",
        -    "type": "number"
        -  }
        -]New value: +{
        +  "type": "number"
        +}
      • removedInput schema / properties / components / properties / collision / properties / height / description
        Removed value: -"The tip-to-tip height of the capsule/cylinder. Default: 2"
      • changedInput schema / properties / components / properties / collision / properties / linearOffset / description
        Previous value: -"The positional offset of the collision shape from the Entity position along the local axes. Default: [0, 0, 0]"New value: +"[x,y,z]"
      • removedInput schema / properties / components / properties / collision / properties / radius / description
        Removed value: -"The radius of the capsule/cylinder body. Default: 0.5"
      • changedInput schema / properties / components / properties / collision / properties / renderAsset / description
        Previous value: -"The `id` of the render asset that will be used as a source for the triangle-based collision mesh. Default: null"New value: +"Render asset"
      • removedInput schema / properties / components / properties / collision / properties / type / description
        Removed value: -"The type of collision primitive. Can be: box, sphere, capsule, cylinder, mesh. Default: \"box\""
      • changedInput schema / properties / components / properties / element / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / element / description
        Previous value: -"The data for the element component."New value: +"UI element component"
      • changedInput schema / properties / components / properties / element / properties / alignment / description
        Previous value: -"Horizontal and vertical alignment of the text relative to its element transform. Default: [0.5, 0.5]"New value: +"[x,y]"
      • changedInput schema / properties / components / properties / element / properties / anchor / description
        Previous value: -"An array of 4 numbers controlling the left, bottom, right and top anchors of the element. Default: [0.5, 0.5, 0.5, 0.5]"New value: +"[left,bottom,right,top]"
      • removedInput schema / properties / components / properties / element / properties / autoFitHeight / description
        Removed value: -"Automatically scale the font size to fit the element's height. Default: false"
      • removedInput schema / properties / components / properties / element / properties / autoFitWidth / description
        Removed value: -"Automatically scale the font size to fit the element's width. Default: false"
      • removedInput schema / properties / components / properties / element / properties / autoHeight / description
        Removed value: -"Automatically size height to match text content. Default: false"
      • removedInput schema / properties / components / properties / element / properties / autoWidth / description
        Removed value: -"Automatically size width to match text content. Default: false"
      • removedInput schema / properties / components / properties / element / properties / batchGroupId / description
        Removed value: -"The batch group id that this element belongs to. Default: null"
      • changedInput schema / properties / components / properties / element / properties / color / description
        Previous value: -"The RGB color of the element. Default: [1, 1, 1]"New value: +"RGB color [r,g,b] 0-1"
      • changedInput schema / properties / components / properties / element / properties / color / items
        Previous value: -[
        -  {
        -    "description": "Red",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Green",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Blue",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  }
        -]New value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • removedInput schema / properties / components / properties / element / properties / enableMarkup / description
        Removed value: -"Enable markup processing (only for text elements). Default: false"
      • removedInput schema / properties / components / properties / element / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / components / properties / element / properties / fitMode / description
        Removed value: -"Set how the content should be fitted and preserve the aspect ratio. Default: \"stretch\""
      • changedInput schema / properties / components / properties / element / properties / fontAsset / description
        Previous value: -"The `id` of the font asset used by the element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / components / properties / element / properties / fontSize / description
        Removed value: -"The size of the font used by the element. Default: 32"
      • removedInput schema / properties / components / properties / element / properties / height / description
        Removed value: -"The height of the element. Default: 32"
      • changedInput schema / properties / components / properties / element / properties / key / description
        Previous value: -"The localization key of the element. Default: null"New value: +"Localization key"
      • removedInput schema / properties / components / properties / element / properties / layers / description
        Removed value: -"An array of layer ids that this element belongs to. Default: [4]"
      • removedInput schema / properties / components / properties / element / properties / lineHeight / description
        Removed value: -"The height of each line of text. Default: 32"
      • changedInput schema / properties / components / properties / element / properties / margin / description
        Previous value: -"Spacing between each edge of the element and the respective anchor. Default: [-16, -16, -16, -16]"New value: +"[x,y,z,w]"
      • removedInput schema / properties / components / properties / element / properties / mask / description
        Removed value: -"If true, this element acts as a mask for its children. Default: false"
      • changedInput schema / properties / components / properties / element / properties / materialAsset / description
        Previous value: -"The `id` of the material asset used by this element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / components / properties / element / properties / maxFontSize / description
        Removed value: -"The maximum size of the font when using `autoFitWidth` or `autoFitHeight`. Default: 32"
      • removedInput schema / properties / components / properties / element / properties / maxLines / description
        Removed value: -"The maximum number of lines that this element can display. Default: null"
      • removedInput schema / properties / components / properties / element / properties / minFontSize / description
        Removed value: -"The minimum size of the font when using `autoFitWidth` or `autoFitHeight`. Default: 8"
      • removedInput schema / properties / components / properties / element / properties / opacity / description
        Removed value: -"The opacity of the element. Default: 1"
      • changedInput schema / properties / components / properties / element / properties / outlineColor / description
        Previous value: -"Text outline effect color and opacity. Default: [0, 0, 0, 1]"New value: +"RGBA color [r,g,b,a] 0-1"
      • removedInput schema / properties / components / properties / element / properties / outlineThickness / description
        Removed value: -"Text outline effect width (0–1). Default: 0"
      • changedInput schema / properties / components / properties / element / properties / pivot / description
        Previous value: -"An array of 2 numbers controlling the origin of the element. Default: [0.5, 0.5]"New value: +"[x,y]"
      • changedInput schema / properties / components / properties / element / properties / pivot / items
        Previous value: -[
        -  {
        -    "description": "X",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Y",
        -    "type": "number"
        -  }
        -]New value: +{
        +  "type": "number"
        +}
      • removedInput schema / properties / components / properties / element / properties / pixelsPerUnit / description
        Removed value: -"Number of pixels per PlayCanvas unit (used for 9-sliced sprites). Default: null"
      • changedInput schema / properties / components / properties / element / properties / rect / description
        Previous value: -"Texture rect for the image element (u, v, width, height). Default: [0, 0, 1, 1]"New value: +"Texture rect [u,v,w,h]"
      • changedInput schema / properties / components / properties / element / properties / shadowColor / description
        Previous value: -"Text shadow color and opacity. Default: [0, 0, 0, 1]"New value: +"RGBA color [r,g,b,a] 0-1"
      • changedInput schema / properties / components / properties / element / properties / shadowOffset / description
        Previous value: -"Horizontal and vertical offset of the text shadow. Default: [0.0, 0.0]"New value: +"[x,y]"
      • changedInput schema / properties / components / properties / element / properties / spacing / description
        Previous value: -"The spacing between each letter of the text. Default: 1"New value: +"Letter spacing"
      • changedInput schema / properties / components / properties / element / properties / spriteAsset / description
        Previous value: -"The `id` of the sprite asset to be used by the element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / components / properties / element / properties / spriteFrame / description
        Removed value: -"The frame from the sprite asset to render. Default: 0"
      • removedInput schema / properties / components / properties / element / properties / text / description
        Removed value: -"The text content of the element. Default: \"\""
      • changedInput schema / properties / components / properties / element / properties / textureAsset / description
        Previous value: -"The `id` of the texture asset to be used by the element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / components / properties / element / properties / type / description
        Removed value: -"The type of the element. Default: \"text\""
      • removedInput schema / properties / components / properties / element / properties / useInput / description
        Removed value: -"Enable this to make the element respond to input events. Default: false"
      • removedInput schema / properties / components / properties / element / properties / width / description
        Removed value: -"The width of the element. Default: 32"
      • removedInput schema / properties / components / properties / element / properties / wrapLines / description
        Removed value: -"Automatically wrap lines based on the element width. Default: true"
      • addedInput schema / properties / components / properties / layoutchild
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Layout child component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / components / properties / layoutgroup
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Layout group component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / components / properties / light / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / light / description
        Previous value: -"The data for the light component."New value: +"Light component"
      • removedInput schema / properties / components / properties / light / properties / affectDynamic / description
        Removed value: -"If true the light will affect non-lightmapped objects. Default: true"
      • removedInput schema / properties / components / properties / light / properties / affectLightmapped / description
        Removed value: -"If true the light will affect lightmapped objects. Default: false"
      • removedInput schema / properties / components / properties / light / properties / affectSpecularity / description
        Removed value: -"If true the light will affect material specularity. For directional light only. Default: true."
      • changedInput schema / properties / components / properties / light / properties / bake / description
        Previous value: -"If true the light will be rendered into lightmaps. Default: false"New value: +"Bake to lightmap"
      • removedInput schema / properties / components / properties / light / properties / bakeArea / description
        Removed value: -"If bake is enabled, specifies the directional light penumbra angle in degrees, allowing soft shadows. Default: 0"
      • removedInput schema / properties / components / properties / light / properties / bakeDir / description
        Removed value: -"If true and `bake` is true, the light's direction will contribute to directional lightmaps. Default: true"
      • removedInput schema / properties / components / properties / light / properties / bakeNumSamples / description
        Removed value: -"If bake is enabled, specifies the number of samples used to bake this light into the lightmap. Default: 1"
      • removedInput schema / properties / components / properties / light / properties / cascadeDistribution / description
        Removed value: -"The distribution of subdivision of the camera frustum for individual shadow cascades. Default: 0.5"
      • removedInput schema / properties / components / properties / light / properties / castShadows / description
        Removed value: -"If true, the light will cause shadow casting models to cast shadows. Default: false"
      • changedInput schema / properties / components / properties / light / properties / color / description
        Previous value: -"An array of 3 numbers that represents the color of the emitted light. Default: [1, 1, 1]"New value: +"RGB color [r,g,b] 0-1"
      • removedInput schema / properties / components / properties / light / properties / cookieAngle / description
        Removed value: -"Angle for spotlight cookie rotation. Default: 0.0"
      • changedInput schema / properties / components / properties / light / properties / cookieAsset / description
        Previous value: -"The id of a texture asset that represents that light cookie. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / components / properties / light / properties / cookieChannel / description
        Removed value: -"Color channels of the projection texture to use. Can be \"r\", \"g\", \"b\", \"a\", \"rgb\" or any swizzled combination. Default: \"rgb\""
      • removedInput schema / properties / components / properties / light / properties / cookieFalloff / description
        Removed value: -"Toggle normal spotlight falloff when projection texture is used. Default: true"
      • removedInput schema / properties / components / properties / light / properties / cookieIntensity / description
        Removed value: -"Projection texture intensity. Default: 1.0"
      • changedInput schema / properties / components / properties / light / properties / cookieOffset / description
        Previous value: -"Spotlight cookie position offset. Default: [0.0, 0.0]"New value: +"[x,y]"
      • changedInput schema / properties / components / properties / light / properties / cookieScale / description
        Previous value: -"Spotlight cookie scale. Default: [1.0, 1.0]"New value: +"[x,y]"
      • removedInput schema / properties / components / properties / light / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • changedInput schema / properties / components / properties / light / properties / falloffMode / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "LIGHTFALLOFF_LINEAR",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "LIGHTFALLOFF_INVERSESQUARED",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Linear",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "InverseSquared",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / light / properties / falloffMode / description
        Removed value: -"Controls the rate at which a light attenuates from its position. Default: 0 (LIGHTFALLOFF_LINEAR)"
      • removedInput schema / properties / components / properties / light / properties / innerConeAngle / description
        Removed value: -"The angle at which the spotlight cone starts to fade off (degrees). Affects spot lights only. Default: 40"
      • removedInput schema / properties / components / properties / light / properties / intensity / description
        Removed value: -"The intensity of the light, this acts as a scalar value for the light's color. This value can exceed 1. Default: 1"
      • removedInput schema / properties / components / properties / light / properties / isStatic / description
        Removed value: -"Mark light as non-movable (optimization). Default: false"
      • removedInput schema / properties / components / properties / light / properties / layers / description
        Removed value: -"An array of layer id's that this light will affect. Default: [0]"
      • removedInput schema / properties / components / properties / light / properties / normalOffsetBias / description
        Removed value: -"Normal offset depth bias. Default: 0.05"
      • removedInput schema / properties / components / properties / light / properties / numCascades / description
        Removed value: -"Number of shadow cascades. Default: 1"
      • removedInput schema / properties / components / properties / light / properties / outerConeAngle / description
        Removed value: -"The angle at which the spotlight cone has faded to nothing (degrees). Affects spot lights only. Default: 45"
      • changedInput schema / properties / components / properties / light / properties / range / description
        Previous value: -"The distance from the spotlight source at which its contribution falls to zero. Default: 8"New value: +"Light range"
      • removedInput schema / properties / components / properties / light / properties / shadowBias / description
        Removed value: -"Constant depth offset applied to a shadow map to eliminate artifacts. Default: 0.2"
      • removedInput schema / properties / components / properties / light / properties / shadowDistance / description
        Removed value: -"The shadow distance is the maximum distance from the camera beyond which shadows from Directional Lights are no longer visible. Default: 16"
      • removedInput schema / properties / components / properties / light / properties / shadowIntensity / description
        Removed value: -"The intensity of the shadow darkening, 1 being shadows are entirely black. Default: 1"
      • removedInput schema / properties / components / properties / light / properties / shadowResolution / anyOf
        Removed value: -[
        -  {
        -    "const": 16,
        -    "description": "16x16",
        -    "type": "number"
        -  },
        -  {
        -    "const": 32,
        -    "description": "32x32",
        -    "type": "number"
        -  },
        -  {
        -    "const": 64,
        -    "description": "64x64",
        -    "type": "number"
        -  },
        -  {
        -    "const": 128,
        -    "description": "128x128",
        -    "type": "number"
        -  },
        -  {
        -    "const": 256,
        -    "description": "256x256",
        -    "type": "number"
        -  },
        -  {
        -    "const": 512,
        -    "description": "512x512",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1024,
        -    "description": "1024x1024",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2048,
        -    "description": "2048x2048",
        -    "type": "number"
        -  },
        -  {
        -    "const": 4096,
        -    "description": "4096x4096",
        -    "type": "number"
        -  }
        -]
      • removedInput schema / properties / components / properties / light / properties / shadowResolution / description
        Removed value: -"The size of the texture used for the shadow map (power of 2). Default: 1024"
      • addedInput schema / properties / components / properties / light / properties / shadowResolution / enum
        Added value: +[
        +  16,
        +  32,
        +  64,
        +  128,
        +  256,
        +  512,
        +  1024,
        +  2048,
        +  4096
        +]
      • addedInput schema / properties / components / properties / light / properties / shadowResolution / type
        Added value: +"number"
      • changedInput schema / properties / components / properties / light / properties / shadowType / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "SHADOW_PCF3_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "SHADOW_VSM_16F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 3,
        -    "description": "SHADOW_VSM_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 4,
        -    "description": "SHADOW_PCF5_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 5,
        -    "description": "SHADOW_PCF1_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 6,
        -    "description": "SHADOW_PCSS_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 7,
        -    "description": "SHADOW_PCF1_16F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 8,
        -    "description": "SHADOW_PCF3_16F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 9,
        -    "description": "SHADOW_PCF5_16F",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "PCF3_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "VSM_16F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 3,
        +    "description": "VSM_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 4,
        +    "description": "PCF5_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 5,
        +    "description": "PCF1_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 6,
        +    "description": "PCSS_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 7,
        +    "description": "PCF1_16F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 8,
        +    "description": "PCF3_16F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 9,
        +    "description": "PCF5_16F",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / light / properties / shadowType / description
        Removed value: -"Type of shadows being rendered by this light. Default: 0 (SHADOW_PCF3_32F)"
      • changedInput schema / properties / components / properties / light / properties / shadowUpdateMode / anyOf
        Previous value: -[
        -  {
        -    "const": 1,
        -    "description": "SHADOWUPDATE_THISFRAME",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "SHADOWUPDATE_REALTIME",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 1,
        +    "description": "ThisFrame",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "Realtime",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / light / properties / shadowUpdateMode / description
        Removed value: -"Tells the renderer how often shadows must be updated for this light. Default: 2 (SHADOWUPDATE_REALTIME)"
      • changedInput schema / properties / components / properties / light / properties / shape / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "LIGHTSHAPE_PUNCTUAL",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "LIGHTSHAPE_RECT",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "LIGHTSHAPE_DISK",
        -    "type": "number"
        -  },
        -  {
        -    "const": 3,
        -    "description": "LIGHTSHAPE_SPHERE",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Punctual",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Rect",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "Disk",
        +    "type": "number"
        +  },
        +  {
        +    "const": 3,
        +    "description": "Sphere",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / light / properties / shape / description
        Removed value: -"The shape of the light source. Default: 0 (LIGHTSHAPE_PUNCTUAL)"
      • removedInput schema / properties / components / properties / light / properties / type / description
        Removed value: -"The type of light. Can be: directional, spot, omni. Default: \"directional\""
      • removedInput schema / properties / components / properties / light / properties / vsmBias / description
        Removed value: -"Constant depth offset applied to a shadow map to eliminate rendering artifacts like shadow acne. Default: 0.01"
      • changedInput schema / properties / components / properties / light / properties / vsmBlurMode / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "BLUR_BOX",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "BLUR_GAUSSIAN",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Box",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Gaussian",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / components / properties / light / properties / vsmBlurMode / description
        Removed value: -"Blurring mode for variance shadow maps. Default: 1 (BLUR_GAUSSIAN)"
      • removedInput schema / properties / components / properties / light / properties / vsmBlurSize / description
        Removed value: -"Number of samples used for blurring a variance shadow map. Only uneven numbers work, even are incremented. Minimum value is 1, maximum is 25. Default: 11"
      • addedInput schema / properties / components / properties / model
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Model (legacy) component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / components / properties / particlesystem
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Particle system component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / components / properties / render / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / render / description
        Previous value: -"The data for the render component."New value: +"Render component"
      • changedInput schema / properties / components / properties / render / properties / aabbCenter / description
        Previous value: -"An array of 3 numbers controlling the center of the AABB to be used. Default: [0, 0, 0]"New value: +"[x,y,z]"
      • changedInput schema / properties / components / properties / render / properties / aabbHalfExtents / description
        Previous value: -"An array of 3 numbers controlling the half extents of the AABB to be used. Default: [0.5, 0.5, 0.5]"New value: +"[x,y,z]"
      • addedInput schema / properties / components / properties / render / properties / asset / $ref
        Added value: +"#/properties/components/properties/collision/properties/asset"
      • removedInput schema / properties / components / properties / render / properties / asset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / components / properties / render / properties / asset / description
        Previous value: -"The `id` of the render asset for the render component (only applies to type \"asset\"). Default: null"New value: +"Render asset"
      • removedInput schema / properties / components / properties / render / properties / batchGroupId / description
        Removed value: -"The batch group id that the meshes should belong to. Default: null"
      • removedInput schema / properties / components / properties / render / properties / castShadows / description
        Removed value: -"If true, attached meshes will cast shadows for lights that have shadow casting enabled. Default: true"
      • removedInput schema / properties / components / properties / render / properties / castShadowsLightmap / description
        Removed value: -"If true, the meshes will cast shadows when rendering lightmaps. Default: true"
      • removedInput schema / properties / components / properties / render / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / components / properties / render / properties / isStatic / description
        Removed value: -"Mark meshes as non-movable (optimization). Default: false"
      • removedInput schema / properties / components / properties / render / properties / layers / description
        Removed value: -"An array of layer id's to which the meshes should belong. Default: [0]"
      • removedInput schema / properties / components / properties / render / properties / lightmapSizeMultiplier / description
        Removed value: -"Lightmap resolution multiplier. Default: 1.0"
      • removedInput schema / properties / components / properties / render / properties / lightmapped / description
        Removed value: -"If true, the meshes will be lightmapped after using lightmapper.bake(). Default: false"
      • removedInput schema / properties / components / properties / render / properties / materialAssets / description
        Removed value: -"An array of material asset `id`s that will be used to render the meshes. Each material corresponds to the respective mesh instance. Default: []"
      • addedInput schema / properties / components / properties / render / properties / materialAssets / items / $ref
        Added value: +"#/properties/components/properties/collision/properties/asset"
      • removedInput schema / properties / components / properties / render / properties / materialAssets / items / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / components / properties / render / properties / receiveShadows / description
        Removed value: -"If true, shadows will be cast on attached meshes. Default: true"
      • removedInput schema / properties / components / properties / render / properties / rootBone / description
        Removed value: -"The `resource_id` of the entity to be used as the root bone for any skinned meshes that are rendered by this component. Default: null"
      • removedInput schema / properties / components / properties / render / properties / type / description
        Removed value: -"The type of the render component. Can be: asset, box, capsule, cone, cylinder, plane, sphere. Default: \"asset\""
      • changedInput schema / properties / components / properties / rigidbody / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / rigidbody / description
        Previous value: -"The data for the rigidbody component."New value: +"Rigidbody component. Requires the Ammo physics module to be enabled in the project (IMPORT AMMO); without it the body will not simulate. Usually paired with a collision component."
      • removedInput schema / properties / components / properties / rigidbody / properties / angularDamping / description
        Removed value: -"Controls the rate at which a body loses angular velocity over time. Default: 0"
      • changedInput schema / properties / components / properties / rigidbody / properties / angularFactor / description
        Previous value: -"An array of 3 numbers that represents the scaling factor for angular movement of the body in each axis. Default: [1, 1, 1]"New value: +"[x,y,z]"
      • removedInput schema / properties / components / properties / rigidbody / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / components / properties / rigidbody / properties / friction / description
        Removed value: -"The friction value used when contacts occur between two bodies. Default: 0.5"
      • removedInput schema / properties / components / properties / rigidbody / properties / linearDamping / description
        Removed value: -"Controls the rate at which a body loses linear velocity over time. Default: 0"
      • changedInput schema / properties / components / properties / rigidbody / properties / linearFactor / description
        Previous value: -"An array of 3 numbers that represents the scaling factor for linear movement of the body in each axis. Default: [1, 1, 1]"New value: +"[x,y,z]"
      • removedInput schema / properties / components / properties / rigidbody / properties / mass / description
        Removed value: -"The mass of the body. Default: 1"
      • changedInput schema / properties / components / properties / rigidbody / properties / restitution / description
        Previous value: -"The amount of energy lost when two objects collide, this determines the bounciness of the object. Default: 0.5"New value: +"Bounciness"
      • removedInput schema / properties / components / properties / rigidbody / properties / type / description
        Removed value: -"The type of RigidBody determines how it is simulated. Can be one of: static, dynamic, kinematic. Default: \"static\""
      • changedInput schema / properties / components / properties / screen / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / screen / description
        Previous value: -"The data for the screen component."New value: +"Screen component"
      • removedInput schema / properties / components / properties / screen / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / components / properties / screen / properties / priority / description
        Removed value: -"Determines the order in which Screen components in the same layer are rendered (higher priority is rendered on top). Number must be an integer between 0 and 127. Default: 0"
      • changedInput schema / properties / components / properties / screen / properties / referenceResolution / description
        Previous value: -"An array of 2 numbers that represents the reference resolution of the screen. If the window size changes the screen will adjust its size based on `scaleMode` using the reference resolution. Default: [1280, 720]"New value: +"[x,y]"
      • changedInput schema / properties / components / properties / screen / properties / resolution / description
        Previous value: -"An array of 2 numbers that represents the resolution of the screen. Default: [1280, 720]"New value: +"[x,y]"
      • removedInput schema / properties / components / properties / screen / properties / scaleBlend / description
        Removed value: -"Set this to 0 to only adjust to changes between the width of the window and the x of the reference resolution. Set this to 1 to only adjust to changes between the window height and the y of the reference resolution. A value in the middle will try to adjust to both. Default: 0.5"
      • removedInput schema / properties / components / properties / screen / properties / scaleMode / description
        Removed value: -"Controls how a screen-space screen is resized when the window size changes. Can be: `pc.SCALEMODE_BLEND`: Use it to have the screen adjust between the difference of the window resolution and the screen's reference resolution. `pc.SCALEMODE_NONE`: Use it to make the screen always have a size equal to its resolution. Default: \"blend\""
      • changedInput schema / properties / components / properties / screen / properties / screenSpace / description
        Previous value: -"If true then the screen will display its child Elements in 2D. Set this to false to make this a 3D screen. Default: true"New value: +"2D screen mode"
      • changedInput schema / properties / components / properties / script / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / script / description
        Previous value: -"The data for the script component."New value: +"Script component"
      • removedInput schema / properties / components / properties / script / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • changedInput schema / properties / components / properties / script / properties / order / description
        Previous value: -"An array of script names in the order in which they should be executed at runtime. Default: []"New value: +"Script execution order"
      • changedInput schema / properties / components / properties / script / properties / scripts / additionalProperties / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / script / properties / scripts / additionalProperties / properties / attributes / additionalProperties / description
        Previous value: -"A dictionary that holds the values of each attribute. The keys in the dictionary are the attribute names."New value: +"Script attribute values"
      • removedInput schema / properties / components / properties / script / properties / scripts / additionalProperties / properties / attributes / description
        Removed value: -"A dictionary that holds the values of each attribute. The keys in the dictionary are the attribute names. Default: {}"
      • removedInput schema / properties / components / properties / script / properties / scripts / additionalProperties / properties / enabled / description
        Removed value: -"Whether the script instance is enabled. Default: true"
      • changedInput schema / properties / components / properties / script / properties / scripts / description
        Previous value: -"A dictionary that contains all the scripts attached to this script component. Each key in the dictionary is the script name. Default: {}"New value: +"Script instances"
      • addedInput schema / properties / components / properties / scrollbar
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Scrollbar component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / components / properties / scrollview
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Scroll view component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / components / properties / sound / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / sound / description
        Previous value: -"The data for the sound component."New value: +"Sound component"
      • removedInput schema / properties / components / properties / sound / properties / distanceModel / description
        Removed value: -"Determines which algorithm to use to reduce the volume of the audio as it moves away from the listener. Can be one of: \"inverse\", \"linear\", \"exponential\". Default: \"linear\""
      • removedInput schema / properties / components / properties / sound / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / components / properties / sound / properties / maxDistance / description
        Removed value: -"The maximum distance from the listener at which audio falloff stops. Note the volume of the audio is not 0 after this distance, but just doesn't fall off anymore. Default: 10000"
      • removedInput schema / properties / components / properties / sound / properties / pitch / description
        Removed value: -"The pitch to playback the audio at. A value of 1 means the audio is played back at the original pitch. The pitch of each slot is multiplied with this value. Default: 1"
      • changedInput schema / properties / components / properties / sound / properties / positional / description
        Previous value: -"If true, the component will play back audio assets as if played from the location of the entity in 3D space. Default: true"New value: +"3D audio"
      • removedInput schema / properties / components / properties / sound / properties / refDistance / description
        Removed value: -"The reference distance for reducing volume as the sound source moves further from the listener. Default: 1"
      • removedInput schema / properties / components / properties / sound / properties / rollOffFactor / description
        Removed value: -"The rate at which volume fall-off occurs. Default: 1"
      • changedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / asset / description
        Previous value: -"The `id` of the audio asset that can be played from this sound slot. Default: null"New value: +"Audio asset"
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / autoPlay / description
        Removed value: -"If true, the slot will be played on load. Otherwise, sound slots will need to be played by scripts. Default: false"
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / duration / description
        Removed value: -"The duration of the sound that the slot will play starting from startTime. Default: null"
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / loop / description
        Removed value: -"If true, the slot will loop playback continuously. Otherwise, it will be played once to completion. Default: false"
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / name / description
        Removed value: -"The name of the sound slot. Default: \"Slot 1\""
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / overlap / description
        Removed value: -"If true then sounds played from slot will be played independently of each other. Otherwise the slot will first stop the current sound before starting the new one. Default: false"
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / pitch / description
        Removed value: -"The pitch to playback the audio at. A value of 1 means the audio is played back at the original pitch. Default: 1"
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / startTime / description
        Removed value: -"The start time from which the sound will start playing. Default: 0"
      • removedInput schema / properties / components / properties / sound / properties / slots / additionalProperties / properties / volume / description
        Removed value: -"The volume modifier to play the audio with. Default: 1"
      • changedInput schema / properties / components / properties / sound / properties / slots / description
        Previous value: -"A dictionary of sound slots. Each sound slot controls playback of an audio asset. Each key in the dictionary is a number representing the index of each sound slot."New value: +"Sound slots"
      • removedInput schema / properties / components / properties / sound / properties / volume / description
        Removed value: -"The volume modifier to play the audio with. The volume of each slot is multiplied with this value. Default: 1"
      • addedInput schema / properties / components / properties / sprite
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Sprite component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / id / description
        Previous value: -"An entity ID."New value: +"Entity ID"
    • Addedadd_entity_scripts
    • Changedadd_script_component_script2 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"An entity ID."New value: +"Entity ID"
      • addedInput schema / properties / scriptName / description
        Added value: +"Registered script name (the parsed script's name attribute)"
    • Addedapply_merge
    • Addedapply_template_overrides
    • Addedattach_script
    • Addedbake_lightmaps
    • Addedcancel_merge
    • Addedcancel_model_unwrap
    • Addedcapture_runtime
    • Addedcapture_viewport
    • Addedclear_cubemap_prefilter
    • Addedclear_selection
    • Addedclose_branch
    • Addedconvert_texture_asset
    • Changedcreate_assets2 fields changed
      • removedInput schema / properties / assets / description
        Removed value: -"Array of assets to create."
      • changedInput schema / properties / assets / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "CSS asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "folder": {
        -            "anyOf": [
        -              {
        -                "type": "integer"
        -              },
        -              {
        -                "type": "null"
        -              }
        -            ],
        -            "description": "An asset ID."
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "preload": {
        -            "type": "boolean"
        -          },
        -          "text": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "css",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "Folder asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "folder": {
        -            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -            "description": "An asset ID."
        -          },
        -          "name": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "folder",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "HTML asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "folder": {
        -            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -            "description": "An asset ID."
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "preload": {
        -            "type": "boolean"
        -          },
        -          "text": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "html",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "Material asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "data": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "alphaFade": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "alphaTest": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "alphaToCoverage": {
        -                "type": "boolean"
        -              },
        -              "ambient": {
        -                "description": "A 3-channel RGB color",
        -                "items": [
        -                  {
        -                    "description": "Red",
        -                    "maximum": 1,
        -                    "minimum": 0,
        -                    "type": "number"
        -                  },
        -                  {
        -                    "description": "Green",
        -                    "maximum": 1,
        -                    "minimum": 0,
        -                    "type": "number"
        -                  },
        -                  {
        -                    "description": "Blue",
        -                    "maximum": 1,
        -                    "minimum": 0,
        -                    "type": "number"
        -                  }
        -                ],
        -                "maxItems": 3,
        -                "minItems": 3,
        -                "type": "array"
        -              },
        -              "anisotropy": {
        -                "maximum": 1,
        -                "minimum": -1,
        -                "type": "number"
        -              },
        -              "aoIntensity": {
        -                "type": "number"
        -              },
        -              "aoMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "aoMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "aoMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "aoMapRotation": {
        -                "type": "number"
        -              },
        -              "aoMapTiling": {
        -                "description": "A 2D vector",
        -                "items": [
        -                  {
        -                    "description": "X",
        -                    "type": "number"
        -                  },
        -                  {
        -                    "description": "Y",
        -                    "type": "number"
        -                  }
        -                ],
        -                "maxItems": 2,
        -                "minItems": 2,
        -                "type": "array"
        -              },
        -              "aoMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "aoVertexColor": {
        -                "type": "boolean"
        -              },
        -              "aoVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "attenuation": {
        -                "items": {
        -                  "type": "number"
        -                },
        -                "maxItems": 3,
        -                "minItems": 3,
        -                "type": "array"
        -              },
        -              "attenuationDistance": {
        -                "type": "number"
        -              },
        -              "blendType": {
        -                "maximum": 10,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "bumpMapFactor": {
        -                "type": "number"
        -              },
        -              "clearCoat": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "clearCoatGloss": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "clearCoatGlossInvert": {
        -                "type": "boolean"
        -              },
        -              "clearCoatGlossMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "clearCoatGlossMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "clearCoatGlossMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "clearCoatGlossMapRotation": {
        -                "type": "number"
        -              },
        -              "clearCoatGlossMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "clearCoatGlossMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "clearCoatGlossVertexColor": {
        -                "type": "boolean"
        -              },
        -              "clearCoatGlossVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "clearCoatMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "clearCoatMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "clearCoatMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "clearCoatMapRotation": {
        -                "type": "number"
        -              },
        -              "clearCoatMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "clearCoatMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "clearCoatNormalMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "clearCoatNormalMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "clearCoatNormalMapRotation": {
        -                "type": "number"
        -              },
        -              "clearCoatNormalMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "clearCoatNormalMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "clearCoatVertexColor": {
        -                "type": "boolean"
        -              },
        -              "clearCoatVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "conserveEnergy": {
        -                "type": "boolean"
        -              },
        -              "cubeMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "cubeMapProjection": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "cubeMapProjectionBox": {
        -                "additionalProperties": false,
        -                "properties": {
        -                  "center": {
        -                    "description": "A 3D vector",
        -                    "items": [
        -                      {
        -                        "description": "X",
        -                        "type": "number"
        -                      },
        -                      {
        -                        "description": "Y",
        -                        "type": "number"
        -                      },
        -                      {
        -                        "description": "Z",
        -                        "type": "number"
        -                      }
        -                    ],
        -                    "maxItems": 3,
        -                    "minItems": 3,
        -                    "type": "array"
        -                  },
        -                  "halfExtents": {
        -                    "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/cubeMapProjectionBox/properties/center"
        -                  }
        -                },
        -                "required": [
        -                  "center",
        -                  "halfExtents"
        -                ],
        -                "type": "object"
        -              },
        -              "cull": {
        -                "maximum": 3,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "depthBias": {
        -                "type": "number"
        -              },
        -              "depthTest": {
        -                "type": "boolean"
        -              },
        -              "depthWrite": {
        -                "type": "boolean"
        -              },
        -              "diffuse": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/ambient",
        -                "description": "A 3-channel RGB color"
        -              },
        -              "diffuseMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "diffuseMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "diffuseMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "diffuseMapRotation": {
        -                "type": "number"
        -              },
        -              "diffuseMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "diffuseMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "diffuseVertexColor": {
        -                "type": "boolean"
        -              },
        -              "diffuseVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "dispersion": {
        -                "maximum": 10,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "emissive": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/ambient",
        -                "description": "A 3-channel RGB color"
        -              },
        -              "emissiveIntensity": {
        -                "maximum": 10,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "emissiveMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "emissiveMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "emissiveMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "emissiveMapRotation": {
        -                "type": "number"
        -              },
        -              "emissiveMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "emissiveMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "emissiveVertexColor": {
        -                "type": "boolean"
        -              },
        -              "emissiveVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "enableGGXSpecular": {
        -                "type": "boolean"
        -              },
        -              "glossInvert": {
        -                "type": "boolean"
        -              },
        -              "glossMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "glossMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "glossMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "glossMapRotation": {
        -                "type": "number"
        -              },
        -              "glossMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "glossMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "glossVertexColor": {
        -                "type": "boolean"
        -              },
        -              "glossVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "heightMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "heightMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "heightMapFactor": {
        -                "maximum": 2,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "heightMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "heightMapRotation": {
        -                "type": "number"
        -              },
        -              "heightMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "heightMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "iridescence": {
        -                "type": "number"
        -              },
        -              "iridescenceMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "iridescenceMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "iridescenceMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "iridescenceMapRotation": {
        -                "type": "number"
        -              },
        -              "iridescenceMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "iridescenceMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "iridescenceRefractionIndex": {
        -                "type": "number"
        -              },
        -              "iridescenceThicknessMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "iridescenceThicknessMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "iridescenceThicknessMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "iridescenceThicknessMapRotation": {
        -                "type": "number"
        -              },
        -              "iridescenceThicknessMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "iridescenceThicknessMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "iridescenceThicknessMax": {
        -                "type": "number"
        -              },
        -              "iridescenceThicknessMin": {
        -                "type": "number"
        -              },
        -              "lightMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "lightMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "lightMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "lightMapRotation": {
        -                "type": "number"
        -              },
        -              "lightMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "lightMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "lightVertexColor": {
        -                "type": "boolean"
        -              },
        -              "lightVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "metalness": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "metalnessMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "metalnessMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "metalnessMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "metalnessMapRotation": {
        -                "type": "number"
        -              },
        -              "metalnessMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "metalnessMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "metalnessVertexColor": {
        -                "type": "boolean"
        -              },
        -              "metalnessVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "name": {
        -                "type": "string"
        -              },
        -              "normalMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "normalMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "normalMapRotation": {
        -                "type": "number"
        -              },
        -              "normalMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "normalMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "occludeSpecular": {
        -                "maximum": 2,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "opacity": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "opacityDither": {
        -                "enum": [
        -                  "none",
        -                  "bayer8",
        -                  "bluenoise",
        -                  "ignnoise"
        -                ],
        -                "type": "string"
        -              },
        -              "opacityFadesSpecular": {
        -                "type": "boolean"
        -              },
        -              "opacityMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "opacityMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "opacityMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "opacityMapRotation": {
        -                "type": "number"
        -              },
        -              "opacityMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "opacityMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "opacityShadowDither": {
        -                "enum": [
        -                  "none",
        -                  "bayer8",
        -                  "bluenoise",
        -                  "ignnoise"
        -                ],
        -                "type": "string"
        -              },
        -              "opacityVertexColor": {
        -                "type": "boolean"
        -              },
        -              "opacityVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "reflectivity": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "refraction": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "refractionIndex": {
        -                "maximum": 1,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "refractionMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "refractionMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "refractionMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "refractionMapRotation": {
        -                "type": "number"
        -              },
        -              "refractionMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "refractionMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "refractionVertexColor": {
        -                "type": "boolean"
        -              },
        -              "refractionVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "sheen": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/ambient",
        -                "description": "A 3-channel RGB color"
        -              },
        -              "sheenGloss": {
        -                "type": "number"
        -              },
        -              "sheenGlossInvert": {
        -                "type": "boolean"
        -              },
        -              "sheenGlossMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "sheenGlossMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "sheenGlossMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "sheenGlossMapRotation": {
        -                "type": "number"
        -              },
        -              "sheenGlossMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "sheenGlossMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "sheenGlossVertexColor": {
        -                "type": "boolean"
        -              },
        -              "sheenGlossVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "sheenMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "sheenMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "sheenMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "sheenMapRotation": {
        -                "type": "number"
        -              },
        -              "sheenMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "sheenMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "sheenVertexColor": {
        -                "type": "boolean"
        -              },
        -              "sheenVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "shininess": {
        -                "maximum": 100,
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "slopeDepthBias": {
        -                "type": "number"
        -              },
        -              "specular": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/ambient",
        -                "description": "A 3-channel RGB color"
        -              },
        -              "specularAntialias": {
        -                "type": "boolean"
        -              },
        -              "specularMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "specularMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "specularMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "specularMapRotation": {
        -                "type": "number"
        -              },
        -              "specularMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "specularMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "specularTint": {
        -                "type": "boolean"
        -              },
        -              "specularVertexColor": {
        -                "type": "boolean"
        -              },
        -              "specularVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "specularityFactor": {
        -                "type": "number"
        -              },
        -              "specularityFactorMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "specularityFactorMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "specularityFactorMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "specularityFactorMapRotation": {
        -                "type": "number"
        -              },
        -              "specularityFactorMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "specularityFactorMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "specularityFactorTint": {
        -                "type": "boolean"
        -              },
        -              "specularityFactorVertexColor": {
        -                "type": "boolean"
        -              },
        -              "specularityFactorVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "sphereMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "thickness": {
        -                "type": "number"
        -              },
        -              "thicknessMap": {
        -                "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -                "description": "An asset ID."
        -              },
        -              "thicknessMapChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "thicknessMapOffset": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "thicknessMapRotation": {
        -                "type": "number"
        -              },
        -              "thicknessMapTiling": {
        -                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/data/properties/aoMapTiling",
        -                "description": "A 2D vector"
        -              },
        -              "thicknessMapUv": {
        -                "maximum": 7,
        -                "minimum": 0,
        -                "type": "integer"
        -              },
        -              "thicknessVertexColor": {
        -                "type": "boolean"
        -              },
        -              "thicknessVertexColorChannel": {
        -                "enum": [
        -                  "r",
        -                  "g",
        -                  "b",
        -                  "a",
        -                  "rgb"
        -                ],
        -                "type": "string"
        -              },
        -              "twoSidedLighting": {
        -                "type": "boolean"
        -              },
        -              "useDynamicRefraction": {
        -                "type": "boolean"
        -              },
        -              "useFog": {
        -                "type": "boolean"
        -              },
        -              "useIridescence": {
        -                "type": "boolean"
        -              },
        -              "useLighting": {
        -                "type": "boolean"
        -              },
        -              "useMetalness": {
        -                "type": "boolean"
        -              },
        -              "useMetalnessSpecularColor": {
        -                "type": "boolean"
        -              },
        -              "useSheen": {
        -                "type": "boolean"
        -              },
        -              "useSkybox": {
        -                "type": "boolean"
        -              },
        -              "useTonemap": {
        -                "type": "boolean"
        -              }
        -            },
        -            "type": "object"
        -          },
        -          "folder": {
        -            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -            "description": "An asset ID."
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "preload": {
        -            "type": "boolean"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "material",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "Script asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "filename": {
        -            "type": "string"
        -          },
        -          "folder": {
        -            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -            "description": "An asset ID."
        -          },
        -          "preload": {
        -            "type": "boolean"
        -          },
        -          "text": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "script",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "Shader asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "folder": {
        -            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -            "description": "An asset ID."
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "preload": {
        -            "type": "boolean"
        -          },
        -          "text": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "shader",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "Template asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "entity": {
        -            "description": "An entity ID.",
        -            "format": "uuid",
        -            "type": "string"
        -          },
        -          "folder": {
        -            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -            "description": "An asset ID."
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "preload": {
        -            "type": "boolean"
        -          }
        -        },
        -        "required": [
        -          "entity"
        -        ],
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "template",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "options"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "Text asset creation options.",
        -    "properties": {
        -      "options": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "folder": {
        -            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        -            "description": "An asset ID."
        -          },
        -          "name": {
        -            "type": "string"
        -          },
        -          "preload": {
        -            "type": "boolean"
        -          },
        -          "text": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "type": {
        -        "const": "text",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "Animation state graph asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "data": {
        +            "additionalProperties": {},
        +            "type": "object"
        +          },
        +          "folder": {
        +            "description": "Asset ID",
        +            "exclusiveMinimum": 0,
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "animstategraph",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Bundle asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "assets": {
        +            "items": {
        +              "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder"
        +            },
        +            "type": "array"
        +          },
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "bundle",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "CSS asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "text": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "css",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Cubemap asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "anisotropy": {
        +            "type": "number"
        +          },
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "magFilter": {
        +            "type": "integer"
        +          },
        +          "minFilter": {
        +            "type": "integer"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "textures": {
        +            "items": {
        +              "anyOf": [
        +                {
        +                  "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Nullable asset reference"
        +            },
        +            "maxItems": 6,
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "cubemap",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Folder asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "folder",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "HTML asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "text": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "html",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Localization JSON asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "localizationData": {
        +            "additionalProperties": {},
        +            "type": "object"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "i18n",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "JSON asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "json": {},
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "spaces": {
        +            "maximum": 10,
        +            "minimum": 0,
        +            "type": "integer"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "json",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Material asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "data": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "alphaFade": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "alphaTest": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "alphaToCoverage": {
        +                "type": "boolean"
        +              },
        +              "ambient": {
        +                "description": "RGB color [r,g,b] 0-1",
        +                "items": {
        +                  "maximum": 1,
        +                  "minimum": 0,
        +                  "type": "number"
        +                },
        +                "maxItems": 3,
        +                "minItems": 3,
        +                "type": "array"
        +              },
        +              "anisotropy": {
        +                "maximum": 1,
        +                "minimum": -1,
        +                "type": "number"
        +              },
        +              "aoIntensity": {
        +                "type": "number"
        +              },
        +              "aoMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "aoMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "aoMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "aoMapRotation": {
        +                "type": "number"
        +              },
        +              "aoMapTiling": {
        +                "description": "[x,y]",
        +                "items": {
        +                  "type": "number"
        +                },
        +                "maxItems": 2,
        +                "minItems": 2,
        +                "type": "array"
        +              },
        +              "aoMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "aoVertexColor": {
        +                "type": "boolean"
        +              },
        +              "aoVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "attenuation": {
        +                "items": {
        +                  "type": "number"
        +                },
        +                "maxItems": 3,
        +                "minItems": 3,
        +                "type": "array"
        +              },
        +              "attenuationDistance": {
        +                "type": "number"
        +              },
        +              "blendType": {
        +                "maximum": 10,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "bumpMapFactor": {
        +                "type": "number"
        +              },
        +              "clearCoat": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "clearCoatGloss": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "clearCoatGlossInvert": {
        +                "type": "boolean"
        +              },
        +              "clearCoatGlossMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "clearCoatGlossMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "clearCoatGlossMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "clearCoatGlossMapRotation": {
        +                "type": "number"
        +              },
        +              "clearCoatGlossMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "clearCoatGlossMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "clearCoatGlossVertexColor": {
        +                "type": "boolean"
        +              },
        +              "clearCoatGlossVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "clearCoatMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "clearCoatMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "clearCoatMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "clearCoatMapRotation": {
        +                "type": "number"
        +              },
        +              "clearCoatMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "clearCoatMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "clearCoatNormalMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "clearCoatNormalMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "clearCoatNormalMapRotation": {
        +                "type": "number"
        +              },
        +              "clearCoatNormalMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "clearCoatNormalMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "clearCoatVertexColor": {
        +                "type": "boolean"
        +              },
        +              "clearCoatVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "conserveEnergy": {
        +                "type": "boolean"
        +              },
        +              "cubeMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "cubeMapProjection": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "cubeMapProjectionBox": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "center": {
        +                    "description": "[x,y,z]",
        +                    "items": {
        +                      "type": "number"
        +                    },
        +                    "maxItems": 3,
        +                    "minItems": 3,
        +                    "type": "array"
        +                  },
        +                  "halfExtents": {
        +                    "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/cubeMapProjectionBox/properties/center"
        +                  }
        +                },
        +                "required": [
        +                  "center",
        +                  "halfExtents"
        +                ],
        +                "type": "object"
        +              },
        +              "cull": {
        +                "maximum": 3,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "depthBias": {
        +                "type": "number"
        +              },
        +              "depthTest": {
        +                "type": "boolean"
        +              },
        +              "depthWrite": {
        +                "type": "boolean"
        +              },
        +              "diffuse": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/ambient",
        +                "description": "RGB color [r,g,b] 0-1"
        +              },
        +              "diffuseMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "diffuseMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "diffuseMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "diffuseMapRotation": {
        +                "type": "number"
        +              },
        +              "diffuseMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "diffuseMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "diffuseVertexColor": {
        +                "type": "boolean"
        +              },
        +              "diffuseVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "dispersion": {
        +                "maximum": 10,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "emissive": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/ambient",
        +                "description": "RGB color [r,g,b] 0-1"
        +              },
        +              "emissiveIntensity": {
        +                "maximum": 10,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "emissiveMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "emissiveMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "emissiveMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "emissiveMapRotation": {
        +                "type": "number"
        +              },
        +              "emissiveMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "emissiveMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "emissiveVertexColor": {
        +                "type": "boolean"
        +              },
        +              "emissiveVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "enableGGXSpecular": {
        +                "type": "boolean"
        +              },
        +              "glossInvert": {
        +                "type": "boolean"
        +              },
        +              "glossMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "glossMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "glossMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "glossMapRotation": {
        +                "type": "number"
        +              },
        +              "glossMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "glossMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "glossVertexColor": {
        +                "type": "boolean"
        +              },
        +              "glossVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "heightMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "heightMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "heightMapFactor": {
        +                "maximum": 2,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "heightMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "heightMapRotation": {
        +                "type": "number"
        +              },
        +              "heightMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "heightMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "iridescence": {
        +                "type": "number"
        +              },
        +              "iridescenceMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "iridescenceMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "iridescenceMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "iridescenceMapRotation": {
        +                "type": "number"
        +              },
        +              "iridescenceMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "iridescenceMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "iridescenceRefractionIndex": {
        +                "type": "number"
        +              },
        +              "iridescenceThicknessMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "iridescenceThicknessMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "iridescenceThicknessMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "iridescenceThicknessMapRotation": {
        +                "type": "number"
        +              },
        +              "iridescenceThicknessMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "iridescenceThicknessMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "iridescenceThicknessMax": {
        +                "type": "number"
        +              },
        +              "iridescenceThicknessMin": {
        +                "type": "number"
        +              },
        +              "lightMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "lightMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "lightMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "lightMapRotation": {
        +                "type": "number"
        +              },
        +              "lightMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "lightMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "lightVertexColor": {
        +                "type": "boolean"
        +              },
        +              "lightVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "metalness": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "metalnessMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "metalnessMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "metalnessMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "metalnessMapRotation": {
        +                "type": "number"
        +              },
        +              "metalnessMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "metalnessMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "metalnessVertexColor": {
        +                "type": "boolean"
        +              },
        +              "metalnessVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "normalMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "normalMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "normalMapRotation": {
        +                "type": "number"
        +              },
        +              "normalMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "normalMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "occludeSpecular": {
        +                "maximum": 2,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "opacity": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "opacityDither": {
        +                "enum": [
        +                  "none",
        +                  "bayer8",
        +                  "bluenoise",
        +                  "ignnoise"
        +                ],
        +                "type": "string"
        +              },
        +              "opacityFadesSpecular": {
        +                "type": "boolean"
        +              },
        +              "opacityMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "opacityMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "opacityMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "opacityMapRotation": {
        +                "type": "number"
        +              },
        +              "opacityMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "opacityMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "opacityShadowDither": {
        +                "enum": [
        +                  "none",
        +                  "bayer8",
        +                  "bluenoise",
        +                  "ignnoise"
        +                ],
        +                "type": "string"
        +              },
        +              "opacityVertexColor": {
        +                "type": "boolean"
        +              },
        +              "opacityVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "reflectivity": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "refraction": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "refractionIndex": {
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "refractionMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "refractionMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "refractionMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "refractionMapRotation": {
        +                "type": "number"
        +              },
        +              "refractionMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "refractionMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "refractionVertexColor": {
        +                "type": "boolean"
        +              },
        +              "refractionVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "sheen": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/ambient",
        +                "description": "RGB color [r,g,b] 0-1"
        +              },
        +              "sheenGloss": {
        +                "type": "number"
        +              },
        +              "sheenGlossInvert": {
        +                "type": "boolean"
        +              },
        +              "sheenGlossMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "sheenGlossMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "sheenGlossMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "sheenGlossMapRotation": {
        +                "type": "number"
        +              },
        +              "sheenGlossMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "sheenGlossMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "sheenGlossVertexColor": {
        +                "type": "boolean"
        +              },
        +              "sheenGlossVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "sheenMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "sheenMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "sheenMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "sheenMapRotation": {
        +                "type": "number"
        +              },
        +              "sheenMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "sheenMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "sheenVertexColor": {
        +                "type": "boolean"
        +              },
        +              "sheenVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "shininess": {
        +                "maximum": 100,
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "slopeDepthBias": {
        +                "type": "number"
        +              },
        +              "specular": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/ambient",
        +                "description": "RGB color [r,g,b] 0-1"
        +              },
        +              "specularAntialias": {
        +                "type": "boolean"
        +              },
        +              "specularMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "specularMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "specularMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "specularMapRotation": {
        +                "type": "number"
        +              },
        +              "specularMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "specularMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "specularTint": {
        +                "type": "boolean"
        +              },
        +              "specularVertexColor": {
        +                "type": "boolean"
        +              },
        +              "specularVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "specularityFactor": {
        +                "type": "number"
        +              },
        +              "specularityFactorMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "specularityFactorMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "specularityFactorMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "specularityFactorMapRotation": {
        +                "type": "number"
        +              },
        +              "specularityFactorMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "specularityFactorMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "specularityFactorTint": {
        +                "type": "boolean"
        +              },
        +              "specularityFactorVertexColor": {
        +                "type": "boolean"
        +              },
        +              "specularityFactorVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "sphereMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "thickness": {
        +                "type": "number"
        +              },
        +              "thicknessMap": {
        +                "$ref": "#/properties/assets/items/anyOf/3/properties/options/properties/textures/items",
        +                "description": "Nullable asset reference"
        +              },
        +              "thicknessMapChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "thicknessMapOffset": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "thicknessMapRotation": {
        +                "type": "number"
        +              },
        +              "thicknessMapTiling": {
        +                "$ref": "#/properties/assets/items/anyOf/8/properties/options/properties/data/properties/aoMapTiling",
        +                "description": "[x,y]"
        +              },
        +              "thicknessMapUv": {
        +                "maximum": 7,
        +                "minimum": 0,
        +                "type": "integer"
        +              },
        +              "thicknessVertexColor": {
        +                "type": "boolean"
        +              },
        +              "thicknessVertexColorChannel": {
        +                "enum": [
        +                  "r",
        +                  "g",
        +                  "b",
        +                  "a",
        +                  "rgb"
        +                ],
        +                "type": "string"
        +              },
        +              "twoSidedLighting": {
        +                "type": "boolean"
        +              },
        +              "useDynamicRefraction": {
        +                "type": "boolean"
        +              },
        +              "useFog": {
        +                "type": "boolean"
        +              },
        +              "useIridescence": {
        +                "type": "boolean"
        +              },
        +              "useLighting": {
        +                "type": "boolean"
        +              },
        +              "useMetalness": {
        +                "type": "boolean"
        +              },
        +              "useMetalnessSpecularColor": {
        +                "type": "boolean"
        +              },
        +              "useSheen": {
        +                "type": "boolean"
        +              },
        +              "useSkybox": {
        +                "type": "boolean"
        +              },
        +              "useTonemap": {
        +                "type": "boolean"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "material",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Script asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "data": {
        +            "additionalProperties": {},
        +            "type": "object"
        +          },
        +          "filename": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "text": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "filename"
        +        ],
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "script",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "options"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Shader asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "text": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "shader",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Sprite asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "frameKeys": {
        +            "items": {
        +              "type": [
        +                "string",
        +                "number"
        +              ]
        +            },
        +            "type": "array"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "pixelsPerUnit": {
        +            "exclusiveMinimum": 0,
        +            "type": "number"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "renderMode": {
        +            "maximum": 2,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "textureAtlas": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "sprite",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Template asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "entity": {
        +            "description": "Entity ID",
        +            "format": "uuid",
        +            "type": "string"
        +          },
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "entity"
        +        ],
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "template",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "options"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "Text asset",
        +    "properties": {
        +      "options": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "folder": {
        +            "$ref": "#/properties/assets/items/anyOf/0/properties/options/properties/folder",
        +            "description": "Asset ID"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "preload": {
        +            "type": "boolean"
        +          },
        +          "text": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": {
        +        "const": "text",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Addedcreate_branch
    • Addedcreate_build
    • Addedcreate_checkpoint
    • Addedcreate_cubemap_from_texture
    • Changedcreate_entities226 fields changed
      • changedInput schema / properties / entities / description
        Previous value: -"Array of entity hierarchies to create."New value: +"Entity hierarchies to create"
      • removedInput schema / properties / entities / items / properties / entity / properties / children / description
        Removed value: -"An array that contains the child entities. Default: []"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / description
        Previous value: -"The components of the entity and their data. Default: {}"New value: +"Entity components"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / anim
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Anim component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / animation
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Animation (legacy) component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / audiolistener / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / audiolistener / description
        Previous value: -"The data for the audio listener component."New value: +"Audio listener component"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / audiolistener / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / button
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Button component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / description
        Previous value: -"The data for the camera component."New value: +"Camera component"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / clearColor / description
        Previous value: -"The color used to clear the camera's render target. Default: [0.118, 0.118, 0.118, 1]"New value: +"Clear color"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / clearColor / items
        Previous value: -[
        -  {
        -    "description": "Red",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Green",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Blue",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Alpha",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  }
        -]New value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / clearColorBuffer / description
        Previous value: -"If true, the camera will explicitly clear its render target to the chosen clear color before rendering the scene. Default: true"New value: +"Clear color buffer"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / clearDepthBuffer / description
        Previous value: -"If true, the camera will explicitly clear the depth buffer of its render target before rendering the scene. Default: true"New value: +"Clear depth buffer"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / farClip / description
        Removed value: -"The distance in camera space from the camera's eye point to the far plane. Default: 1000"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / fov / description
        Previous value: -"The angle (in degrees) between top and bottom clip planes of a perspective camera. Default: 45"New value: +"Field of view degrees"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / frustumCulling / description
        Removed value: -"Controls the culling of mesh instances against the camera frustum. If true, culling is enabled. If false, all mesh instances in the scene are rendered by the camera, regardless of visibility. Default: true"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / gammaCorrection / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "GAMMA_NONE",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "GAMMA_SRGB",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "None",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "sRGB",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / gammaCorrection / description
        Removed value: -"The gamma correction to apply to the final color of the camera. Default: 1 (GAMMA_SRGB)"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / layers / description
        Removed value: -"An array of layer id's that this camera will render. Default: [0, 1, 2, 3, 4]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / nearClip / description
        Removed value: -"The distance in camera space from the camera's eye point to the near plane. Default: 0.1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / orthoHeight / description
        Previous value: -"The distance in world units between the top and bottom clip planes of an orthographic camera. Default: 4"New value: +"Ortho height"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / priority / description
        Removed value: -"A number that defines the order in which camera views are rendered by the engine. Smaller numbers are rendered first. Default: 0"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / projection / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "PROJECTION_PERSPECTIVE",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "PROJECTION_ORTHOGRAPHIC",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Perspective",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Orthographic",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / projection / description
        Removed value: -"The projection type of the camera. Default: 0 (PROJECTION_PERSPECTIVE)"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / rect / description
        Previous value: -"An array of 4 numbers that represents the rectangle that specifies the viewport onto the camera's attached render target. This allows you to implement features like split-screen or picture-in-picture. It is defined by normalized coordinates (0 to 1) in the following format: [The lower left x coordinate, The lower left y coordinate, The width of the rectangle, The height of the rectangle]. Default: [0, 0, 1, 1]"New value: +"Viewport rect [x,y,w,h]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / rect / items
        Previous value: -[
        -  {
        -    "description": "X",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Y",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Z",
        -    "type": "number"
        -  },
        -  {
        -    "description": "W",
        -    "type": "number"
        -  }
        -]New value: +{
        +  "type": "number"
        +}
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / renderSceneColorMap / description
        Removed value: -"If true, the camera will render the scene color map. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / renderSceneDepthMap / description
        Removed value: -"If true, the camera will render the scene depth map. Default: false"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / toneMapping / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "TONEMAP_LINEAR",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "TONEMAP_FILMIC",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "TONEMAP_HEJL",
        -    "type": "number"
        -  },
        -  {
        -    "const": 3,
        -    "description": "TONEMAP_ACES",
        -    "type": "number"
        -  },
        -  {
        -    "const": 4,
        -    "description": "TONEMAP_ACES2",
        -    "type": "number"
        -  },
        -  {
        -    "const": 5,
        -    "description": "TONEMAP_NEUTRAL",
        -    "type": "number"
        -  },
        -  {
        -    "const": 6,
        -    "description": "TONEMAP_NONE",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Linear",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Filmic",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "Hejl",
        +    "type": "number"
        +  },
        +  {
        +    "const": 3,
        +    "description": "ACES",
        +    "type": "number"
        +  },
        +  {
        +    "const": 4,
        +    "description": "ACES2",
        +    "type": "number"
        +  },
        +  {
        +    "const": 5,
        +    "description": "Neutral",
        +    "type": "number"
        +  },
        +  {
        +    "const": 6,
        +    "description": "None",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / camera / properties / toneMapping / description
        Removed value: -"The tonemapping transform to apply to the final color of the camera. Default: 0 (TONEMAP_LINEAR)"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / description
        Previous value: -"The data for the collision component."New value: +"Collision component. Requires the Ammo physics module to be enabled in the project (IMPORT AMMO) to take effect. halfExtents/radius are in LOCAL space and are multiplied by the entity world scale — size the collider via these fields rather than relying on entity scale."
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / angularOffset / description
        Previous value: -"The rotational offset of the collision shape from the Entity rotation in local space. Default: [0, 0, 0]"New value: +"[x,y,z]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / asset / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Asset ID",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / asset / description
        Previous value: -"The `id` of the model asset that will be used as a source for the triangle-based collision mesh. Default: null"New value: +"Model asset"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / axis / description
        Removed value: -"Aligns the capsule/cylinder with the local-space X, Y or Z axis of the entity. Default: 1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / convexHull / description
        Removed value: -"If true, the collision shape will be a convex hull. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / halfExtents / description
        Previous value: -"The half-extents of the collision box. This is an array of 3 numbers: local space half-width, half-height, and half-depth. Default: [0.5, 0.5, 0.5]"New value: +"Box half-extents"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / height / description
        Removed value: -"The tip-to-tip height of the capsule/cylinder. Default: 2"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / linearOffset / description
        Previous value: -"The positional offset of the collision shape from the Entity position along the local axes. Default: [0, 0, 0]"New value: +"[x,y,z]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / radius / description
        Removed value: -"The radius of the capsule/cylinder body. Default: 0.5"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / renderAsset / description
        Previous value: -"The `id` of the render asset that will be used as a source for the triangle-based collision mesh. Default: null"New value: +"Render asset"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / collision / properties / type / description
        Removed value: -"The type of collision primitive. Can be: box, sphere, capsule, cylinder, mesh. Default: \"box\""
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / description
        Previous value: -"The data for the element component."New value: +"UI element component"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / alignment / description
        Previous value: -"Horizontal and vertical alignment of the text relative to its element transform. Default: [0.5, 0.5]"New value: +"[x,y]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / anchor / description
        Previous value: -"An array of 4 numbers controlling the left, bottom, right and top anchors of the element. Default: [0.5, 0.5, 0.5, 0.5]"New value: +"[left,bottom,right,top]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / autoFitHeight / description
        Removed value: -"Automatically scale the font size to fit the element's height. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / autoFitWidth / description
        Removed value: -"Automatically scale the font size to fit the element's width. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / autoHeight / description
        Removed value: -"Automatically size height to match text content. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / autoWidth / description
        Removed value: -"Automatically size width to match text content. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / batchGroupId / description
        Removed value: -"The batch group id that this element belongs to. Default: null"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / color / description
        Previous value: -"The RGB color of the element. Default: [1, 1, 1]"New value: +"RGB color [r,g,b] 0-1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / color / items
        Previous value: -[
        -  {
        -    "description": "Red",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Green",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Blue",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  }
        -]New value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / enableMarkup / description
        Removed value: -"Enable markup processing (only for text elements). Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / fitMode / description
        Removed value: -"Set how the content should be fitted and preserve the aspect ratio. Default: \"stretch\""
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / fontAsset / description
        Previous value: -"The `id` of the font asset used by the element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / fontSize / description
        Removed value: -"The size of the font used by the element. Default: 32"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / height / description
        Removed value: -"The height of the element. Default: 32"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / key / description
        Previous value: -"The localization key of the element. Default: null"New value: +"Localization key"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / layers / description
        Removed value: -"An array of layer ids that this element belongs to. Default: [4]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / lineHeight / description
        Removed value: -"The height of each line of text. Default: 32"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / margin / description
        Previous value: -"Spacing between each edge of the element and the respective anchor. Default: [-16, -16, -16, -16]"New value: +"[x,y,z,w]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / mask / description
        Removed value: -"If true, this element acts as a mask for its children. Default: false"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / materialAsset / description
        Previous value: -"The `id` of the material asset used by this element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / maxFontSize / description
        Removed value: -"The maximum size of the font when using `autoFitWidth` or `autoFitHeight`. Default: 32"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / maxLines / description
        Removed value: -"The maximum number of lines that this element can display. Default: null"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / minFontSize / description
        Removed value: -"The minimum size of the font when using `autoFitWidth` or `autoFitHeight`. Default: 8"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / opacity / description
        Removed value: -"The opacity of the element. Default: 1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / outlineColor / description
        Previous value: -"Text outline effect color and opacity. Default: [0, 0, 0, 1]"New value: +"RGBA color [r,g,b,a] 0-1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / outlineThickness / description
        Removed value: -"Text outline effect width (0–1). Default: 0"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / pivot / description
        Previous value: -"An array of 2 numbers controlling the origin of the element. Default: [0.5, 0.5]"New value: +"[x,y]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / pivot / items
        Previous value: -[
        -  {
        -    "description": "X",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Y",
        -    "type": "number"
        -  }
        -]New value: +{
        +  "type": "number"
        +}
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / pixelsPerUnit / description
        Removed value: -"Number of pixels per PlayCanvas unit (used for 9-sliced sprites). Default: null"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / rect / description
        Previous value: -"Texture rect for the image element (u, v, width, height). Default: [0, 0, 1, 1]"New value: +"Texture rect [u,v,w,h]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / shadowColor / description
        Previous value: -"Text shadow color and opacity. Default: [0, 0, 0, 1]"New value: +"RGBA color [r,g,b,a] 0-1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / shadowOffset / description
        Previous value: -"Horizontal and vertical offset of the text shadow. Default: [0.0, 0.0]"New value: +"[x,y]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / spacing / description
        Previous value: -"The spacing between each letter of the text. Default: 1"New value: +"Letter spacing"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / spriteAsset / description
        Previous value: -"The `id` of the sprite asset to be used by the element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / spriteFrame / description
        Removed value: -"The frame from the sprite asset to render. Default: 0"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / text / description
        Removed value: -"The text content of the element. Default: \"\""
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / textureAsset / description
        Previous value: -"The `id` of the texture asset to be used by the element. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / type / description
        Removed value: -"The type of the element. Default: \"text\""
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / useInput / description
        Removed value: -"Enable this to make the element respond to input events. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / width / description
        Removed value: -"The width of the element. Default: 32"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / element / properties / wrapLines / description
        Removed value: -"Automatically wrap lines based on the element width. Default: true"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / layoutchild
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Layout child component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / layoutgroup
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Layout group component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / description
        Previous value: -"The data for the light component."New value: +"Light component"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / affectDynamic / description
        Removed value: -"If true the light will affect non-lightmapped objects. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / affectLightmapped / description
        Removed value: -"If true the light will affect lightmapped objects. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / affectSpecularity / description
        Removed value: -"If true the light will affect material specularity. For directional light only. Default: true."
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / bake / description
        Previous value: -"If true the light will be rendered into lightmaps. Default: false"New value: +"Bake to lightmap"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / bakeArea / description
        Removed value: -"If bake is enabled, specifies the directional light penumbra angle in degrees, allowing soft shadows. Default: 0"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / bakeDir / description
        Removed value: -"If true and `bake` is true, the light's direction will contribute to directional lightmaps. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / bakeNumSamples / description
        Removed value: -"If bake is enabled, specifies the number of samples used to bake this light into the lightmap. Default: 1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cascadeDistribution / description
        Removed value: -"The distribution of subdivision of the camera frustum for individual shadow cascades. Default: 0.5"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / castShadows / description
        Removed value: -"If true, the light will cause shadow casting models to cast shadows. Default: false"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / color / description
        Previous value: -"An array of 3 numbers that represents the color of the emitted light. Default: [1, 1, 1]"New value: +"RGB color [r,g,b] 0-1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cookieAngle / description
        Removed value: -"Angle for spotlight cookie rotation. Default: 0.0"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cookieAsset / description
        Previous value: -"The id of a texture asset that represents that light cookie. Default: null"New value: +"Nullable asset reference"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cookieChannel / description
        Removed value: -"Color channels of the projection texture to use. Can be \"r\", \"g\", \"b\", \"a\", \"rgb\" or any swizzled combination. Default: \"rgb\""
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cookieFalloff / description
        Removed value: -"Toggle normal spotlight falloff when projection texture is used. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cookieIntensity / description
        Removed value: -"Projection texture intensity. Default: 1.0"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cookieOffset / description
        Previous value: -"Spotlight cookie position offset. Default: [0.0, 0.0]"New value: +"[x,y]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / cookieScale / description
        Previous value: -"Spotlight cookie scale. Default: [1.0, 1.0]"New value: +"[x,y]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / falloffMode / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "LIGHTFALLOFF_LINEAR",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "LIGHTFALLOFF_INVERSESQUARED",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Linear",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "InverseSquared",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / falloffMode / description
        Removed value: -"Controls the rate at which a light attenuates from its position. Default: 0 (LIGHTFALLOFF_LINEAR)"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / innerConeAngle / description
        Removed value: -"The angle at which the spotlight cone starts to fade off (degrees). Affects spot lights only. Default: 40"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / intensity / description
        Removed value: -"The intensity of the light, this acts as a scalar value for the light's color. This value can exceed 1. Default: 1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / isStatic / description
        Removed value: -"Mark light as non-movable (optimization). Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / layers / description
        Removed value: -"An array of layer id's that this light will affect. Default: [0]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / normalOffsetBias / description
        Removed value: -"Normal offset depth bias. Default: 0.05"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / numCascades / description
        Removed value: -"Number of shadow cascades. Default: 1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / outerConeAngle / description
        Removed value: -"The angle at which the spotlight cone has faded to nothing (degrees). Affects spot lights only. Default: 45"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / range / description
        Previous value: -"The distance from the spotlight source at which its contribution falls to zero. Default: 8"New value: +"Light range"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowBias / description
        Removed value: -"Constant depth offset applied to a shadow map to eliminate artifacts. Default: 0.2"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowDistance / description
        Removed value: -"The shadow distance is the maximum distance from the camera beyond which shadows from Directional Lights are no longer visible. Default: 16"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowIntensity / description
        Removed value: -"The intensity of the shadow darkening, 1 being shadows are entirely black. Default: 1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowResolution / anyOf
        Removed value: -[
        -  {
        -    "const": 16,
        -    "description": "16x16",
        -    "type": "number"
        -  },
        -  {
        -    "const": 32,
        -    "description": "32x32",
        -    "type": "number"
        -  },
        -  {
        -    "const": 64,
        -    "description": "64x64",
        -    "type": "number"
        -  },
        -  {
        -    "const": 128,
        -    "description": "128x128",
        -    "type": "number"
        -  },
        -  {
        -    "const": 256,
        -    "description": "256x256",
        -    "type": "number"
        -  },
        -  {
        -    "const": 512,
        -    "description": "512x512",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1024,
        -    "description": "1024x1024",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2048,
        -    "description": "2048x2048",
        -    "type": "number"
        -  },
        -  {
        -    "const": 4096,
        -    "description": "4096x4096",
        -    "type": "number"
        -  }
        -]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowResolution / description
        Removed value: -"The size of the texture used for the shadow map (power of 2). Default: 1024"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowResolution / enum
        Added value: +[
        +  16,
        +  32,
        +  64,
        +  128,
        +  256,
        +  512,
        +  1024,
        +  2048,
        +  4096
        +]
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowResolution / type
        Added value: +"number"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowType / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "SHADOW_PCF3_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "SHADOW_VSM_16F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 3,
        -    "description": "SHADOW_VSM_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 4,
        -    "description": "SHADOW_PCF5_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 5,
        -    "description": "SHADOW_PCF1_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 6,
        -    "description": "SHADOW_PCSS_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 7,
        -    "description": "SHADOW_PCF1_16F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 8,
        -    "description": "SHADOW_PCF3_16F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 9,
        -    "description": "SHADOW_PCF5_16F",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "PCF3_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "VSM_16F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 3,
        +    "description": "VSM_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 4,
        +    "description": "PCF5_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 5,
        +    "description": "PCF1_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 6,
        +    "description": "PCSS_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 7,
        +    "description": "PCF1_16F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 8,
        +    "description": "PCF3_16F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 9,
        +    "description": "PCF5_16F",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowType / description
        Removed value: -"Type of shadows being rendered by this light. Default: 0 (SHADOW_PCF3_32F)"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowUpdateMode / anyOf
        Previous value: -[
        -  {
        -    "const": 1,
        -    "description": "SHADOWUPDATE_THISFRAME",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "SHADOWUPDATE_REALTIME",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 1,
        +    "description": "ThisFrame",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "Realtime",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shadowUpdateMode / description
        Removed value: -"Tells the renderer how often shadows must be updated for this light. Default: 2 (SHADOWUPDATE_REALTIME)"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shape / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "LIGHTSHAPE_PUNCTUAL",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "LIGHTSHAPE_RECT",
        -    "type": "number"
        -  },
        -  {
        -    "const": 2,
        -    "description": "LIGHTSHAPE_DISK",
        -    "type": "number"
        -  },
        -  {
        -    "const": 3,
        -    "description": "LIGHTSHAPE_SPHERE",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Punctual",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Rect",
        +    "type": "number"
        +  },
        +  {
        +    "const": 2,
        +    "description": "Disk",
        +    "type": "number"
        +  },
        +  {
        +    "const": 3,
        +    "description": "Sphere",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / shape / description
        Removed value: -"The shape of the light source. Default: 0 (LIGHTSHAPE_PUNCTUAL)"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / type / description
        Removed value: -"The type of light. Can be: directional, spot, omni. Default: \"directional\""
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / vsmBias / description
        Removed value: -"Constant depth offset applied to a shadow map to eliminate rendering artifacts like shadow acne. Default: 0.01"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / vsmBlurMode / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "BLUR_BOX",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "BLUR_GAUSSIAN",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Box",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "Gaussian",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / vsmBlurMode / description
        Removed value: -"Blurring mode for variance shadow maps. Default: 1 (BLUR_GAUSSIAN)"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / light / properties / vsmBlurSize / description
        Removed value: -"Number of samples used for blurring a variance shadow map. Only uneven numbers work, even are incremented. Minimum value is 1, maximum is 25. Default: 11"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / model
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Model (legacy) component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / particlesystem
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Particle system component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / description
        Previous value: -"The data for the render component."New value: +"Render component"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / aabbCenter / description
        Previous value: -"An array of 3 numbers controlling the center of the AABB to be used. Default: [0, 0, 0]"New value: +"[x,y,z]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / aabbHalfExtents / description
        Previous value: -"An array of 3 numbers controlling the half extents of the AABB to be used. Default: [0.5, 0.5, 0.5]"New value: +"[x,y,z]"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / asset / $ref
        Added value: +"#/properties/entities/items/properties/entity/properties/components/properties/collision/properties/asset"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / asset / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / asset / description
        Previous value: -"The `id` of the render asset for the render component (only applies to type \"asset\"). Default: null"New value: +"Render asset"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / batchGroupId / description
        Removed value: -"The batch group id that the meshes should belong to. Default: null"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / castShadows / description
        Removed value: -"If true, attached meshes will cast shadows for lights that have shadow casting enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / castShadowsLightmap / description
        Removed value: -"If true, the meshes will cast shadows when rendering lightmaps. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / isStatic / description
        Removed value: -"Mark meshes as non-movable (optimization). Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / layers / description
        Removed value: -"An array of layer id's to which the meshes should belong. Default: [0]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / lightmapSizeMultiplier / description
        Removed value: -"Lightmap resolution multiplier. Default: 1.0"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / lightmapped / description
        Removed value: -"If true, the meshes will be lightmapped after using lightmapper.bake(). Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / materialAssets / description
        Removed value: -"An array of material asset `id`s that will be used to render the meshes. Each material corresponds to the respective mesh instance. Default: []"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / materialAssets / items / $ref
        Added value: +"#/properties/entities/items/properties/entity/properties/components/properties/collision/properties/asset"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / materialAssets / items / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / receiveShadows / description
        Removed value: -"If true, shadows will be cast on attached meshes. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / rootBone / description
        Removed value: -"The `resource_id` of the entity to be used as the root bone for any skinned meshes that are rendered by this component. Default: null"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / render / properties / type / description
        Removed value: -"The type of the render component. Can be: asset, box, capsule, cone, cylinder, plane, sphere. Default: \"asset\""
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / description
        Previous value: -"The data for the rigidbody component."New value: +"Rigidbody component. Requires the Ammo physics module to be enabled in the project (IMPORT AMMO); without it the body will not simulate. Usually paired with a collision component."
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / angularDamping / description
        Removed value: -"Controls the rate at which a body loses angular velocity over time. Default: 0"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / angularFactor / description
        Previous value: -"An array of 3 numbers that represents the scaling factor for angular movement of the body in each axis. Default: [1, 1, 1]"New value: +"[x,y,z]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / friction / description
        Removed value: -"The friction value used when contacts occur between two bodies. Default: 0.5"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / linearDamping / description
        Removed value: -"Controls the rate at which a body loses linear velocity over time. Default: 0"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / linearFactor / description
        Previous value: -"An array of 3 numbers that represents the scaling factor for linear movement of the body in each axis. Default: [1, 1, 1]"New value: +"[x,y,z]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / mass / description
        Removed value: -"The mass of the body. Default: 1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / restitution / description
        Previous value: -"The amount of energy lost when two objects collide, this determines the bounciness of the object. Default: 0.5"New value: +"Bounciness"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / rigidbody / properties / type / description
        Removed value: -"The type of RigidBody determines how it is simulated. Can be one of: static, dynamic, kinematic. Default: \"static\""
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / description
        Previous value: -"The data for the screen component."New value: +"Screen component"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / properties / priority / description
        Removed value: -"Determines the order in which Screen components in the same layer are rendered (higher priority is rendered on top). Number must be an integer between 0 and 127. Default: 0"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / properties / referenceResolution / description
        Previous value: -"An array of 2 numbers that represents the reference resolution of the screen. If the window size changes the screen will adjust its size based on `scaleMode` using the reference resolution. Default: [1280, 720]"New value: +"[x,y]"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / properties / resolution / description
        Previous value: -"An array of 2 numbers that represents the resolution of the screen. Default: [1280, 720]"New value: +"[x,y]"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / properties / scaleBlend / description
        Removed value: -"Set this to 0 to only adjust to changes between the width of the window and the x of the reference resolution. Set this to 1 to only adjust to changes between the window height and the y of the reference resolution. A value in the middle will try to adjust to both. Default: 0.5"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / properties / scaleMode / description
        Removed value: -"Controls how a screen-space screen is resized when the window size changes. Can be: `pc.SCALEMODE_BLEND`: Use it to have the screen adjust between the difference of the window resolution and the screen's reference resolution. `pc.SCALEMODE_NONE`: Use it to make the screen always have a size equal to its resolution. Default: \"blend\""
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / screen / properties / screenSpace / description
        Previous value: -"If true then the screen will display its child Elements in 2D. Set this to false to make this a 3D screen. Default: true"New value: +"2D screen mode"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / description
        Previous value: -"The data for the script component."New value: +"Script component"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / properties / order / description
        Previous value: -"An array of script names in the order in which they should be executed at runtime. Default: []"New value: +"Script execution order"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / properties / scripts / additionalProperties / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / properties / scripts / additionalProperties / properties / attributes / additionalProperties / description
        Previous value: -"A dictionary that holds the values of each attribute. The keys in the dictionary are the attribute names."New value: +"Script attribute values"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / properties / scripts / additionalProperties / properties / attributes / description
        Removed value: -"A dictionary that holds the values of each attribute. The keys in the dictionary are the attribute names. Default: {}"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / properties / scripts / additionalProperties / properties / enabled / description
        Removed value: -"Whether the script instance is enabled. Default: true"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / script / properties / scripts / description
        Previous value: -"A dictionary that contains all the scripts attached to this script component. Each key in the dictionary is the script name. Default: {}"New value: +"Script instances"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / scrollbar
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Scrollbar component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / scrollview
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Scroll view component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / description
        Previous value: -"The data for the sound component."New value: +"Sound component"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / distanceModel / description
        Removed value: -"Determines which algorithm to use to reduce the volume of the audio as it moves away from the listener. Can be one of: \"inverse\", \"linear\", \"exponential\". Default: \"linear\""
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / enabled / description
        Removed value: -"Whether the component is enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / maxDistance / description
        Removed value: -"The maximum distance from the listener at which audio falloff stops. Note the volume of the audio is not 0 after this distance, but just doesn't fall off anymore. Default: 10000"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / pitch / description
        Removed value: -"The pitch to playback the audio at. A value of 1 means the audio is played back at the original pitch. The pitch of each slot is multiplied with this value. Default: 1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / positional / description
        Previous value: -"If true, the component will play back audio assets as if played from the location of the entity in 3D space. Default: true"New value: +"3D audio"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / refDistance / description
        Removed value: -"The reference distance for reducing volume as the sound source moves further from the listener. Default: 1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / rollOffFactor / description
        Removed value: -"The rate at which volume fall-off occurs. Default: 1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / asset / description
        Previous value: -"The `id` of the audio asset that can be played from this sound slot. Default: null"New value: +"Audio asset"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / autoPlay / description
        Removed value: -"If true, the slot will be played on load. Otherwise, sound slots will need to be played by scripts. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / duration / description
        Removed value: -"The duration of the sound that the slot will play starting from startTime. Default: null"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / loop / description
        Removed value: -"If true, the slot will loop playback continuously. Otherwise, it will be played once to completion. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / name / description
        Removed value: -"The name of the sound slot. Default: \"Slot 1\""
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / overlap / description
        Removed value: -"If true then sounds played from slot will be played independently of each other. Otherwise the slot will first stop the current sound before starting the new one. Default: false"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / pitch / description
        Removed value: -"The pitch to playback the audio at. A value of 1 means the audio is played back at the original pitch. Default: 1"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / startTime / description
        Removed value: -"The start time from which the sound will start playing. Default: 0"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / additionalProperties / properties / volume / description
        Removed value: -"The volume modifier to play the audio with. Default: 1"
      • changedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / slots / description
        Previous value: -"A dictionary of sound slots. Each sound slot controls playback of an audio asset. Each key in the dictionary is a number representing the index of each sound slot."New value: +"Sound slots"
      • removedInput schema / properties / entities / items / properties / entity / properties / components / properties / sound / properties / volume / description
        Removed value: -"The volume modifier to play the audio with. The volume of each slot is multiplied with this value. Default: 1"
      • addedInput schema / properties / entities / items / properties / entity / properties / components / properties / sprite
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Sprite component (loosely typed; pass any valid component fields)",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / entities / items / properties / entity / properties / enabled / description
        Removed value: -"Whether the entity is enabled. Default: true"
      • removedInput schema / properties / entities / items / properties / entity / properties / name / description
        Removed value: -"The name of the entity. Default: \"Untitled\""
      • changedInput schema / properties / entities / items / properties / entity / properties / position / description
        Previous value: -"The position of the entity in local space (x, y, z). Default: [0, 0, 0]"New value: +"Local position"
      • changedInput schema / properties / entities / items / properties / entity / properties / position / items
        Previous value: -[
        -  {
        -    "description": "X",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Y",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Z",
        -    "type": "number"
        -  }
        -]New value: +{
        +  "type": "number"
        +}
      • changedInput schema / properties / entities / items / properties / entity / properties / rotation / description
        Previous value: -"The rotation of the entity in local space (rx, ry, rz euler angles in degrees). Default: [0, 0, 0]"New value: +"Local rotation (euler degrees)"
      • changedInput schema / properties / entities / items / properties / entity / properties / scale / description
        Previous value: -"The scale of the entity in local space (sx, sy, sz). Default: [1, 1, 1]"New value: +"Local scale"
      • removedInput schema / properties / entities / items / properties / entity / properties / tags / description
        Removed value: -"The tags of the entity. Default: []"
      • changedInput schema / properties / entities / items / properties / parent / description
        Previous value: -"The parent entity to create the entity under. If not provided, the root entity will be used."New value: +"Parent entity resource_id. Omit to create under the scene root."
    • Addedcreate_scene
    • Addedcreate_texture_atlas
    • Changeddelete_assets6 fields changed
      • removedInput schema / properties / ids / description
        Removed value: -"The asset IDs of the assets to delete"
      • removedInput schema / properties / ids / items / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / ids / items / description
        Previous value: -"An asset ID."New value: +"Asset ID"
      • addedInput schema / properties / ids / items / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / ids / items / type
        Added value: +"integer"
      • addedInput schema / properties / rejectReferenced
        Added value: +{
        +  "description": "Fail before deletion if any asset is referenced",
        +  "type": "boolean"
        +}
    • Addeddelete_branch
    • Addeddelete_build
    • Changeddelete_entities2 fields changed
      • removedInput schema / properties / ids / description
        Removed value: -"Array of entity IDs to delete. The root entity cannot be deleted."
      • changedInput schema / properties / ids / items / description
        Previous value: -"An entity ID."New value: +"Entity ID"
    • Addeddelete_scene
    • Addeddiff_checkpoints
    • Addeddownload_asset
    • Addeddownload_build
    • Addedduplicate_assets
    • Changedduplicate_entities3 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Array of entity IDs to duplicate. The root entity cannot be duplicated."New value: +"Entity resource_ids to duplicate"
      • changedInput schema / properties / ids / items / description
        Previous value: -"An entity ID."New value: +"Entity ID"
      • addedInput schema / properties / rename / description
        Added value: +"Auto-rename duplicates to keep names unique"
    • Addedduplicate_scene
    • Addedfind_entities_by_script
    • Addedfocus_camera
    • Addedfocus_viewport
    • Addedgenerate_texture_metadata
    • Addedget_anim_state_graph
    • Addedget_animation_events
    • Addedget_asset
    • Addedget_asset_references
    • Addedget_asset_text
    • Addedget_build
    • Addedget_checkpoint
    • Addedget_conflict_file
    • Addedget_entity
    • Addedget_merge
    • Addedget_scene
    • Addedget_selection
    • Addedget_template_overrides
    • Addedhard_reset_checkpoint
    • Addedinject_input
    • Changedinstantiate_template_assets7 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"The asset IDs of the template assets to instantiate"New value: +"Template asset ids to instantiate"
      • removedInput schema / properties / ids / items / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / ids / items / description
        Previous value: -"An asset ID."New value: +"Asset ID"
      • addedInput schema / properties / ids / items / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / ids / items / type
        Added value: +"integer"
      • addedInput schema / properties / index
        Added value: +{
        +  "description": "Insertion index under the parent",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / parentId
        Added value: +{
        +  "description": "Parent entity resource_id; defaults to the scene root",
        +  "format": "uuid",
        +  "type": "string"
        +}
    • Addedlaunch_start
    • Addedlaunch_stop
    • Changedlist_assets7 fields changed
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Return full asset JSON instead of the compact summary (much larger)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max assets to return (default 50)",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Filter by name (case-insensitive contains)",
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Number of assets to skip (use nextCursor from a previous page)",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / tag
        Added value: +{
        +  "description": "Filter by tag",
        +  "type": "string"
        +}
      • changedInput schema / properties / type / description
        Previous value: -"The type of assets to list. If not specified, all assets will be listed."New value: +"Filter by asset type"
      • changedInput schema / properties / type / enum
        Previous value: -[
        -  "css",
        -  "cubemap",
        -  "folder",
        -  "font",
        -  "html",
        -  "json",
        -  "material",
        -  "render",
        -  "script",
        -  "shader",
        -  "template",
        -  "text",
        -  "texture"
        -]New value: +[
        +  "animation",
        +  "animstategraph",
        +  "audio",
        +  "binary",
        +  "bundle",
        +  "container",
        +  "css",
        +  "cubemap",
        +  "folder",
        +  "font",
        +  "gsplat",
        +  "html",
        +  "json",
        +  "material",
        +  "model",
        +  "render",
        +  "scene",
        +  "script",
        +  "shader",
        +  "sprite",
        +  "template",
        +  "text",
        +  "texture",
        +  "textureatlas",
        +  "wasm"
        +]
    • Addedlist_branches
    • Addedlist_builds
    • Addedlist_checkpoints
    • Changedlist_entities6 fields changed
      • addedInput schema / properties / component
        Added value: +{
        +  "description": "Filter to entities that have this component",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Return full entity JSON instead of the compact summary (much larger)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Max entities to return (default 50)",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Filter by name (case-insensitive contains)",
        +  "type": "string"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Number of entities to skip (use nextCursor from a previous page)",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / tag
        Added value: +{
        +  "description": "Filter by tag",
        +  "type": "string"
        +}
    • Addedlist_scenes
    • Addedlist_store_licenses
    • Addedload_scene
    • Addedmodify_anim_state_graph
    • Addedmodify_animation_events
    • Addedmodify_assets
    • Addedmodify_bundle_asset
    • Changedmodify_entities6 fields changed
      • removedInput schema / properties / edits / description
        Removed value: -"An array of objects containing the ID of the entity to modify, the path to the property to modify, and the value to set the property to."
      • removedInput schema / properties / edits / items / additionalProperties
        Removed value: -false
      • addedInput schema / properties / edits / items / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "description": "Entity ID",
        +        "format": "uuid",
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "set",
        +        "description": "Defaults to set",
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Property path in dot notation, e.g. \"position\", \"components.light.intensity\"",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "value": {
        +        "description": "Vectors are arrays, e.g. position [0,1,0]."
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "path",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "id": {
        +        "$ref": "#/properties/edits/items/anyOf/0/properties/id"
        +      },
        +      "op": {
        +        "const": "unset",
        +        "type": "string"
        +      },
        +      "path": {
        +        "description": "Component property path in dot notation",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "path",
        +      "op"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / edits / items / properties
        Removed value: -{
        -  "id": {
        -    "description": "An entity ID.",
        -    "format": "uuid",
        -    "type": "string"
        -  },
        -  "path": {
        -    "description": "The path to the property to modify. Use dot notation to access nested properties.",
        -    "type": "string"
        -  },
        -  "value": {
        -    "description": "The value to set the property to."
        -  }
        -}
      • removedInput schema / properties / edits / items / required
        Removed value: -[
        -  "id",
        -  "path"
        -]
      • removedInput schema / properties / edits / items / type
        Removed value: -"object"
    • Addedmodify_project_settings
    • Changedmodify_scene_settings51 fields changed
      • changedInput schema / properties / settings / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / settings / description
        Previous value: -"Scene settings."New value: +"Scene settings"
      • changedInput schema / properties / settings / properties / physics / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / settings / properties / physics / description
        Previous value: -"Physics related settings for the scene."New value: +"Physics settings"
      • changedInput schema / properties / settings / properties / physics / properties / gravity / description
        Previous value: -"An array of 3 numbers that represents the gravity force. Default: [0, -9.8, 0]"New value: +"Gravity force"
      • changedInput schema / properties / settings / properties / physics / properties / gravity / items
        Previous value: -[
        -  {
        -    "description": "X",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Y",
        -    "type": "number"
        -  },
        -  {
        -    "description": "Z",
        -    "type": "number"
        -  }
        -]New value: +{
        +  "type": "number"
        +}
      • changedInput schema / properties / settings / properties / render / additionalProperties
        Previous value: -falseNew value: +true
      • changedInput schema / properties / settings / properties / render / description
        Previous value: -"Render related settings for the scene."New value: +"Render settings"
      • removedInput schema / properties / settings / properties / render / properties / ambientBake / description
        Removed value: -"Enable baking the ambient lighting into lightmaps. Default: false."
      • removedInput schema / properties / settings / properties / render / properties / ambientBakeNumSamples / description
        Removed value: -"Number of samples to use when baking ambient. Default: 1."
      • removedInput schema / properties / settings / properties / render / properties / ambientBakeOcclusionBrightness / description
        Removed value: -"Specifies the ambient occlusion brightness. Typical range is -1 to 1. Default: 0."
      • removedInput schema / properties / settings / properties / render / properties / ambientBakeOcclusionContrast / description
        Removed value: -"Specifies the ambient occlusion contrast. Typical range is -1 to 1. Default: 0."
      • removedInput schema / properties / settings / properties / render / properties / ambientBakeSpherePart / description
        Removed value: -"How much of the sphere to include when baking ambient. Default: 0.4."
      • removedInput schema / properties / settings / properties / render / properties / clusteredLightingEnabled / description
        Removed value: -"Enable the clustered lighting. Default: true."
      • removedInput schema / properties / settings / properties / render / properties / exposure / description
        Removed value: -"The exposure value tweaks the overall brightness of the scene. Default: 1.0."
      • removedInput schema / properties / settings / properties / render / properties / fog / description
        Removed value: -"The type of fog used in the scene. Can be one of `pc.FOG_NONE`, `pc.FOG_LINEAR`, `pc.FOG_EXP`, `pc.FOG_EXP2`. Default: `none`."
      • changedInput schema / properties / settings / properties / render / properties / fog_color / description
        Previous value: -"An array of 3 numbers representing the color of the fog. Default: [0.0, 0.0, 0.0]."New value: +"RGB color [r,g,b] 0-1"
      • changedInput schema / properties / settings / properties / render / properties / fog_color / items
        Previous value: -[
        -  {
        -    "description": "Red",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Green",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Blue",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  }
        -]New value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • removedInput schema / properties / settings / properties / render / properties / fog_density / description
        Removed value: -"The density of the fog. This property is only valid if the fog property is set to `pc.FOG_EXP` or `pc.FOG_EXP2`. Default: 0.01."
      • removedInput schema / properties / settings / properties / render / properties / fog_end / description
        Removed value: -"The distance from the viewpoint where linear fog reaches its maximum. This property is only valid if the fog property is set to `pc.FOG_LINEAR`. Default: 1000.0."
      • removedInput schema / properties / settings / properties / render / properties / fog_start / description
        Removed value: -"The distance from the viewpoint where linear fog begins. This property is only valid if the fog property is set to `pc.FOG_LINEAR`. Default: 1.0."
      • changedInput schema / properties / settings / properties / render / properties / gamma_correction / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "GAMMA_NONE",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "GAMMA_SRGB",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "None",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "sRGB",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / settings / properties / render / properties / gamma_correction / description
        Removed value: -"The gamma correction to apply when rendering the scene. Default: 1 (GAMMA_SRGB)."
      • changedInput schema / properties / settings / properties / render / properties / global_ambient / description
        Previous value: -"An array of 3 numbers representing the color of the scene's ambient light. Default: [0.2, 0.2, 0.2]."New value: +"Ambient light color"
      • removedInput schema / properties / settings / properties / render / properties / lightingAreaLightsEnabled / description
        Removed value: -"Cluster lights support area lights. Default: false."
      • changedInput schema / properties / settings / properties / render / properties / lightingCells / description
        Previous value: -"Number of cells along each world-space axis the space containing lights is subdivided into. Default: [10, 3, 10]."New value: +"[x,y,z]"
      • removedInput schema / properties / settings / properties / render / properties / lightingCookieAtlasResolution / description
        Removed value: -"Resolution of the atlas texture storing all non-directional cookie textures. Default: 2048."
      • removedInput schema / properties / settings / properties / render / properties / lightingCookiesEnabled / description
        Removed value: -"Cluster lights support cookies. Default: false."
      • removedInput schema / properties / settings / properties / render / properties / lightingMaxLightsPerCell / description
        Removed value: -"Maximum number of lights a cell can store. Default: 255."
      • removedInput schema / properties / settings / properties / render / properties / lightingShadowAtlasResolution / description
        Removed value: -"Resolution of the atlas texture storing all non-directional shadow textures. Default: 2048."
      • changedInput schema / properties / settings / properties / render / properties / lightingShadowType / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "SHADOW_PCF3_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 4,
        -    "description": "SHADOW_PCF5_32F",
        -    "type": "number"
        -  },
        -  {
        -    "const": 5,
        -    "description": "SHADOW_PCF1_32F",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "PCF3_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 4,
        +    "description": "PCF5_32F",
        +    "type": "number"
        +  },
        +  {
        +    "const": 5,
        +    "description": "PCF1_32F",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / settings / properties / render / properties / lightingShadowType / description
        Removed value: -"The type of shadow filtering used by all shadows. Default: 0 (SHADOW_PCF3_32F)."
      • removedInput schema / properties / settings / properties / render / properties / lightingShadowsEnabled / description
        Removed value: -"Cluster lights support shadows. Default: true."
      • removedInput schema / properties / settings / properties / render / properties / lightmapFilterEnabled / description
        Removed value: -"Enable filtering of lightmaps. Default: false."
      • removedInput schema / properties / settings / properties / render / properties / lightmapFilterRange / description
        Removed value: -"A range parameter of the bilateral filter. Default: 10."
      • removedInput schema / properties / settings / properties / render / properties / lightmapFilterSmoothness / description
        Removed value: -"A spatial parameter of the bilateral filter. Default: 0.2."
      • removedInput schema / properties / settings / properties / render / properties / lightmapMaxResolution / description
        Removed value: -"The maximum lightmap resolution. Default: 2048."
      • changedInput schema / properties / settings / properties / render / properties / lightmapMode / anyOf
        Previous value: -[
        -  {
        -    "const": 0,
        -    "description": "BAKE_COLOR",
        -    "type": "number"
        -  },
        -  {
        -    "const": 1,
        -    "description": "BAKE_COLORDIR",
        -    "type": "number"
        -  }
        -]New value: +[
        +  {
        +    "const": 0,
        +    "description": "Color",
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "description": "ColorDir",
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / settings / properties / render / properties / lightmapMode / description
        Removed value: -"The lightmap baking mode. Default: 1 (BAKE_COLORDIR)."
      • removedInput schema / properties / settings / properties / render / properties / lightmapSizeMultiplier / description
        Removed value: -"The lightmap resolution multiplier. Default: 16."
      • changedInput schema / properties / settings / properties / render / properties / skyCenter / description
        Previous value: -"An array of 3 numbers representing the center of the sky mesh. Default: [0.0, 0.1, 0.0]."New value: +"[x,y,z]"
      • changedInput schema / properties / settings / properties / render / properties / skyMeshPosition / description
        Previous value: -"An array of 3 numbers representing the position of the sky mesh. Default: [0.0, 0.0, 0.0]."New value: +"[x,y,z]"
      • changedInput schema / properties / settings / properties / render / properties / skyMeshRotation / description
        Previous value: -"An array of 3 numbers representing the rotation of the sky mesh. Default: [0.0, 0.0, 0.0]."New value: +"[x,y,z]"
      • changedInput schema / properties / settings / properties / render / properties / skyMeshScale / description
        Previous value: -"An array of 3 numbers representing the scale of the sky mesh. Default: [100.0, 100.0, 100.0]."New value: +"[x,y,z]"
      • removedInput schema / properties / settings / properties / render / properties / skyType / description
        Removed value: -"Type of skybox projection. Default: `infinite`."
      • changedInput schema / properties / settings / properties / render / properties / skybox / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Asset ID",
        +    "exclusiveMinimum": 0,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / settings / properties / render / properties / skybox / description
        Previous value: -"The `id` of the cubemap texture to be used as the scene's skybox. Default: null."New value: +"Skybox cubemap"
      • removedInput schema / properties / settings / properties / render / properties / skyboxIntensity / description
        Removed value: -"Multiplier for skybox intensity. Default: 1."
      • removedInput schema / properties / settings / properties / render / properties / skyboxMip / description
        Removed value: -"The mip level of the skybox to be displayed. Only valid for prefiltered cubemap skyboxes. Default: 0."
      • changedInput schema / properties / settings / properties / render / properties / skyboxRotation / description
        Previous value: -"An array of 3 numbers representing the rotation of the skybox. Default: [0, 0, 0]."New value: +"[x,y,z]"
      • removedInput schema / properties / settings / properties / render / properties / tonemapping / description
        Removed value: -"The tonemapping transform to apply when writing fragments to the frame buffer. Default: 0."
    • Addedmodify_settings
    • Addedmodify_sprite_asset
    • Addedmove_assets
    • Addedmove_entity_script
    • Addedmy_assets_import
    • Addedmy_assets_search
    • Addedopen_branch
    • Addedprefilter_cubemap
    • Addedprocess_font_asset
    • Addedprocess_texture_variants
    • Addedquery_project_settings
    • Addedquery_runtime_state
    • Changedquery_scene_settings2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedquery_settings
    • Addedquery_viewport_state
    • Addedquery_viewport_visibility
    • Addedread_editor_logs
    • Addedread_runtime_logs
    • Addedredo
    • Addedreimport_assets
    • Changedremove_components5 fields changed
      • removedInput schema / properties / components / description
        Removed value: -"Array of component names to remove from the entity."
      • addedInput schema / properties / components / items / description
        Added value: +"Editor component type"
      • removedInput schema / properties / components / items / enum
        Removed value: -[
        -  "anim",
        -  "animation",
        -  "audiolistener",
        -  "button",
        -  "camera",
        -  "collision",
        -  "element",
        -  "layoutchild",
        -  "layoutgroup",
        -  "light",
        -  "model",
        -  "particlesystem",
        -  "render",
        -  "rigidbody",
        -  "screen",
        -  "script",
        -  "scrollbar",
        -  "scrollview",
        -  "sound",
        -  "sprite"
        -]
      • addedInput schema / properties / components / items / minLength
        Added value: +1
      • changedInput schema / properties / id / description
        Previous value: -"An entity ID."New value: +"Entity ID"
    • Addedremove_entity_scripts
    • Addedrename_scene
    • Changedreparent_entity9 fields changed
      • changedInput schema / properties / id / description
        Previous value: -"An entity ID."New value: +"Entity ID"
      • addedInput schema / properties / index / description
        Added value: +"Insertion index among the parent's children"
      • addedInput schema / properties / index / minimum
        Added value: +0
      • changedInput schema / properties / index / type
        Previous value: -"number"New value: +"integer"
      • removedInput schema / properties / parent / $ref
        Removed value: -"#/properties/id"
      • addedInput schema / properties / parent / description
        Added value: +"New parent entity resource_id"
      • addedInput schema / properties / parent / format
        Added value: +"uuid"
      • addedInput schema / properties / parent / type
        Added value: +"string"
      • addedInput schema / properties / preserveTransform / description
        Added value: +"Keep the same world transform after reparenting"
    • Addedreplace_asset
    • Addedresolve_conflicts
    • Addedresolve_entities
    • Addedrestore_checkpoint
    • Addedrevert_template_overrides
    • Changedscript_parse1 field changed
      • addedInput schema / properties / assetId / description
        Added value: +"Script asset id"
    • Addedsearch_entities
    • Addedset_asset_text
    • Changedset_material_diffuse6 fields changed
      • removedInput schema / properties / assetId / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / assetId / description
        Previous value: -"An asset ID."New value: +"Asset ID"
      • addedInput schema / properties / assetId / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / assetId / type
        Added value: +"integer"
      • changedInput schema / properties / color / description
        Previous value: -"A 3-channel RGB color"New value: +"RGB color [r,g,b] 0-1"
      • changedInput schema / properties / color / items
        Previous value: -[
        -  {
        -    "description": "Red",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Green",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  },
        -  {
        -    "description": "Blue",
        -    "maximum": 1,
        -    "minimum": 0,
        -    "type": "number"
        -  }
        -]New value: +{
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
    • Addedset_material_properties
    • Addedset_primary_build
    • Changedset_script_text2 fields changed
      • addedInput schema / properties / assetId / description
        Added value: +"Script asset id"
      • addedInput schema / properties / text / description
        Added value: +"Full JavaScript/TypeScript source of the script"
    • Addedset_selection
    • Addedset_transform_gizmo
    • Addedset_viewport_state
    • Addedset_viewport_visibility
    • Addedsketchfab_get
    • Addedsketchfab_import
    • Addedsketchfab_search
    • Addedstart_merge
    • Changedstore_download4 fields changed
      • addedInput schema / properties / folder
        Added value: +{
        +  "description": "Asset ID",
        +  "exclusiveMinimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / id / description
        Added value: +"Store asset id (from store_search)"
      • addedInput schema / properties / license / description
        Added value: +"License info from store_get"
      • addedInput schema / properties / name / description
        Added value: +"Name for the imported asset"
    • Changedstore_get1 field changed
      • addedInput schema / properties / id / description
        Added value: +"Store asset id (from store_search)"
    • Changedstore_search8 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Max results to return"
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / order / description
        Added value: +"Sort order"
      • addedInput schema / properties / search / description
        Added value: +"Search keywords"
      • addedInput schema / properties / skip / description
        Added value: +"Number of results to skip (pagination)"
      • addedInput schema / properties / skip / minimum
        Added value: +0
      • changedInput schema / properties / skip / type
        Previous value: -"number"New value: +"integer"
    • Addedswitch_branch
    • Addedundo
    • Addedunlink_template_instances
    • Addedunwrap_model_asset
    • Addedupload_assets
    • Addedvcs_status
  2. 21 tool updatesv1.0.0
    • First observedadd_components
    • First observedadd_script_component_script
    • First observedcreate_assets
    • First observedcreate_entities
    • First observeddelete_assets
    • First observeddelete_entities
    • First observedduplicate_entities
    • First observedinstantiate_template_assets
    • First observedlist_assets
    • First observedlist_entities
    • First observedmodify_entities
    • First observedmodify_scene_settings
    • First observedquery_scene_settings
    • First observedremove_components
    • First observedreparent_entity
    • First observedscript_parse
    • First observedset_material_diffuse
    • First observedset_script_text
    • First observedstore_download
    • First observedstore_get
    • First observedstore_search

TDQS

A3.7/5.0
Disambiguation4/5

Nearly every tool has a clearly distinct purpose, reinforced by explicit 'When NOT to use' cross-references that route agents to the correct alternative. A few overlapping clusters remain — query_settings/query_project_settings/modify_settings and the three script-attachment tools (attach_script, add_script_component_script, add_entity_scripts) — but the descriptions largely resolve the ambiguity.

Naming Consistency4/5

The dominant snake_case verb_noun pattern (create_branch, delete_entities, load_scene, capture_viewport) is highly consistent across the vast majority of tools. Minor deviations exist for external-service tools (store_search, sketchfab_get, my_assets_search, script_parse, vcs_status) which follow a noun-first convention, creating a recognizable but inconsistent sub-pattern.

Tool Count2/5

At 124 tools, this far exceeds the 25+ 'too many' threshold, making agent tool selection, context management, and effective routing impractical. While the broad game-editor domain justifies more tools than a typical server, the count is excessive and several clusters (texture processing, settings scopes, asset text operations) could be consolidated into parameterized operations.

Completeness5/5

The tool surface provides full lifecycle coverage for every editor subsystem: VCS (branches/checkpoints/merges), entities/components/scripts, assets/materials/textures/animation, scenes, settings, builds, store/Sketchfab imports, template overrides, and runtime testing. There are no obvious dead ends — every major workflow has create/read/update/delete or equivalent operations.

Maintenance

ActivityActive
ResponsivenessSlow

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/playcanvas/editor-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server