Skip to content

Tool reference

Every tool an agent can call on a default install: 474 tools in 44 domains. This page is generated from the MCP server source, so it matches the code it ships with.

The server starts with 7 tools. An agent finds the rest with hayba_search_tools and calls them with hayba_invoke. How Code Mode works.

474 tools

Startup and discovery 8

get_tool_signature

Registered at startup.

Return the JSON schema (params, return shape, cost) for a specific HaybaOS command. Call list_tool_categories first to find command names.

ParameterTypeRequiredDescription
command string Required Exact command name, e.g. "actor_spawn"

hayba_check_ue_status

Registered at startup.

Check whether the Unreal editor bridge is reachable and report its current identity and status.

No parameters.

hayba_introspect

Introspect UE reflection: editor-property names+types of a class/struct, member values of an enum, or input/output pin labels of a PCG node (by graph+node) or settings class. Kills trial-and-error API discovery.

ParameterTypeRequiredDescription
target string Optional What to introspect. For mode="class"/"enum": a Python-visible name (e.g. "Rotator", "StaticMeshComponent", "ECollisionEnabled") or a full class path. For mode="pcg_node": ignored unless settings_class is omitted.
mode "class" | "enum" | "pcg_node" | "auto" Optional class = editor properties; enum = member names+values; pcg_node = pin labels of a node; auto = guess from target. Default: "auto".
pcg_graph string Optional PCG graph asset path (mode="pcg_node"). Use with node_id.
node_id string Optional Node title/name within the PCG graph (mode="pcg_node").
settings_class string Optional PCG settings class name (e.g. "PCGSurfaceSamplerSettings") — introspect pins WITHOUT an existing graph node.

hayba_invoke

Registered at startup.

CALL ANY TOOL BY NAME, whether or not its pack is loaded — the whole catalogue is reachable through here. Pair with hayba_search_tools when you do not know the name. USE_WHEN: any call into an unloaded domain, which is most of them. NOT_WHEN: you are making many calls into one domain — hayba_pack_load gives you native schemas.

ParameterTypeRequiredDescription
name string Required
args object (map) Optional Default: {}.
via "ts" | "ue_legacy" Optional Dispatch route. "ts" (default) looks the tool up in the TS captured map. "ue_legacy" calls executeCommand(name, args) directly against the UE plugin — only commands marked agent_callable:true in legacy-commands/sidecar.json are accepted. Default: "ts".
idempotency_key string Optional Retry identity for a mutation. This is envelope metadata, never forwarded as a tool parameter. Requires an authenticated MCP principal; receipts are process-local and expire.

hayba_pack_list

Registered at startup.

List the tool packs — domain packs group one subsystem, workflow packs bundle a task across subsystems. Shows tool counts and which are loaded. USE_WHEN: you want the map of what exists. NOT_WHEN: you want a specific capability — hayba_search_tools is faster than reading the map.

No parameters.

hayba_pack_load

Registered at startup.

Register a pack natively so its tools appear in your tool list with full schemas. This is an OPTIMISATION for repeated use, not a prerequisite: hayba_invoke already calls any tool without it. USE_WHEN: you are about to make several calls into one domain. NOT_WHEN: one-off call — just invoke it.

ParameterTypeRequiredDescription
name string Required

hayba_search_tools

Registered at startup.

FIND A TOOL BY DESCRIBING WHAT YOU WANT, in plain language ("make a menu widget", "why is my landscape flat"). Searches the FULL catalogue, including the tools that are not registered yet — most of them are not, by design. Returns tool names you can pass straight to hayba_invoke without loading anything. USE_WHEN: you do not already know the exact tool name. NOT_WHEN: you know the name — just hayba_invoke it.

ParameterTypeRequiredDescription
query string Required
k integer Optional
filterPack string Optional

list_tool_categories

Registered at startup.

List all HaybaOS command domains and their commands. Call this first to discover what is available before requesting a specific schema.

No parameters.

Actors 22

actor_batch_spawn

Spawn many actors in ONE call from an array of {class_path, location?, rotation?, scale?, label?}. Prefer this over repeated actor_spawn: one round trip and one transaction instead of N.

ParameterTypeRequiredDescription
actors any[] Required array of {class_path, location?, rotation?, scale?, label?}

actor_batch_transform

Transform many actors in one call: each entry sets absolute location/rotation/scale (omitted fields unchanged). Returns per-actor before/after read-back. Undo granularity follows the editor default (one python exec).

ParameterTypeRequiredDescription
transforms object[] Required Per-actor transform edits; each omitted field is left unchanged

actor_call_function

Call a BlueprintCallable UFunction on an actor by name, with arguments. The escape hatch for behaviour no dedicated tool exposes — powerful and unvalidated, so it is gated by Plan Mode.

ParameterTypeRequiredDescription
actor_id string Required
function_name string Required
args object (map) Optional

actor_delete

Destroy an actor in the active level.

ParameterTypeRequiredDescription
actor_id string Required

actor_duplicate

Copy an existing actor, optionally placing the copy at a new transform. Keeps the source's properties, so it is the cheap way to repeat a configured actor rather than spawning and re-setting everything.

ParameterTypeRequiredDescription
actor_id string Required
location any[] Optional
rotation any[] Optional
scale any[] Optional
label string Optional

actor_find

Query level actors by label substring, exact class, tag, and/or a spatial radius around a point. Paginated. Returns {actors[], total, has_more}.

ParameterTypeRequiredDescription
label_contains string Optional Case-insensitive substring match on the actor label
class_name string Optional Exact class name filter, e.g. "StaticMeshActor"
tag string Optional Exact actor tag filter
near number[] Optional [x,y,z] centre for a spatial radius filter
radius_cm number Optional Radius in cm around `near` (requires `near`)
limit integer Optional Max actors returned (pagination) Default: 100.
offset integer Optional Pagination offset Default: 0.

actor_focus

Frame the editor viewport camera on an actor (selects it and aligns the active viewport). For the vision loop before a screenshot.

ParameterTypeRequiredDescription
actor_id string Required Actor label or full path to frame in the viewport

actor_get_components

List an actor's components with their class and name. Use this before object_set_property or actor_call_function, which both need the component name. include_internal also returns engine-created components you normally do not touch.

ParameterTypeRequiredDescription
actor_id string Required
include_internal boolean Optional

actor_get_properties

Reflect every property on an actor with its current value. The discovery step before actor_set_properties — property names must match the UPROPERTY exactly, and this is how you learn them instead of guessing.

ParameterTypeRequiredDescription
actor_id string Required

actor_inspect

Full read-back of a level actor: class, transform, bounds, components, material slots, tags, outliner folder, attach parent. The inspection half of the inspect-then-edit loop.

ParameterTypeRequiredDescription
actor_id string Required Actor label (outliner name) or full path

actor_list

List what is in the scene: every actor in the active level with its label, class and transform. Start here when you need to know what already exists before changing anything.

ParameterTypeRequiredDescription
class_filter string Optional Exact class name filter
tag string Optional Tag filter

actor_set_folder

Move actors into a world-outliner folder (organisation). Empty folder string moves to the root. Returns per-actor read-back of the applied folder.

ParameterTypeRequiredDescription
actor_ids string[] Required Actor labels or full paths to move
folder string Required World-outliner folder path, e.g. "Buildings/District01". Empty string moves to the root.

actor_set_properties

Set actor properties from a name to value map. Names must match the UPROPERTY exactly; a name the actor does not have is reported back rather than silently dropped, so read the response instead of assuming it applied.

ParameterTypeRequiredDescription
actor_id string Required
properties object (map) Required name to value map; structs/enums/vectors supported

actor_set_selection

Replace the editor actor selection with the given actors (by label or path). Returns the resolved selection + any unresolved ids.

ParameterTypeRequiredDescription
actor_ids string[] Required Actor labels or full paths to select (replaces the current selection)

actor_set_visibility

Show or hide an actor in the level. This is editor/runtime visibility only — the actor still exists, still ticks and still collides.

ParameterTypeRequiredDescription
actor_id string Required
visible boolean Required

actor_snap_to_socket

Attach an actor to a named socket on another actor, so it follows that socket's transform. The usual way to put a prop in a hand, a light on a fixture, or a decal on a mount point.

ParameterTypeRequiredDescription
actor_id string Required
target_actor_id string Required
socket_name string Required

actor_spawn

Place a new actor in the active level by class — a light, a volume, a blueprint actor, or any registered UClass. To place a StaticMesh or other content asset by its path instead, use actor_spawn_from_asset.

ParameterTypeRequiredDescription
class_path string Required UE class path, e.g. "/Script/Engine.StaticMeshActor"
location [number, number, number] Optional
rotation [number, number, number] Optional
scale [number, number, number] Optional
label string Optional

actor_spawn_from_asset

Spawn an actor from a content asset path (StaticMesh or Blueprint) without knowing the actor class. Optional snap_to_floor line-traces down onto geometry. Returns actor_id + final transform read-back. NON-IDEMPOTENT.

ParameterTypeRequiredDescription
asset_path string Required Content path of a StaticMesh or Blueprint asset, e.g. "/Game/Meshes/SM_Rock"
location number[] Optional [x,y,z] spawn location (default [0,0,0])
rotation number[] Optional [roll,pitch,yaw] spawn rotation (default [0,0,0])
label string Optional Optional actor label
snap_to_floor boolean Optional Line-trace straight down from the spawn point and seat the actor on the first hit Default: false.

actor_tag

Add or remove gameplay tags on an actor in one call. Tagging marks an actor's role so PCG filters and gameplay code can select it by tag rather than by name.

ParameterTypeRequiredDescription
actor_id string Required
add any[] Optional
remove any[] Optional

actor_transform

Reposition, rotate, or scale an existing actor.

ParameterTypeRequiredDescription
actor_id string Required
location [number, number, number] Optional
rotation [number, number, number] Optional
scale [number, number, number] Optional

placement_validate

Asks whether an actor of this class would collide with anything if spawned at this transform, WITHOUT spawning it. Use it before actor_spawn when placing into a populated scene — cheaper than spawning, checking, and deleting. It answers about overlap only: it does not tell you whether the spot makes sense, is on navmesh, or is inside geometry.

ParameterTypeRequiredDescription
class_path string Required Class you intend to spawn, e.g. /Script/Engine.StaticMeshActor
location any[] Optional [x,y,z] of the intended placement. A short array is an error, not a silent zero — a 2-element location once made this report a clean spot at the origin.
rotation any[] Optional [pitch,yaw,roll]
scale any[] Optional [x,y,z]

Agent memory 7

memory_delete

Delete memory blocks: a single block by id, every block from one agentRole, or (with confirm_all) the entire store. Exactly one of id / agentRole / confirm_all is required.

ParameterTypeRequiredDescription
id string Optional Delete exactly this block
agentRole string Optional Delete every block written by this role
confirm_all boolean Optional Set true to delete the entire store — required, not inferred

memory_export

Dump memory blocks (optionally filtered by scope/agentRole) to a portable JSON file for backup or transfer to another store via memory_import.

ParameterTypeRequiredDescription
path string Required File path to write the export JSON to
scope "private" | "shared" Optional
agentRole string Optional

memory_import

Load a memory_export JSON file back into the store. Reports exactly what happened per row: inserted, skipped (malformed), or conflicted (id already existed — left alone under "skip", overwritten under "replace").

ParameterTypeRequiredDescription
path string Required File path previously written by memory_export
on_conflict "skip" | "replace" Optional How to handle an id that already exists (default "skip")

memory_list

List recent memory blocks for a role/scope, most-recent-first, with no keyword filter. Use to browse what has been written, not to search for something specific.

ParameterTypeRequiredDescription
scope "private" | "shared" Optional
agentRole string Optional
limit integer Optional Max blocks to return (default 50)

memory_prune

Force retention to run now with an explicit (or default-configured) age/count bound. memory_write already does this automatically after every insert — use this only to prune on demand with a tighter one-off bound.

ParameterTypeRequiredDescription
max_count integer Optional Keep at most this many blocks (default: configured HAYBA_MEMORY_MAX_COUNT)
max_age_days number Optional Delete blocks older than this many days (default: configured HAYBA_MEMORY_MAX_AGE_DAYS)

memory_recall

Search memory blocks by keyword against their intent and content, most recent match first. Use when you remember roughly what a past block was about but not its id.

ParameterTypeRequiredDescription
text string Required Keyword/phrase to search for in intent + content
scope "private" | "shared" Optional
agentRole string Optional Restrict to blocks written by this role
limit integer Optional Max blocks to return (default 10)

memory_write

Write a memory block: an intent, its content, which agent role wrote it, and whether it is private or shared with other agents. Runs bounded retention (age + count) after every write and reports what (if anything) it pruned.

ParameterTypeRequiredDescription
agentRole string Required Role of the writing agent, e.g. "director", "asset-manager"
scope "private" | "shared" Required "private" = only this agentRole sees it via recall/list filters; "shared" = any role can
intent string Required Short label for what this block is about
content string Required The memory content itself
accessedResources string[] Optional Resource paths/ids touched while forming this memory
tokenCost number Optional Approximate token cost of the content, for budget tracking
provenance object (map) Optional Free-form provenance, e.g. {tool, cursor}
id string Optional Explicit id (default: a generated UUID) — mainly for re-inserting/overwriting a known block
timestamp number Optional Explicit epoch-ms timestamp (default: now) — mainly for import/migration

Animation Blueprints 5

anim_blueprint_add_state

Adds a state to an existing state machine in an animation blueprint. It cannot create the state machine itself — that still needs the AnimGraph editor — so on a blueprint with none it answers 'state machine not found', which is a missing prerequisite rather than a bad request. Compile with anim_blueprint_compile afterwards.

ParameterTypeRequiredDescription
path string Required
state_machine_name string Required From anim_blueprint_get_info. This command does not create state machines — only states inside one that exists.
new_state_name string Required A name already used in that state machine is refused rather than duplicated

anim_blueprint_add_transition

Wires one state to another. The transition is created with no rule, which means it is always taken — pair it with anim_blueprint_set_condition unless you actually want an unconditional transition. Pass state_machine_name when two state machines might share a state name.

ParameterTypeRequiredDescription
path string Required
from_state string Required
to_state string Required
state_machine_name string Optional Optional — without it the states are searched for across every state machine, which is ambiguous if two share a state name

anim_blueprint_compile

Compiles an ANIMATION blueprint (ABP) — the animation state-machine asset, not an ordinary class. Reports the compiler errors and warnings. Every anim_blueprint_* write leaves the asset needing this, and an uncompiled ABP keeps running its previously generated class, so state-machine edits look like they did nothing.

ParameterTypeRequiredDescription
path string Required

anim_blueprint_get_info

Reads an animation blueprint's state machines, their states and transitions, and its variables. Call it before any of the anim_blueprint_* writers: they address a state machine BY NAME, and this is the only way to learn the names — a freshly created anim blueprint has none at all.

ParameterTypeRequiredDescription
path string Required Object path of a UAnimBlueprint

anim_blueprint_set_condition

Sets the rule on an existing transition, identified either by its id or by the pair of states it joins. A transition with no rule fires immediately, so this is what turns a wired-up state machine into one that behaves. Compile afterwards to find out whether the expression resolved.

ParameterTypeRequiredDescription
path string Required
condition_expression string Required The rule to drive the transition
transition_id string Optional From anim_blueprint_add_transition. Use this, or from_state + to_state.
from_state string Optional
to_state string Optional

Asset search and sources 12

asset_browse

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to describe_assets.

Alias of describe_assets — the agent-friendly name surfaced as the hayba_asset_browse routing tool.

ParameterTypeRequiredDescription
path string Optional Default: "/Game".
paths array Optional
class string Optional
tag string Optional
limit integer Optional Default: 200.
offset integer Optional Default: 0.

describe_assets

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to asset_browse.

Wrapped indirectly by the asset-retriever (src/tools/asset-retriever/asset-indexer.ts) which dispatches describe_assets and falls back to list_pcg_assets on unknown_command. Game-thread marshaled.

ParameterTypeRequiredDescription
path string Optional Single recursive package path to enumerate Default: "/Game".
paths array Optional Explicit list of package directories or object paths. If supplied, overrides 'path' and disables recursion.
class string Optional Substring filter on the asset class name (case-insensitive)
tag string Optional Substring filter on tag key OR value (case-insensitive)
limit integer Optional Max assets to return per call (1..2000) Default: 200.
offset integer Optional Pagination offset Default: 0.

hayba_ambientcg_download

Download an ambientCG material zip and import into UE.

ParameterTypeRequiredDescription
asset_id string Required ambientCG asset id (e.g. "Bricks075A").
resolution string Optional Attribute string (e.g. "1K-JPG", "2K-JPG", "4K-PNG"). Default "2K-JPG".
target_dir string Optional UE content path. Defaults to /Game/AssetConnectors/ambientcg/<asset_id>.

hayba_asset_browse

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Enumerate assets by filter (path/class/tag/source) without semantic ranking. Paginated.

ParameterTypeRequiredDescription
filter object Optional
offset integer Optional
limit integer Optional

hayba_asset_reindex

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Force a rebuild of the asset index. Use after a batch import outside the MCP-tracked download flow.

No parameters.

hayba_polyhaven_download

Download a Poly Haven asset (HDRI / texture maps / glTF model) and import into UE.

ParameterTypeRequiredDescription
asset_id string Required Poly Haven asset slug.
type "hdris" | "textures" | "models" Optional Asset type (default "textures").
resolution "1k" | "2k" | "4k" | "8k" Optional Resolution tier (default "2k").
target_dir string Optional UE content path. Defaults to /Game/AssetConnectors/polyhaven/<asset_id>.

hayba_sketchfab_download

Download a Sketchfab model and import into UE. Requires SKETCHFAB_API_TOKEN env var.

ParameterTypeRequiredDescription
uid string Required Sketchfab model uid.
flavour "gltf" | "usdz" | "source" Optional Download flavour (default "gltf").
target_dir string Optional UE content path. Defaults to /Game/AssetConnectors/sketchfab/<uid>.

Assets and content 23

asset_create_folder

Create a Content Browser folder (make_directory). Idempotent: a no-op that reports already_existed:true when the folder is already present. Use before authoring/importing assets into a new path.

ParameterTypeRequiredDescription
path string Required Content path of the folder to create, e.g. "/Game/Meshes/Rocks"

asset_delete

Permanently delete content assets, verifying on the FILESYSTEM that each file is gone. Pass `paths` to delete a set in one call. READ deleted_count, not requested — it counts .uasset files actually removed. NEVER verify a delete with does_asset_exist or asset_search: the asset registry can report an asset gone while its file is still on disk, and that is exactly how a batch delete reports success for files it never removed. Assets the registry has lost but whose files remain are reported as ORPHANED and must be removed from disk directly.

ParameterTypeRequiredDescription
path string Optional Object path of one asset to delete, e.g. /Game/Foo/MF_X.MF_X
paths string[] Optional Several assets in one call. Prefer this over looping — one call reports which ones actually went.

asset_duplicate

Copy an asset to a new path. Use this to derive a variant rather than editing the original in place.

ParameterTypeRequiredDescription
source_path string Required
destination_path string Required

asset_fix_redirectors

Collapse the redirector stubs left behind by renames and moves. USE_WHEN: after a batch of asset_rename / asset_move calls — redirectors that survive into a cook are wasted work and confuse later reference lookups.

ParameterTypeRequiredDescription
path string Optional Folder to scan, e.g. "/Game/UI". Omit to scan the whole project.

asset_get_dependencies

What this asset pulls in — everything that must exist for it to load. USE_WHEN: working out why an asset drags in a large cook, or what to migrate alongside it. NOT_WHEN: you want what depends on IT (asset_get_referencers).

ParameterTypeRequiredDescription
path string Required Asset path whose dependencies to list

asset_get_info

Read one asset's metadata (class, path, size, optional thumbnail) by exact path. Use asset_search when you do not yet know the path.

ParameterTypeRequiredDescription
path string Required
include_thumbnails boolean Optional
thumbnail_size integer Optional

asset_get_referencers

WHAT BREAKS IF I DELETE OR RENAME THIS? Lists every asset that references the given one. USE_WHEN: before asset_delete, asset_rename or asset_move — a reference you did not know about becomes a broken link that surfaces much later. NOT_WHEN: you want what the asset itself needs (asset_get_dependencies).

ParameterTypeRequiredDescription
path string Required Asset path to look up, e.g. "/Game/UI/T_Panel" or "/Game/UI/T_Panel.T_Panel"

asset_get_references

Both directions of an asset reference graph in one call. Note the lists may be truncated — `capped: true` says so. Prefer the single-direction tools when you need an exact count.

ParameterTypeRequiredDescription
path string Required Asset path to inspect

asset_get_source_path

Read an imported asset's reimport source-file path(s) from its AssetImportData — the "where did this come from on disk" question, ahead of a reimport or a broken-source fixup. Probes get_first_filename / extract_filenames / source_data across asset types; returns source_paths:[] when the asset carries no import data (procedural/native assets).

ParameterTypeRequiredDescription
asset_path string Required Content path of the imported asset, e.g. "/Game/Meshes/SM_Rock"

asset_import

Fail-closed, single-file native import. It pins the fixed connector-cache ancestor/file handles, enforces kind-specific size+magic policy and an exact factory, refuses collisions/overwrite, then discards callback-returned UObject pointers and re-resolves the exact registry path/class/package. Successful imports are normally dirty_in_memory: follow with asset_save on the returned exact path. These checks reduce exposure but do NOT prove crafted files safe for an in-process UE parser; untrusted remote files still require an isolated sanitizer. Future connector continuation additionally requires an opaque single-use grant bound to one enumerated file; directory assertions are not authority.

ParameterTypeRequiredDescription
source_file string Required One absolute regular file below the fixed OS-temp/hayba-asset-connectors source/request cache. Links, reparse points, hardlinks, device/UNC paths, traversal, and files outside that authority are rejected.
destination_path string Required Canonical /Game folder. The exact asset name is the strict ASCII source basename; an existing registry/live/disk package is refused, never overwritten.
asset_type string Required Exact type intent: texture for PNG/JPEG, sound_wave for WAV, or static_mesh for binary FBX. glTF/GLB/OBJ/USD and dependency-reading formats are rejected.

asset_inspect

AssetRegistry metadata for one asset: class, dirty flag, dependency/referencer counts. Read before edit/delete to avoid surprises. Differs from the legacy asset_get_info (C++-backed single-asset info, may see engine-only fields) and from asset_registry_query (bulk discovery/pagination) — use this when you already know the asset path and want its dependency graph. Optional preparation_policy adds evidence and requested/resolved preparation decisions without mutation.

ParameterTypeRequiredDescription
asset_path string Required Content path of the asset, e.g. "/Game/Meshes/SM_Rock"
preparation_policy object Optional Inspect preparation decisions and native evidence for a StaticMesh

asset_move

Move an asset to another folder, keeping references working. Leaves a redirector behind; asset_fix_redirectors cleans those up.

ParameterTypeRequiredDescription
path string Required Current asset path
target_dir string Required Destination folder, e.g. "/Game/UI/Icons". The asset keeps its name.

asset_open_editor

Open the asset editor tab(s) for one or more assets (AssetEditorSubsystem.open_editor_for_assets) — pure UI focus, surfaces the asset for the user. Reports which paths were missing.

ParameterTypeRequiredDescription
asset_paths string[] Required Content paths of assets whose editor tabs to open

asset_prepare

Inspect and apply supported StaticMesh preparation policies, retaining partial work and unsupported capability results.

ParameterTypeRequiredDescription
assetPath string Required
policy object Required

asset_registry_query

Native read-only AssetRegistry query by exact class, asset-name substring, and/or content-path prefix, with deterministic pagination.

ParameterTypeRequiredDescription
class_filter string Optional Exact asset class name, e.g. "StaticMesh"
name_contains string Optional Case-insensitive asset-name substring
path_prefix string Optional
recursive boolean Optional Default: true.
limit integer Optional Default: 50.
offset integer Optional Default: 0.

asset_rename

Rename an asset in place, fixing up references rather than breaking them. Leaves a redirector behind; asset_fix_redirectors cleans those up. USE_WHEN: the name is wrong. NOT_WHEN: it belongs in another folder (asset_move).

ParameterTypeRequiredDescription
path string Required Current asset path
new_name string Required New asset name only — not a path. The asset stays in its current folder.

asset_save

Save dirty packages to disk. With asset_paths: saves each (only if dirty) and reports per-asset success — ok:false when ANY named path fails to save (surfaced in failed[] + warnings[]). Without: flushes ALL dirty map+content packages in one call. The write counterpart to editor_get_state's dirty_packages read. Idempotent (re-saving unchanged bytes is a no-op).

ParameterTypeRequiredDescription
asset_paths string[] Optional Specific asset paths to save. When omitted, all dirty content packages are saved.

asset_validate

Run the editor data-validation rules over an asset or folder and return the errors and warnings. USE_WHEN: confirming an asset is sound before building on it. NOT_WHEN: checking UI layout — ui_validate is the tool for that.

ParameterTypeRequiredDescription
path string Required Asset or folder path to validate

content_browser_sync

Reveal + select assets in the Content Browser (UI focus). Probes sync_browser_to_objects then the AssetTools fallback; degrades to a structured error if neither exists.

ParameterTypeRequiredDescription
asset_paths string[] Required Content paths to reveal + select in the Content Browser

content_validate

CHECK PROJECT CONTENT AGAINST MEMORY AND PERFORMANCE BUDGETS: oversized textures, compression that contradicts the asset name, non-power-of-two dimensions, UI textures outside the UI group, meshes with no LODs, excessive material slots, unreferenced meshes. Judged per strictness (relaxed/standard/strict) with every threshold justified in the hint. Reports what it did NOT examine — the audits only cover the heaviest N assets, so a clean result is scoped, never a claim about the whole project. NOT_WHEN: checking a UI screen (ui_validate).

ParameterTypeRequiredDescription
strictness "relaxed" | "standard" | "strict" Optional Override the configured asset strictness. relaxed = only the extreme; standard = normal budgets; strict = tight budgets plus hygiene notes.
top_n integer Optional How many of the heaviest assets to judge, per type. Default 25. Anything outside this window is NOT examined, and the response says so.
include "textures" | "meshes"[] Optional Which audits to run. Defaults to both.
rule_ids string[] Optional Run only these rules, by id.

data_create

Create and persist a concrete, current UDataAsset subclass after bounded path/name/class preflight. MarkPackageDirty and SaveLoadedAsset are callback boundaries: no raw creation pointer crosses either one, and the target path/class is freshly re-resolved before save and again afterward. Inspect ok, dirty_marked, pre_save_re_resolved, save_attempted, saved (present only when attempted), target_re_resolved, and dirty_known. If any identity, dirty-mark, save, or final readback fact is not trustworthy, nested ok:false plus data_create_unknown_outcome makes the top-level response unknown_outcome; query the exact path before retrying.

ParameterTypeRequiredDescription
path string Required
name string Required
class_name string Required must inherit UDataAsset

data_get

Read a bounded property snapshot from a DataAsset. Always inspect reflection_complete, reflection_truncated, properties_omitted_at_least, unsupported_values, and large_integers_as_strings before treating it as complete. Set/map item counts and physical sparse-slot ranges are both capped before iteration, so a small live count cannot hide an unbounded hole scan. Integers outside the exact JSON-number range are decimal strings, never rounded. Soft, weak, lazy, and soft-class wrapper references are reported unsupported/partial instead of falsely serializing an unloaded non-null path as null. Properties with native getters or setters are also unsupported/partial: raw bytes may not be their logical value, and invoking an accessor would execute unaudited code.

ParameterTypeRequiredDescription
path string Required

data_set

Write one bounded scalar property on a DataAsset by name, then inspect copy_completed, ok, verified, target_re_resolved, dirty_marked, dirty_known, dirty (when known), and observed_value or observed_value_omitted. Only exact built-in numeric, enum, bool, string, and name property classes without native getters/setters are accepted and assigned through direct typed setters; JsonValueToUProperty and ImportText are never entered. Fixed arrays, dynamic containers, structs (including user-defined structs), wrapper/object references, interfaces, delegates, optionals, text, field paths, SkipSerialization fields, accessor-backed fields, custom property subclasses, and every other extensible type are refused before staging. Staging and all property pointers end before dirty notification; the command then re-resolves the target/class/property and repeats the accessor/schema gate before fresh bounded readback. It deliberately skips transactions, UObject editor hooks, and persistence. save_requested is always false. If any final identity/verification/dirty fact is untrustworthy, nested ok:false plus stable error makes the top-level response unknown_outcome with mandatory readback; ErrorsOnly cannot hide it.

ParameterTypeRequiredDescription
path string Required
property_name string Required
value any Required

Audio 15

audio_active_sounds

Inspect live active sounds and physical voice usage from the main audio device, including component ids, asset paths, effective volume/pitch, looping, pause, virtualization/audibility, owner, and managed-component count.

ParameterTypeRequiredDescription
include_preview boolean Optional Default: false.
limit integer Optional Default: 256.

audio_asset_create

Create an unsaved SoundClass, SoundMix, SoundConcurrency, SoundAttenuation, or SoundSubmix asset at an explicit /Game path. Returns the canonical path and full default readback; call audio_asset_set, then audio_asset_save as the persistence boundary.

ParameterTypeRequiredDescription
path string Required Full target asset path including its asset name.
asset_type "SoundClass" | "SoundMix" | "SoundConcurrency" | "SoundAttenuation" | "SoundSubmix" Required Audio settings asset class. SoundWave creation is intentionally excluded because it requires imported PCM data.

audio_asset_inspect

Inspect one SoundClass, SoundMix (including class overrides), SoundConcurrency, SoundAttenuation, SoundSubmix, or SoundWave using a stable typed settings vocabulary.

ParameterTypeRequiredDescription
path string Required UE content asset path. Package-only (/Game/Audio/SC_UI), object (/Game/Audio/SC_UI.SC_UI), and UE export-text paths are normalized identically.

audio_asset_save

Explicitly save one supported audio settings asset and verify its .uasset exists on disk. Single-target by design so a failure cannot hide partial batch persistence.

ParameterTypeRequiredDescription
path string Required UE content asset path. Package-only (/Game/Audio/SC_UI), object (/Game/Audio/SC_UI.SC_UI), and UE export-text paths are normalized identically.

audio_asset_set

Set typed audio asset settings in memory with changed/unchanged key diagnostics and complete typed readback. The actual target class controls which documented keys are legal; incompatible or unknown keys fail before mutation. This command never saves implicitly.

ParameterTypeRequiredDescription
path string Required UE content asset path. Package-only (/Game/Audio/SC_UI), object (/Game/Audio/SC_UI.SC_UI), and UE export-text paths are normalized identically.
settings object Required

audio_component_control

Control a retained AudioComponent: play/stop/pause/resume, fade, set gain/pitch, reset parameters, or set typed MetaSound/SoundCue parameters. Returns live component readback; expired ids fail cleanly.

ParameterTypeRequiredDescription
component_id string Required Stable string id returned by audio_component_play or audio_play.
action "play" | "stop" | "pause" | "resume" | "fade_in" | "fade_out" | "set_volume" | "set_pitch" | "set_parameter" | "reset_parameters" Required Control operation.
duration number Optional Fade seconds for fade_in/fade_out. Default: 0.
level number Optional Target gain for fades/set_volume, or multiplier for set_pitch. Default: 1.
start_time number Optional Playback seek offset for play/fade_in. Default: 0.
parameter_name string Optional Required for set_parameter.
parameter_type "float" | "int" | "bool" | "wave" | "trigger" Optional Required for set_parameter.
parameter_value number | boolean | string Optional Typed value; wave takes a SoundWave path, trigger needs no value.

audio_component_play

Play a 2D USoundBase through a retained, non-auto-destroy AudioComponent and return a stable component id plus live play-state readback. Fails if the component never becomes active.

ParameterTypeRequiredDescription
path string Required USoundBase path: SoundWave, SoundCue, or MetaSoundSource.
volume number Optional Default: 1.
pitch number Optional Default: 1.
start_time number Optional Default: 0.
concurrency_path string Optional Optional SoundConcurrency override.

audio_list

Enumerate USoundBase assets (waves, cues, MetaSound sources) from the asset registry, including subclasses, without loading them. Duration and sample rate come from registry tags, so they are present for most assets but not guaranteed — a missing key means untagged, not zero.

ParameterTypeRequiredDescription
path_prefix string Optional Keep only sounds whose object path starts with this. Omitted means everything, including the large engine sound set.

audio_meter_read

Read linear magnitude, dB magnitude, and phase at explicit frequencies from a previously started master/submix analyzer. Empty or unavailable spectral data is an error, never a zero-filled success claim.

ParameterTypeRequiredDescription
submix_path string Optional SoundSubmix to target; omit for the master output.
frequencies_hz number[] Required

audio_meter_start

Start Audio Mixer FFT analysis on the master output or one SoundSubmix. Explicit lifecycle: start once, read one or more times, then stop.

ParameterTypeRequiredDescription
submix_path string Optional SoundSubmix to target; omit for the master output.
fft_size "min" | "small" | "medium" | "large" | "very_large" | "max" Optional Default: "medium".

audio_meter_stop

Stop a master/submix FFT analyzer that Hayba started. Fails if that target has no tracked analyzer.

ParameterTypeRequiredDescription
submix_path string Optional SoundSubmix to target; omit for the master output.

audio_play

Play a sound 2D through a retained AudioComponent. Fails unless the component becomes active and returns component_id plus live play-state/volume/pitch readback. Prefer audio_component_play for the fully typed first-class schema.

ParameterTypeRequiredDescription
path string Required Object path of a USoundBase
volume number Optional
pitch number Optional
start_time number Optional Playback seek offset in seconds
concurrency_path string Optional Optional SoundConcurrency override

audio_recording_start

Start in-memory Audio Mixer capture of the master output or one SoundSubmix. The matching stop command performs a synchronous, filesystem-verified WAV write.

ParameterTypeRequiredDescription
submix_path string Optional SoundSubmix to target; omit for the master output.
expected_duration number Optional Default: 10.

audio_recording_stop

Stop a tracked master/submix capture and synchronously write a WAV beneath Saved/BouncedWavFiles. Returns the verified absolute path, sample count, channel count, sample rate, and duration; zero samples or an absent file is an error.

ParameterTypeRequiredDescription
submix_path string Optional SoundSubmix to target; omit for the master output.
filename string Required WAV basename; any supplied extension/directories are stripped.
relative_path string Optional Optional subfolder beneath Saved/BouncedWavFiles. Absolute paths and .. are rejected. Default: "".

audio_set_volume

Sets the transient primary volume on the main audio device — the master bus, and only that. Use audio_asset_create/set/save with SoundClass and SoundMix assets for category routing. The change is transient and does not persist.

ParameterTypeRequiredDescription
category string Required Only 'master' is implemented; any other category is an explicit error rather than a silent no-op
volume number Required Multiplier, 1.0 being unchanged

Automation tests 4

test_cancel

Cancels only the tagged UnrealEditor-Cmd child owned by the matching active test_run job. It never enumerates or terminates arbitrary editor processes.

ParameterTypeRequiredDescription
job_id string Required Active owned-child test_run job id

test_get_log

Full entries (errors + warnings) from the last test_run, not just the pass/fail counts. Read this when a test failed and you need the actual assertion text rather than a tally.

No parameters.

test_list

Enumerate registered automation tests via FAutomationTestFramework directly (no controller/session-frontend needed). Name-substring filtering: pass filter_pattern (or its alias filter); the response echoes the applied filter so a dropped param is visible.

ParameterTypeRequiredDescription
filter_pattern string Optional Substring filter on display name or full path (alias: filter)
filter string Optional Alias of filter_pattern — substring filter on display name or full path. Accepted because it is the spelling callers reach for; it used to be silently ignored and the call returned all ~7000 engine tests.
category string Optional Full-path prefix filter, e.g. 'Hayba.Socket'

test_run

JOB ENVELOPE (async, non-freezing): unknown project, engine, plugin, and future Hayba tests default to a tagged owned UnrealEditor-Cmd child. Only exact lifecycle-audited pure Hayba contracts use the serving editor's core ticker. Empty or unmatched selections fail closed instead of producing a false green. Poll build_status for structured counts plus execution_mode, child PID/token, exit code, report validity, crash, timeout, cancellation, output-bound, and crash-artifact-count evidence. A crash or never-started child is failed, never skipped. Only one run may be active.

ParameterTypeRequiredDescription
test_names any[] Optional Test names/full-paths to run, or the single string 'all'. Accepts a string or array.
filter_pattern string Optional Case-insensitive substring selector on display name or full path (alias: filter). Use without explicit test_names.
filter string Optional Alias of filter_pattern. Use the same selector object returned by a successful test_list discovery call.
category string Optional Case-insensitive full-path prefix selector, e.g. 'LanternPuzzle'. Use without explicit test_names.
smoke_only boolean Optional Restrict to SmokeFilter-tagged tests
timeout_seconds number Optional For allowlisted in-process tests: per-test latent drain timeout. For owned-child runs: total process deadline, default 300 and hard-capped at 900 seconds.

Behavior trees 4

bt_add_node

Adds one node to a behavior tree. Build a tree root-first: a composite with no parent_guid becomes the root, then tasks and further composites hang off it by guid. The kind/class mismatch checks are strict on purpose, since a decorator quietly added as a task is the kind of thing you only notice when the AI misbehaves. Marks the asset dirty; asset_save to keep it.

ParameterTypeRequiredDescription
path string Required Object path of the UBehaviorTree
node_kind string Required composite | task | decorator | service. Checked against the class — asking for a composite and naming a task class is an error, not a guess.
node_class_name string Required UBTNode subclass, e.g. BTComposite_Selector, BTTask_Wait, BTDecorator_Blackboard
parent_guid string Optional From bt_get_info. Omitted on a composite means it becomes the root; decorators and services always need a composite parent.

bt_compile

Compiles the tree and reports what the compiler said. Read the warnings, not just ok: a tree with no blackboard asset compiles successfully and then does nothing useful at runtime, and that case is reported as a warning rather than an error.

ParameterTypeRequiredDescription
path string Required

bt_connect

Re-parents an existing node under a composite. It refuses to connect a node to itself and refuses an edge that would make a cycle, so a tree cannot be wired into one that never terminates. Ordering among siblings is the order children were added, and that order is execution order for a Selector or Sequence.

ParameterTypeRequiredDescription
path string Required
parent_guid string Required Must be a composite — only composites take children
child_guid string Required A composite or a task

bt_get_info

Reads a behavior tree's whole node graph plus its blackboard keys. Call it first: bt_add_node and bt_connect address nodes by the guids this returns, and those guids come from node object paths rather than being stored, so they stay valid between calls without any bookkeeping on your side.

ParameterTypeRequiredDescription
path string Required Object path of a UBehaviorTree

Blueprints 16

blueprint_add_bound_event

Plugin command. hayba_invoke passes it straight to the editor plugin.

Binds a widget or component event (Button OnClicked, a collision overlap) as an event node — the Details panel's '+' next to an event. Idempotent. Exposed to agents as ui_bind_event; kept agent_callable so hayba_invoke can reach component events too.

ParameterTypeRequiredDescription
path string Required
target string Required Component variable or widget (marked Is Variable) that owns the event
event_name string Required The multicast delegate to bind, e.g. OnClicked, OnHovered, OnComponentBeginOverlap
graph_name string Optional
x number Optional
y number Optional

blueprint_add_component

Add a component of a given class to a Blueprint's component tree. Changes are staged — blueprint_compile applies them, and nothing takes effect in the level until it does.

ParameterTypeRequiredDescription
path string Required
component_class_path string Required
component_name string Required

blueprint_add_custom_event

Adds a custom event to a blueprint's event graph: a named entry point that timers, other blueprints and the blueprint itself can call. Wire its OutputDelegate pin into a Set Timer by Event node to run it on a timer. Staged until blueprint_compile.

ParameterTypeRequiredDescription
path string Required
event_name string Required Unused on this blueprint across events, functions and inherited functions
inputs any[] Optional Event parameters as [{"name", "type"}] using the blueprint_add_variable type grammar
graph_name string Optional An event graph; omit for the main one
x number Optional
y number Optional

blueprint_add_event

Adds (or returns the existing) override event node such as BeginPlay, Tick, EndPlay, or a widget's Construct/PreConstruct — the entry points a Blueprint starts from. Idempotent: a second call returns the node already there.

ParameterTypeRequiredDescription
path string Required
event_name string Required An event the parent class lets blueprints implement, as the node shows it ("BeginPlay", "Event Construct", "Tick", "EndPlay") or its function name ("ReceiveBeginPlay")
graph_name string Optional
x number Optional
y number Optional

blueprint_add_function

Adds a function graph to a blueprint, with an optional signature (inputs, outputs, pure), and recompiles. Every parameter type is checked before the graph is created, so a bad type refuses the whole function rather than leaving a half-built one. Build the body with blueprint_add_node using graph_name = the function name.

ParameterTypeRequiredDescription
path string Required Object path of the UBlueprint
function_name string Required Must be unused on this blueprint (case-insensitive); a taken name is refused before anything is created
inputs any[] Optional Parameters as [{"name", "type"}] — type uses the blueprint_add_variable grammar (float, text, object:<class path>, array<...>)
outputs any[] Optional Return values as [{"name", "type"}]; creates the function's result node
pure boolean Optional Mark the function pure (no exec pins; called wherever its output is read)

blueprint_add_node

Stages a standard event-graph node and returns its GUID plus exact pins. timer_by_function creates K2_SetTimer; set its Object, FunctionName, Time and Looping pins before compile. For entry points use blueprint_add_event (BeginPlay, Construct), blueprint_add_custom_event, or ui_bind_event (widget events).

ParameterTypeRequiredDescription
path string Required
graph_name string Optional Graph to place the node in; omit for the main event graph, or pass a function name to build its body
node_type string Required call_function, branch, select, timer_by_function, variable_get, variable_set, cast, sequence (option_count = number of then_N outputs), self (a reference to this blueprint), or create_widget (class_path = the widget class, ending _C)
function_name string Optional
class_path string Optional The class a call_function belongs to (omit for this blueprint's own functions), the target type of a cast, or the widget class of create_widget
variable_name string Optional
option_count integer Optional select: number of options; sequence: number of outputs (2-32)
x number Optional
y number Optional

blueprint_add_variable

Add a member variable to a Blueprint and recompile. Object, class and struct references are resolved when added, so a mistyped path is refused with the path in the message instead of compiling into a broken pin. Refuses a name the blueprint already has.

ParameterTypeRequiredDescription
path string Required
variable_name string Required
variable_type string Required bool, int, int64, float, string, name, text, byte, vector, rotator, transform, linear_color, vector2d, object:<class path>, class:<class path>, soft_object:<class path>, soft_class:<class path>, struct:<struct path>, enum:<enum path>, or array<any of those>. Blueprint classes end in _C, e.g. object:/Game/UI/WBP_Menu.WBP_Menu_C
default_value string Optional Default in Unreal's text form, e.g. "0.2", "true", "Title". For arrays and structs set the default afterwards with blueprint_set_defaults.

blueprint_compile

Compile a Blueprint and report errors. Every blueprint_* edit is staged until this runs, so call it before expecting a change to exist — and read `errors`, because a failed compile leaves the old class in place. With save true, a read-only package is refused before compiling with code package_read_only and data.make_writable_hint; nothing changes. Take the file's lock and retry, or pass save:false.

ParameterTypeRequiredDescription
path string Required
save boolean Optional Defaults true. Pass false to compile without saving, e.g. for a read-only package.

blueprint_connect_nodes

Wires exec or data pins using GUIDs and exact pin names from blueprint_inspect_graph/add_node. The K2 schema rejects invalid type or direction connections.

ParameterTypeRequiredDescription
path string Required
graph_name string Optional
from_node string Required
from_pin string Required
to_node string Required
to_pin string Required

blueprint_create

package_path is the full intended asset path (trailing component = asset name), matching material_create. The handler derives the directory via FPackageName::GetLongPackagePath and re-composes <dir>/<name> so the asset lands at the standard /Game/Dir/Name.Name. A parent of /Script/Engine.BlueprintFunctionLibrary creates a real function library (static functions callable from any blueprint); check blueprint_type in the reply.

ParameterTypeRequiredDescription
name string Required
package_path string Required Full intended asset path, including the asset name as the final component, e.g. /Game/Underground/Actors/BP_UndergroundRun (same contract as material_create). The handler strips this to its directory and creates <dir>/<name>.<name>; pass the full path, not just the parent folder.
parent_class_path string Required

blueprint_document

Renders a blueprint's EVENT GRAPH as pseudo-English — a fast way to see what a blueprint reacts to without opening it. It covers events only: user-defined function graphs do not appear, so a blueprint documented as three bare events may still have functions. Use blueprint_get_info for structure.

ParameterTypeRequiredDescription
path string Required Object path of the UBlueprint

blueprint_get_info

List a Blueprint's components. The read step before blueprint_add_component (to avoid a duplicate name) or object_set_property (which needs the component name).

ParameterTypeRequiredDescription
path string Required

blueprint_inspect_graph

Read-only exact graph export. Returns stable node GUIDs, pin names/directions/types, every edge, counts, and dirty state. Use this before adding or wiring nodes.

ParameterTypeRequiredDescription
path string Required
graph_name string Optional

blueprint_remove_node

Deletes one node (and its links) from a blueprint graph, for taking back a node placed wrong. Refuses a function's entry or result node, which the function cannot exist without. Staged until blueprint_compile.

ParameterTypeRequiredDescription
path string Required
node_id string Required GUID from blueprint_add_node or blueprint_inspect_graph
graph_name string Optional The graph the node is in; omit for the main event graph

blueprint_set_defaults

Set default property values on a Blueprint's class defaults, so every future instance starts with them. Does NOT change actors already placed in the level.

ParameterTypeRequiredDescription
path string Required
properties object (map) Required

blueprint_set_pin_default

Sets a literal or object/class reference on an unconnected input pin. Refuses connected pins so values are never silently ignored.

ParameterTypeRequiredDescription
path string Required
graph_name string Optional
node_id string Required
pin_name string Required
value string Required

Build and cook 4

build_cook

JOB ENVELOPE (async, non-freezing): runs UnrealEditor-Cmd -run=cook on a background thread and returns { job_id, status:'running' } IMMEDIATELY. Poll build_status { job_id } for { status:'done', exit_code, output }, or watch hayba_journal_tail.

ParameterTypeRequiredDescription
platform string Optional Cook target platform (default WindowsNoEditor)
iterate boolean Optional Iterative cook (default true)
unversioned boolean Optional Cook unversioned packages (default false)

build_generate_project_files

JOB ENVELOPE (async, non-freezing): runs RunUAT GenerateProjectFiles on a background thread and returns { job_id, status:'running' } IMMEDIATELY. Poll build_status { job_id } for { status:'done', exit_code, output }.

No parameters.

build_project

JOB ENVELOPE (async, non-freezing): invokes UnrealBuildTool.exe on a background thread and returns { job_id, status:'running' } IMMEDIATELY — never blocks the editor (the old version blocked the game thread up to 5min). Poll build_status { job_id } for { status:'done', exit_code, output (log tail) }, or watch hayba_journal_tail for live build_job:<id> progress.

ParameterTypeRequiredDescription
target string Optional 'Editor' (default) to <Project>Editor, or 'Game' to <Project>
configuration string Optional Development (default) | DebugGame | Shipping | Test
platform string Optional Win64 (default) | Linux | Mac

build_status

Reader for the async job registry shared by build_project / build_cook / build_generate_project_files / test_run. Reads the job entry under its lock by job_id and returns its current status/result. Test jobs expose untruncated scalar pass/fail/skip totals plus a structured test_results object; malformed test results fail closed. Poll this after a build_* / test_run call returns { job_id, status:'running' }.

ParameterTypeRequiredDescription
job_id string Required Id returned by a build_* or test_run job envelope

Editor and PIE 39

editor_batch

Run several editor commands in order under one lease, one step per editor tick, with a fence after each (wait for shaders/asset loads/GC/async loading to settle; gc also collects garbage under an exclusive region/world lease). Returns {job_id} at once; follow it with batch_status. Steps may be wp_region_load {bounds:[minX,minY,maxX,maxY], name?} / wp_region_unload {name?}: the batch owns those World Partition regions and always releases them by the end. Other agents' queued interactive lease requests are served at fences. The batch keeps its own lease alive and runs to the end of its steps even if this server disconnects.

ParameterTypeRequiredDescription
lease_id string Optional The lease_id from lease_acquire this batch runs under. Optional only when this server holds exactly one lease.
lease string Optional Same as lease_id (kept for existing callers).
steps object[] Required
on_error "stop" | "unload_then_stop" Optional stop (default): halt at the failing step. unload_then_stop: halt, release loaded regions, then settle (idle, and gc if allowed) before reporting done. Regions are released in both cases.
idle_ticks integer Optional Consecutive idle ticks a fence needs (default 2).
fence_timeout_s number Optional A fence that never settles fails its step after this long (default 120).

editor_capture_viewport

Capture the active editor viewport and return it as an inline image block (plus a small text block with camera/width/height). Set HAYBA_CAPTURE_TO_FILE to also spill the image to a temp file path.

ParameterTypeRequiredDescription
width integer Optional
height integer Optional
wait_for_shaders boolean Optional If true, calls wait_for_shaders first (max_seconds=60, poll_seconds=1).

editor_cvar_get

Typed read of a console variable (int/float/bool) via KismetSystemLibrary getters. CAVEAT: UE's typed getters return type-defaults (0/0.0/False) for an unknown or mistyped cvar name, indistinguishable from a real zero value — this tool probes existence via the string getter when available and reports verified:false (plus a note) whenever the value cannot be confirmed real; treat verified:false as "do not trust this value". type defaults to float when omitted, with type_assumed:true in the response. NOT a freeform console runner — use editor_run_console_command for that.

ParameterTypeRequiredDescription
name string Required Console variable name, e.g. "r.ScreenPercentage"
type "int" | "float" | "bool" Optional Typed read: int | float | bool. If omitted, defaults to float and the response sets type_assumed:true.

editor_cvar_set

Typed set of a console variable, with a float read-back of the applied value. CAVEAT: the float readback returns 0.0 for a nonexistent cvar, indistinguishable from a real set-to-0 — this tool also probes the string getter (when available on this engine build) and returns ok:false + verified:false + a note when the readback proves the cvar does not exist (mistyped name). When no existence probe is available it stays ok:true with verified:false. Idempotent (retry-safe). NOT a freeform console runner — use editor_run_console_command for arbitrary commands.

ParameterTypeRequiredDescription
name string Required Console variable name, e.g. "r.ScreenPercentage"
value number | boolean | string Required New value (number, bool, or string)

editor_focus_actor

Frame an actor in the editor viewport by label — computes camera position from the actor's bounds and aims at its centre, entirely in C++. Roll is always 0 so the view never tilts. This is the correct 'framing tool'; do NOT hand-compute camera angles in python_run.

ParameterTypeRequiredDescription
actor_label string Required Label of the actor to frame in the viewport.
distance_scale number Optional How far back to sit, as a multiple of the actor's bounds radius (default 2.5; larger = further/more padding).
direction any[] Optional Optional [x,y,z] view direction (camera to actor). Default is a 3/4 front-right-above view. Need not be normalized.

editor_get_camera

Read the active editor viewport camera location + rotation. Net-new read counterpart to the legacy editor_set_camera. Rotation is [roll,pitch,yaw] degrees.

No parameters.

editor_get_output_log

Read the editor's output log, filtered by severity or regex and paged with since_line. The first thing to check when a command reported success but nothing happened — UE logs the real reason here.

ParameterTypeRequiredDescription
lines integer Optional
since_line integer Optional
severity_filter string Optional
regex_filter string Optional

editor_get_performance_stats

Editor frame timing: average fps, frame time, and the two thread times. These are whole-editor averages, not a profile of one operation — an idle editor with a compile running reads badly and that is not a scene problem. The thread times are cycle counters converted through FPlatformTime::ToMilliseconds; they were previously emitted RAW under _ms names, so every reading of those two fields used to be wrong by the platform cycle factor.

No parameters.

editor_get_state

One-shot consolidated native editor status: current map, who owns PIE (pie: none | user | agent:<owner>) and its phase, selected-actor count, Live Coding / shader / save activity, asset builds in progress, editor health, and the dirty (unsaved) package list (include_dirty:false skips that walk). The master gating probe before any action loop; after a pie_active refusal, poll it until pie is "none".

ParameterTypeRequiredDescription
include_dirty boolean Optional Walk every loaded package for dirty_packages (default true). false skips the walk; the reply then has dirty_packages_skipped:"include_dirty".

editor_live_compile

Triggers a Live Coding compile of the running editor. It is asynchronous: poll the editor log for 'Live coding succeeded' or 'LogLiveCoding: Error', matching on a COUNT of terminal lines rather than presence, because earlier runs are still in the file. Compile ERRORS are not in the editor log at all — they are in UnrealBuildTool\Log.txt. A brand-new handler CLASS still needs a full editor restart; Live Coding cannot register one.

No parameters.

editor_pie_actor_inspect

INSPECT ONE LIVE PIE ACTOR without touching editor-world state: transform, bounds, tags, owner and a capped/paginated list of owned components with visibility, collision and component-space evidence. USE_WHEN: understanding a runtime road, controller, pawn or interaction target found by editor_pie_actor_list. Read-only.

ParameterTypeRequiredDescription
pie_instance integer Optional
actor_path string Optional Exact path returned by editor_pie_actor_list; safest and unambiguous.
actor_id string Optional Runtime object name; rejected if it matches more than one actor.
actor_label string Optional Editor label; rejected if it matches more than one actor.
component_filter string Optional Case-insensitive substring of component name or class.
component_offset integer Optional Default: 0.
component_limit integer Optional Default: 50.

editor_pie_actor_list

WHAT EXISTS IN THE RUNNING WORLD: paginated runtime actors from the selected PIE client/server, with exact path, class and transform. USE_WHEN: finding roads, controllers, interactable actors or spawned state while PIE runs. NOT_WHEN: querying the editor MainMenu world (actor_list). Use the returned actor_path for unambiguous follow-up calls.

ParameterTypeRequiredDescription
pie_instance integer Optional Select a PIE client/server from available_worlds. Omit for the sole or active world.
class_filter string Optional Case-insensitive substring of class name or class path.
name_filter string Optional Case-insensitive substring of runtime actor id or label.
tag string Optional Exact actor tag.
offset integer Optional Default: 0.
limit integer Optional Default: 50.

editor_pie_assert

Assert a UPROPERTY on a PIE actor holds a value. It is ONE OBSERVATION, not a wait: a command handler runs on the game thread, so it cannot advance the world, and a property it watches can never change while it blocks — an earlier version that pumped the ticker to fake waiting is what crashed the editor. So a false `matched` with `polling:true` means 'not yet', and the caller loops. Read observed_value_last before assuming the property is wrong; it is often the expectation that is.

ParameterTypeRequiredDescription
property_name string Required A UPROPERTY on the resolved actor, by reflection name
expected_value any Required Compared for equality. Numbers honour `tolerance`.
actor_label string Optional Editor label of the actor to inspect. Give this or actor_path.
actor_path string Optional Full object path in the PIE world
tolerance number Optional Float comparison slack — an exact match on a simulated float is rarely what you want
timeout_ms number Optional Accepted for signature compatibility. It does NOT make the call wait — see the note.

editor_pie_axis

Send analog input — gamepad sticks and triggers, mouse axes. Applies for the frame it is delivered, so send it again per step for sustained movement rather than expecting it to latch.

ParameterTypeRequiredDescription
key string Required Axis key name, e.g. "Gamepad_LeftX", "Gamepad_RightY", "MouseX".
value number Optional Axis value, normally -1..1. Applies for one frame.

editor_pie_capture_get

Read progress or the final whole-editor timing summary for a PIE capture. Reports aborted status if PIE stops or the selected world changes. If the editor becomes unsafe, the safety gate refuses this command, so an internal abort cannot be retrieved. GPU time, real WP cells, and NPC AI cost remain explicitly unknown.

ParameterTypeRequiredDescription
capture_id string Required

editor_pie_capture_start

Start a bounded asynchronous capture of observed editor ticker intervals, whole-editor thread timing, and process physical memory during an already-running PIE session. Returns a capture_id immediately; poll editor_pie_capture_get. Ticker intervals are a whole-editor proxy and the result gives no performance verdict.

ParameterTypeRequiredDescription
pie_instance integer Optional Required when more than one PIE world is running.
sample_frames integer Optional Default: 120.
warmup_frames integer Optional Default: 0.
actor_tag string Optional Optional exact actor tag to count in one capped scan at capture completion.

editor_pie_click_actor

CLICK AN EXACT LIVE PIE ACTOR WITHOUT OS INPUT. Reuses the world-projection safety seam, rejects Slate/UMG and Canvas HUD blockers, and repeatedly verifies the canonical local player and first Visibility hit. It dispatches the exact native primitive stage used by APlayerController only after its complete guard state is proven, avoiding InputKey's unchecked re-entrant trace window and all synthetic mouse routes. Hover fails closed because UE exposes no public route that preserves native hover state while guaranteeing zero OS cursor movement. Fails closed for ambiguous clients, absent/hidden/minimized viewports, offscreen/hidden/occluded actors, policy changes and active gestures. USE_WHEN: selecting a road, unit or world actor in background automation with a live visible PIE viewport. NOT_WHEN: hovering, truly headless/NullRHI PIE, or clicking UI controls (editor_pie_click_widget).

ParameterTypeRequiredDescription
pie_instance integer Optional Required when more than one PIE client owns a viewport.
actor_path string Optional Exact path returned by editor_pie_actor_list; safest and unambiguous.
actor_id string Optional
actor_label string Optional
component_name string Optional Require this owned primitive component to be the first Visibility hit.
sample "actor_location" | "component_location" | "bounds_origin" Optional Point to project before verifying the first Visibility hit. Defaults to bounds_origin; component_location requires component_name.
player_index integer Optional Local player ordinal inside the selected PIE world. Default: 0.
action "click" Optional Synchronously dispatches the exact guarded native primitive stage used by APlayerController. Hover is deliberately unsupported because UE exposes no public zero-OS-cursor route to its protected hover state. Default: "click".

editor_pie_click_widget

CLICK A CONTROL BY WHAT IT SAYS rather than by pixel. Finds the widget whose text, tag or type matches and clicks its centre, preferring an interactive one so matching a label presses the button containing it. Reports how many matched, so an ambiguous choice is visible instead of silent. USE_WHEN: pressing menu buttons. NOT_WHEN: you need an exact position.

ParameterTypeRequiredDescription
match string Required Text, tag or widget type to find on screen, e.g. "Start Game" or "SButton". Prefers an interactive widget, so matching a label presses the button containing it.

editor_pie_mouse

Drive the mouse in the running game: move, click, double_click, press, release, drag or scroll. press/release let you hold a button across calls; drag interpolates intermediate positions because widgets that track deltas ignore a single jump. x/y are ABSOLUTE desktop pixels — pass center_x/center_y from editor_pie_widget_tree straight through. Check focused_widget_after: if it says SViewport, the click missed the UI. PREFER editor_pie_click_widget when you know the label.

ParameterTypeRequiredDescription
action "move" | "click" | "double_click" | "press" | "release" | "drag" | "scroll" Optional press/release let you hold a button across several calls; drag does the whole gesture. Default: "click".
x number Optional Target X in ABSOLUTE desktop pixels — pass center_x from editor_pie_widget_tree unchanged. Required for everything except scroll, where it is optional and positions the cursor before the wheel.
y number Optional Target Y in ABSOLUTE desktop pixels — pass center_y from editor_pie_widget_tree unchanged. Required for everything except scroll, where it is optional and positions the cursor before the wheel.
to_x number Optional Drag destination X. Required for action:"drag".
to_y number Optional Drag destination Y. Required for action:"drag".
steps integer Optional Intermediate positions for action:"drag" (default 8, clamped 1..256). Slate quantises the pointer to whole pixels, so steps closer than a pixel apart are dropped rather than sent as no-op moves.
button "left" | "right" | "middle" Optional Default: "left".
delta number Optional Wheel notches for action:"scroll" (default 1). Positive scrolls up. Delivered as a real Slate FPointerEvent under the cursor, so it reaches ScrollBoxes, list views and combo boxes as well as the game.
coordinate_space "absolute" | "viewport" Optional How x/y are read. "absolute" (default) is desktop pixels, which is what editor_pie_widget_tree reports. "viewport" is relative to the top-left of the game window; only use it if you measured from the window rather than the tree. Default: "absolute".

editor_pie_press_key

Press a keyboard or gamepad button in the running game. pressed_and_released schedules the release on a later tick and RETURNS IMMEDIATELY — the key is still down when you read the result, which is what lets the game see the hold at all.

ParameterTypeRequiredDescription
key string Required Key name, e.g. "SpaceBar", "E", "Escape", "Gamepad_FaceButton_Bottom".
event "pressed" | "released" | "pressed_and_released" Optional pressed_and_released schedules the release on a later tick and returns immediately. Default: "pressed_and_released".
held_ms number Optional How long to hold before the scheduled release. The call does not block for this.

editor_pie_project_world

PROJECT A LIVE WORLD TARGET TO A VERIFIED CLICK CANDIDATE. Accepts an actor, owned scene component or [x,y,z]. absolute.available and x/y are present only when the point is on-screen, its PIE window is visible/not minimized, and Slate finds no UMG/modal obstruction. For actor/component clicks require target_click_ready:true too; it combines that Slate proof with the first world Visibility hit. USE_WHEN: diagnosing or clicking a road, unit or world-space target without OS input against a live visible PIE viewport.

ParameterTypeRequiredDescription
pie_instance integer Optional Select a PIE client from available_worlds when more than one owns a viewport.
actor_path string Optional
actor_id string Optional
actor_label string Optional
world_location [number, number, number] Optional
component_name string Optional Owned scene-component name/path. Requires an actor target.
sample "actor_location" | "component_location" | "bounds_origin" Optional Defaults to bounds_origin. component_location requires component_name; actor_location requires an actor without component_name.
player_index integer Optional Local player ordinal inside the selected PIE world. Default: 0.
trace_visibility boolean Optional Hit-test the Visibility channel at the projected point and report the first actor/component. Default: true.

editor_pie_screenshot

Capture the running game. Requests the shot and returns immediately; the engine writes the file a frame or two later, so poll with check_only:true and the same filename rather than assuming it is ready. NOT_WHEN: capturing the editor viewport outside PIE (editor_capture_viewport).

ParameterTypeRequiredDescription
filename string Optional Output path. An absolute path is used as-is; a RELATIVE name is anchored to the project screenshot directory (Saved/Screenshots/<Platform>) — it is NOT relative to the editor process, whose working directory is the Unreal install tree. Defaults to that directory with a timestamp. The response returns the RESOLVED ABSOLUTE path; poll check_only with that value. check_only:true REQUIRES this.
path string Optional Alias of filename. Accepted because the object_* tools call the same idea `path`; silently stripping it made check_only polls target a file that was never checked.
check_only boolean Optional Do not capture; just report whether the previously requested file (pass its filename!) has landed. The engine writes the image a frame or two after the request, so poll with this rather than assuming it is ready.
show_ui boolean Optional Include Slate/UMG in the capture. Defaults to true; set false only for a scene-only frame. Default: true.

editor_pie_set_text

Put a value straight into a text field and tell the game about it. PREFER THIS over editor_pie_type_text when you just need to get past a field — typed characters go wherever focus happens to be, can be eaten by a modal, and are lost if focus moves before the widget commits. Find the field by the text ON it (the placeholder counts, so an empty login box matches "Username"), or omit match to use the focused field. Returns readback+verified, so you know the value is actually in the box. USE_WHEN: filling a login/search/name field. NOT_WHEN: you are testing how the game itself handles keystrokes.

ParameterTypeRequiredDescription
text string Required The value to put in the field. Replaces what is there.
match string Optional Which field, by the text visible on it — the PLACEHOLDER counts, so an empty login box matches "Username". Omit to target whatever currently has keyboard focus.
commit boolean Optional Send Enter afterwards so the game's OnTextCommitted binding fires (default true). Most games read the value from that binding rather than polling the widget, so without it the box visibly contains the text and the game never receives it. Pass false for a multi-field form where Enter would submit early. Default: true.

editor_pie_sightlines

Observe collision sightlines in live PIE. Tests 1-32 explicit eye positions against one target point with one ECC_Visibility trace per sample (maximum 100 m each). Returns clear, blocked with first blocker, or unknown, plus clear/tested ratio. This is a collision sightline proxy, not rendered visibility, walkability, World Partition residency, or performance. Read-only; multiple live PIE worlds require pie_instance.

ParameterTypeRequiredDescription
pie_instance integer Optional Required when more than one PIE world is live.
eye_positions [number, number, number][] Required Explicit world-space eye positions in cm. Each must be more than 0 and at most 10000 cm from the target.
target_location [number, number, number] Required One explicit world-space target point in cm.

editor_pie_type_text

Type a string into the running game as character input, which is what text fields actually consume. Goes to whatever holds keyboard focus — click the field first. Read characters_accepted_by_ui, NOT characters_sent: the first says the text landed in a widget, the second only says it was sent. USE_WHEN: filling in a name or search box. NOT_WHEN: a single control key like Enter (editor_pie_press_key).

ParameterTypeRequiredDescription
text string Required Characters to send. They go to whatever holds keyboard focus, so click the field first.

editor_pie_wait_for

The polling half of a PIE wait: one observation of a property, with `polling:true` when the condition is not met yet, so the caller can loop until it is or until it gives up. It does NOT block for you — the handler occupies the game thread it would need to advance, which is the reason the previous blocking version had to be removed. Same shape as editor_pie_assert; use this name when you intend to loop and that one when you intend a single check.

ParameterTypeRequiredDescription
property_name string Required
expected_value any Required
actor_label string Optional Give this or actor_path
actor_path string Optional
tolerance number Optional
timeout_ms number Optional Accepted, but this call does not block — see the note

editor_pie_widget_tree

WHAT IS ON SCREEN RIGHT NOW in the running game: every visible Slate/UMG widget with its type, text and on-screen rectangle. USE_WHEN: before interacting — this is how you find a button instead of guessing coordinates. NOT_WHEN: inspecting a Widget Blueprint asset rather than the live screen (ui_query).

ParameterTypeRequiredDescription
filter string Optional Keep only widgets whose type, tag or visible text contains this. Omit for everything.
max_depth integer Optional How deep to walk the Slate tree. Default 40.

editor_run_console_command

Run an editor console command (stat unit, r.* toggles, LiveCoding.Compile, etc). Arbitrary console access, so it is gated by Plan Mode. Effects are reported by the console, not returned — check editor_get_output_log.

ParameterTypeRequiredDescription
command string Required

editor_save_all_and_quit

Save every unsaved package, then shut the editor down — in that order. Shutting down with a dirty asset parks the editor on a modal save prompt that nothing can answer, because the MCP port closes first; three editor deaths in one session each cost exactly the assets still unsaved. REFUSES to quit if anything is still dirty after the save pass, and names what is holding it up. Pass quit:false to save everything without shutting down. USE_WHEN: ending a session, or closing the editor to link C++. NOT_WHEN: you only want to save (asset_save).

ParameterTypeRequiredDescription
quit boolean Optional Set false to save and verify every dirty package without shutting down. Default: true.

editor_set_camera

Position the editor viewport camera for deterministic captures. To AIM it, prefer look_at:[x,y,z] (orientation computed for you, never tilts). Manual rotation is UE FRotator (pitch/yaw/roll), NOT xyz-euler. To simply frame an actor, use editor_focus_actor instead.

ParameterTypeRequiredDescription
location any[] Required World-space camera position [x, y, z] in cm.
look_at any[] Optional BEST way to aim the camera: a world point [x,y,z] to face. The orientation is computed in C++ (correct pitch+yaw, roll always 0 — the horizon never tilts). Use this instead of rotation whenever you know what you want the camera pointed at; you do NOT compute any angles yourself. Takes precedence over rotation.
rotation object (map) Optional Manual orientation (only if you are not using look_at). PREFERRED form: object {pitch, yaw, roll} in degrees — unambiguous. yaw = heading (about the vertical/Z axis, the value you usually want); pitch = look up(+)/down(-); roll = horizon tilt and defaults to 0 (omit it — a non-zero roll is what makes the viewport 'look angled'). Array form is accepted as [pitch, yaw, roll] but its 3rd element (roll) is IGNORED so the camera never tilts by accident — do NOT pass [x,y,z] euler here, index 2 is roll, not yaw.

editor_set_viewport_mode

Switches the active editor viewport's view mode — wireframe to read geometry density, shader_complexity to find expensive materials, unlit to judge albedo without lighting. This changes what a HUMAN is looking at and does not change back on its own, so put it back to lit when you are done rather than leaving someone else's viewport in wireframe.

ParameterTypeRequiredDescription
mode string Required lit | unlit | wireframe | detail_lighting | lighting_only | shader_complexity

editor_start_pie

Start Play-In-Editor.

ParameterTypeRequiredDescription
single_step boolean Optional

editor_stop_pie

Stop the running Play-In-Editor session and return whether one was running. Call it before editor-only operations: many asset and level edits are unsafe or refused while PIE is live.

No parameters.

editor_stream_log

Tail recent UE log lines (paged via since_line).

ParameterTypeRequiredDescription
filter string Optional
since_line integer Optional

outliner_tree

Paginated world outliner: level actors with label, class, folder, and attachment parent — the agent's map of the level without dumping the whole world. Folder filters include descendants.

ParameterTypeRequiredDescription
folder string Optional Actors in this outliner folder and its descendants, e.g. "Buildings"
class_filter string Optional Exact class name filter, e.g. "StaticMeshActor"
name_filter string Optional Case-insensitive substring match on the actor label
limit integer Optional Max nodes returned (pagination) Default: 50.
offset integer Optional Pagination offset Default: 0.

render_camera

Render a camera view to disk and VERIFY the file landed (magic bytes + dimensions). Accepts either an actor reference or an inline transform. Calls wait_for_idle internally before capture.

ParameterTypeRequiredDescription
camera object Required
output_path string Optional Optional clean filename only (no path). Written without overwrite under Saved/Screenshots/Hayba; omit for a unique name.
width integer Optional Default: 1920.
height integer Optional Default: 1080.
format "png" | "jpg" Optional Default: "png".
wait_for_subsystems "shaders" | "assets" | "gc" | "pcg" | "world_tick"[] Optional Default: ["shaders","assets","world_tick"].
wait_timeout_s integer Optional Default: 30.
force boolean Optional render_camera is a known editor-crasher; it refuses unless force:true. Prefer set_level_viewport_camera_info + editor_capture_viewport (which now returns a real image block). Default: false.

selection_get

Full editor selection probe: selected level actors, content-browser assets, and selected components. Broader than actor_get_selection (adds assets + components) — the context probe for "apply to selection" tools.

No parameters.

wait_for_idle

Wait for UE subsystems (shaders/assets/gc/pcg/world_tick) to settle before reading back or rendering. Default = shaders+assets+gc+pcg.

ParameterTypeRequiredDescription
subsystems "shaders" | "assets" | "gc" | "pcg" | "world_tick"[] Optional Subsystems to wait on. Omit = shaders+assets+gc+pcg (world_tick excluded by default — it is always "busy" in-editor and yields false not-settled; request it explicitly only if you truly need a tick barrier).
timeout_s integer Optional Hard timeout in seconds. Default: 60.
pcg_actors string[] Optional Optional scope: only wait on these PCGComponent owners (full actor paths). Omit = all PCG actors in the active level.
world_ticks integer Optional When world_tick is in subsystems: wait at least N world ticks past request start. Default 1.

wait_for_shaders

Wait for UE shader compilation to settle (or timeout). Thin wrapper around wait_for_idle({subsystems:["shaders"]}).

ParameterTypeRequiredDescription
max_seconds integer Optional Upper bound in seconds (default 60).
poll_seconds number Optional Poll interval in seconds (default 1). NOTE: ignored — UE-side polling is fixed at 250ms.

Enhanced Input 3

input_add_mapping

Binds a key to an action inside a mapping context, optionally with modifiers and triggers. A modifier or trigger class name it cannot resolve is reported under unresolved_classes rather than silently skipped — so a reply listing fewer modifiers than you asked for is telling you something. Marks the context dirty; asset_save to keep it.

ParameterTypeRequiredDescription
mapping_path string Required Object path of an existing UInputMappingContext
action_path string Required Object path of an existing UInputAction
key_name string Required Engine key name, e.g. W, SpaceBar, Gamepad_LeftX. An unknown key is rejected.
modifiers any[] Optional UInputModifier class names, e.g. InputModifierNegate, InputModifierSwizzleAxis
triggers any[] Optional UInputTrigger class names, e.g. InputTriggerPressed, InputTriggerHold

input_create_action

Creates an Enhanced Input UInputAction — the 'what the player did' half of the system, independent of which key does it. Pick value_type by the shape of the input: Boolean for a press, Axis1D for a trigger, Axis2D for a stick. The asset is created dirty and unsaved; call asset_save to keep it. An existing name is an explicit error, because letting the engine ask would raise a modal dialog and hang every queued command.

ParameterTypeRequiredDescription
path string Required Package folder, e.g. /Game/Input
name string Required Asset name. A name already in use is refused rather than overwritten.
value_type string Required Boolean | Axis1D | Axis2D | Axis3D

input_create_mapping

Creates an empty UInputMappingContext — the 'which keys, in this situation' half of Enhanced Input. A context is what gets pushed and popped as the player moves between menus, driving and walking. Fill it with input_add_mapping. Created dirty and unsaved; asset_save to keep it.

ParameterTypeRequiredDescription
path string Required Package folder, e.g. /Game/Input
name string Required Asset name; an existing one is refused, not overwritten

Foliage 15

foliage_add_instance

Place one foliage instance at an exact transform. USE_WHEN: precise single placement. NOT_WHEN: covering an area — foliage_paint_at scatters at a density instead.

ParameterTypeRequiredDescription
foliage_type_path string Required FoliageType asset path, e.g. "/Game/Foliage/FT_Grass"
transform object Required Placement transform. `location` is required; the rest default.

foliage_add_instances

Bulk-add explicit world transforms for a foliage type via EditorFoliageLibrary.add_instances, chunked to avoid a game-thread freeze — the direct authoring verb (fixes the historic silent C++ add stub). NON-IDEMPOTENT (append). UNCERTAIN-API: errors clearly when add_instances is not python-exposed.

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset
transforms object[] Required Explicit world transforms to place
chunk_size integer Optional Instances per add call (game-thread freeze guard) Default: 2000.

foliage_capability_probe

Report which UE Python foliage bindings are available (EditorFoliageLibrary + add/get/remove instances, procedural-foliage, HISM, FoliageType_InstancedStaticMesh) plus the engine version and whether a Landscape/StaticMesh collision surface exists — the graceful-degradation gate to call BEFORE any scatter/author op.

No parameters.

foliage_clear_type

Remove ALL instances of a foliage type from the level (destructive, one-undo, requires confirm:true). NON-IDEMPOTENT. UNCERTAIN-API: routes through EditorFoliageLibrary.remove_instances with a null box (all-instances) and errors clearly when unavailable.

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset
confirm true Required Must be true — this removes ALL instances of the type (destructive)

foliage_get_instance_count

Return the number of placed instances of a foliage type across the level — the cheapest read to verify a scatter/add/remove landed. UNCERTAIN-API: degrades to null + a warning when instance introspection is not python-exposed.

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset

foliage_list_types

List the FoliageType assets in use in the current level, with instance counts. USE_WHEN: before adding or removing foliage, to learn what is already there.

No parameters.

foliage_paint_at

Scatter foliage over a circular area at a density, as the foliage paint brush does. USE_WHEN: dressing terrain. NOT_WHEN: you need one instance at an exact spot.

ParameterTypeRequiredDescription
foliage_type_path string Required FoliageType asset path to scatter
location object Required World-space centre of the painted area
radius number Optional Brush radius in cm; defaults to 200
density integer Optional Maximum number of placement attempts; defaults to 5
seed integer Optional Deterministic scatter seed; defaults to 1337

foliage_remove_in_bounds

Remove instances of a foliage type inside an axis-aligned box (center + half-extent) and return the delta count. NON-IDEMPOTENT (delete). UNCERTAIN-API: EditorFoliageLibrary.remove_instances signature/box arg is probed and errors clearly when unavailable.

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset
center number[] Required [x,y,z] world center of the removal box
extent number[] Required [x,y,z] half-extent of the removal box

foliage_remove_instances

Remove foliage instances of a type inside a world-space box. Returns how many were removed, so an unexpected zero is visible rather than silent.

ParameterTypeRequiredDescription
foliage_type_path string Required FoliageType whose instances to remove
bounds object Required World-space box; instances inside it are removed.

foliage_replace_mesh

Swap the StaticMesh bound to a FoliageType (bulk re-theming — every existing instance re-renders with the new mesh) and read the binding back. Set-to-value (retry-safe).

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset to re-mesh
new_mesh_path string Required Content path of the StaticMesh to bind, e.g. "/Game/Meshes/SM_Rock"

foliage_scan_types

Enumerate the foliage types used in the level (across all InstancedFoliageActors) with mesh path, density, radius and instance count. Paginated. The read entry point so agents stop guessing foliage type asset paths. UNCERTAIN-API: type enumeration is probed and degrades to [] + a warning.

ParameterTypeRequiredDescription
limit integer Optional Max foliage types returned (pagination) Default: 50.
offset integer Optional Pagination offset Default: 0.

foliage_scatter_paint

Deterministic area scatter: ground-trace downward onto landscape/collision inside a circular radius at a target density, with per-instance yaw + uniform-scale jitter and optional align-to-normal, then commit via add_instances. Refuses before UE transport above 10000 candidates; reduce radius/density or split into non-overlapping regions. Same seed to same placement. NON-IDEMPOTENT (append). This is the low-level authoring verb, NOT the PLUMB-validated world_generate flagship. UNCERTAIN-API: needs a collision surface (see foliage_capability_probe.surface_actors) and add_instances exposure.

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset
center custom[] Required [x,y,z] finite world center of the scatter region
radius custom Required Scatter radius in world units (max 100000)
density_per_100m2 custom Required Target instances per 100x100 unit cell (max 10000)
seed custom Optional Deterministic signed 32-bit RNG seed Default: 1337.
scale_min custom Optional Per-instance uniform scale minimum (max 100) Default: 1.
scale_max custom Optional Per-instance uniform scale maximum (max 100) Default: 1.
align_normal boolean Optional Align instances to the ground-hit normal Default: false.
trace_height custom Optional Downward trace half-height (max 1000000) Default: 100000.

foliage_type_create

Create (or reuse if present) a FoliageType_InstancedStaticMesh asset from a StaticMesh with optional initial density — the entry point for all foliage authoring. Reuses an existing asset at the path (retry-safe read-back) but is classified NON-IDEMPOTENT as an asset-create lifecycle op. UNCERTAIN-API: FoliageType factory/class is probed and errors clearly when not python-exposed.

ParameterTypeRequiredDescription
static_mesh_path string Required Content path of the source StaticMesh, e.g. "/Game/Meshes/SM_Tree"
dest_path string Required Destination folder for the new FoliageType asset, e.g. "/Game/Foliage"
name string Required Asset name for the new FoliageType, e.g. "FT_Tree"
density number Optional Optional initial density

foliage_type_inspect

Read every authored param of a single FoliageType (density, radius, scale X/Y/Z intervals, z-offset, align-to-normal, random-yaw, collision, cast-shadow, cull distance) plus mesh path and instance count — the paired read for verify/diff before a foliage_type_set_params write.

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset, e.g. "/Game/Foliage/FT_Grass"

foliage_type_set_params

Set the core authoring knobs on a FoliageType — density, radius, scale range (X/Y/Z), align-to-normal, random-yaw, world collision, cast-shadow, and cull start/end — then save + read back which keys changed. Set-to-value (retry-safe); omitted fields untouched. UNCERTAIN-API: unknown property spellings land in unchanged_keys[] rather than being silently lost. Returns ok:false (with warnings[]) when NONE of the requested params applied.

ParameterTypeRequiredDescription
foliage_type_path string Required Content path of the FoliageType asset to edit
density number Optional Instances per 1000x1000 unit area (UFoliageType.Density)
radius number Optional Collision radius that prevents instances overlapping
align_to_normal boolean Optional Rotate instances to the ground normal
random_yaw boolean Optional Randomise yaw per instance
collision_with_world boolean Optional Enable per-instance world collision
cast_shadow boolean Optional Instances cast shadows
scale_min number Optional Uniform scale range minimum (sets scale X/Y/Z min)
scale_max number Optional Uniform scale range maximum (sets scale X/Y/Z max)
cull_start number Optional Cull distance start (fade begins)
cull_end number Optional Cull distance end (fully culled)

Gameplay Ability System 4

gas_apply_effect

Needs the optional HaybaMCPGAS plugin in your project.

Applies a gameplay effect to an actor's ability system component, for checking that an effect does what you think before wiring it into gameplay. Refuses an actor without an ability system component by name. An Instant effect changes attributes and leaves no active handle behind, so an empty handle is not a failure.

ParameterTypeRequiredDescription
actor_path string Required Must own a UAbilitySystemComponent
effect_path string Required
level number Optional

gas_create_ability

Needs the optional HaybaMCPGAS plugin in your project.

Creates a UGameplayAbility blueprint. Lives in the optional HaybaMCPGAS satellite plugin, which auto-disables when the engine's GameplayAbilities plugin is off — so an Unknown command here means the satellite is not installed in this project, not that the command is missing. The ability is created empty; grant it to an actor with gas_grant_ability.

ParameterTypeRequiredDescription
path string Required Package FOLDER. Note this differs from blueprint_create / material_create / metasound_create, whose package_path is the full asset path with its last component discarded.
name string Required

gas_create_effect

Needs the optional HaybaMCPGAS plugin in your project.

Creates a UGameplayEffect blueprint — the data asset that changes attributes, the unit GAS actually applies. duration_policy decides whether it fires once (Instant), ticks for a while (HasDuration) or persists until removed (Infinite). Part of the optional HaybaMCPGAS satellite.

ParameterTypeRequiredDescription
path string Required Package folder
name string Required
duration_policy string Optional Instant | HasDuration | Infinite
duration_seconds number Optional Only meaningful with HasDuration
modifiers any[] Optional Attribute modifiers: attribute, op, magnitude

gas_grant_ability

Needs the optional HaybaMCPGAS plugin in your project.

Grants an ability to an actor's ability system component. It refuses an actor with no UAbilitySystemComponent rather than silently doing nothing, and refuses an uncompiled ability blueprint (no class default object) — both verified live. Grants made in the editor world are editor state, not gameplay state.

ParameterTypeRequiredDescription
actor_path string Required Must own a UAbilitySystemComponent — a plain actor is refused by name
ability_path string Required Object path of a UGameplayAbility blueprint
level number Optional
input_id number Optional

History and journal 4

hayba_dag_rebuild

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Re-run stale (dirty) artifacts. Optionally restrict to the subtree under a target URI.

ParameterTypeRequiredDescription
target string Optional

hayba_dag_record

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Record a mutation Hayba did not instrument (editor-side edits, manual writes) so the DAG stays accurate.

ParameterTypeRequiredDescription
reads string[] Optional
writes string[] Required
actor string Optional
note string Optional

hayba_dag_status

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Show the dependency graph of generated artifacts and which are stale (dirty).

ParameterTypeRequiredDescription
namespace string Optional
dirtyOnly boolean Optional

hayba_journal_tail

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Return the most recent mutation operations from the journal.

ParameterTypeRequiredDescription
limit integer Optional

In-editor chat 8

copilot_health

Cheap health snapshot for the copilot stack: sidecar chat routes registered, UE bridge reachable, tool registry size, and the active provider.

ParameterTypeRequiredDescription
session_id string Optional Chat session id; omitted = the default/global config slot

copilot_key_clear

Clear the stored BYOK API key for a provider. Destructive — plan-gated when Plan Mode is on.

ParameterTypeRequiredDescription
provider string Required Provider id whose key should be cleared
session_id string Optional Chat session id; omitted = the default/global config slot

copilot_key_set

Set the BYOK API key for a provider. The key is NEVER echoed back or logged — the response contains only a masked last-4. Stored in-memory (TODO Task 6: swaps to the C++ DPAPI vault).

ParameterTypeRequiredDescription
provider string Required Provider id from copilot_provider_list
api_key string Required The raw API key (never returned or logged)
session_id string Optional Chat session id; omitted = the default/global config slot

copilot_key_status

Report, per provider, whether a BYOK key is configured (masked last-4 only, no network call).

ParameterTypeRequiredDescription
session_id string Optional Chat session id; omitted = the default/global config slot

copilot_model_list

Read the configured provider model catalog without model inference. Returns live-listed IDs and capability metadata when available; manual model IDs remain allowed.

ParameterTypeRequiredDescription
provider string Required Provider id from copilot_provider_list
session_id string Optional Chat session id; omitted = the default/global config slot

copilot_provider_list

List the BYOK provider catalog, flagging which provider is active and whether a key is configured for it (masked last-4 only).

ParameterTypeRequiredDescription
session_id string Optional Chat session id; omitted = the default/global config slot

copilot_provider_set

Set the active BYOK provider (and optional model/base URL) for a copilot session.

ParameterTypeRequiredDescription
provider string Required Provider id from copilot_provider_list, e.g. "anthropic"
model string Optional Override the provider default model
base_url string Optional Override the provider default base URL (e.g. self-hosted OpenAI-compat endpoint)
session_id string Optional Chat session id; omitted = the default/global config slot

copilot_provider_test

Preflight-check a BYOK provider: fails clean with {ok:false, reason:"no_key"} (no network call) if a key is required but absent; otherwise runs a minimal completion probe and reports latency.

ParameterTypeRequiredDescription
provider string Optional Provider id to test; defaults to the configured active provider
model string Optional Model id to test; defaults to the configured/default model
session_id string Optional Chat session id; omitted = the default/global config slot

Instanced meshes 4

ism_add_instance

Add ONE instance to an InstancedStaticMesh actor. For more than a handful use ism_add_instances instead — a per-instance round trip is the slow way to build a forest.

ParameterTypeRequiredDescription
actor_id string Required
transform object (map) Required {location?:[x,y,z], rotation?:[pitch,yaw,roll], scale?:[x,y,z]}

ism_add_instances

Plugin command. hayba_invoke passes it straight to the editor plugin.

Add up to 1000 instances to an InstancedStaticMesh actor in one call. This is how you place large repeated geometry (trees, rocks, crowd props) without one actor per item.

ParameterTypeRequiredDescription
actor_id string Required
transforms array Required array of transform objects (cap 1000)

ism_clear_instances

Remove every instance from an InstancedStaticMesh actor, keeping the actor and its mesh. Use before re-scattering rather than deleting and respawning the actor.

ParameterTypeRequiredDescription
actor_id string Required

ism_create_actor

Plugin command. hayba_invoke passes it straight to the editor plugin.

Spawn an actor whose root is an InstancedStaticMesh component named "ISM". This is the container ism_add_instances fills — create it once, then add instances in bulk rather than spawning an actor per item.

ParameterTypeRequiredDescription
static_mesh_path string Required
label string Required
location array Optional

Landscape 10

landscape_add_layer

Create (or reuse if present) a LandscapeLayerInfoObject asset for a named paint layer — the prerequisite for any painting. Reuses an existing asset at the path (retry-safe read-back), but is classified NON-IDEMPOTENT as an asset-create lifecycle op. UNCERTAIN-API: binding into the landscape material slot may require an editor rebuild.

ParameterTypeRequiredDescription
layer_name string Required Paint-layer name to author a LayerInfo for (matches the material Landscape Layer Blend slot)
layer_info_path string Required Content path for the LandscapeLayerInfoObject asset, e.g. "/Game/Landscape/LI_Rock"
weight_blend boolean Optional bNoWeightBlend=false (normal weight-blended layer) when true Default: true.

landscape_get_material

Read the assigned landscape material and hole material asset paths.

ParameterTypeRequiredDescription
actor_label string Optional Landscape actor label or full path. Omit when the level has exactly one landscape.

landscape_import

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to import_landscape.

Alias of import_landscape — the name discoverable in list_tool_categories under the 'pcg' domain. Wrapped by hayba_import_landscape (src/tools/index.ts uses this exact name as the dispatch target). See PR #229 for the game-thread marshal fix.

ParameterTypeRequiredDescription
heightmapPath string Required
worldSizeKm number Optional Default: 8.
maxHeightM number Optional Default: 600.
actorLabel string Optional Default: "Hayba_Terrain".
landscapeMaterial string Optional

landscape_inspect

Deep brief of one landscape: component/subsection layout, XYZ scale, world bounds, material + hole material, paint layers with LayerInfo binding, streaming proxies, and a warnings[] list (missing layout/LayerInfo). The paired read for every landscape write op.

ParameterTypeRequiredDescription
actor_label string Optional Landscape actor label or full path. Omit when the level has exactly one landscape.

landscape_layer_list

List the paint layers on a landscape with their LayerInfo asset and whether a weightmap is bound — the read tool that exposes painting state before a paint/add-layer write. Includes a warnings[] list when both probes (get_target_layers/editor_layer_settings) return empty.

ParameterTypeRequiredDescription
actor_label string Optional Landscape actor label or full path. Omit when the level has exactly one landscape.

landscape_list

Enumerate all landscape actors + streaming proxies in the level with component layout, scale, material, world bounds and paint-layer count. Paginated. The read entry point so agents stop guessing landscape actor names.

ParameterTypeRequiredDescription
name_filter string Optional Case-insensitive substring match on the actor label
limit integer Optional Max landscapes returned (pagination) Default: 50.
offset integer Optional Pagination offset Default: 0.

landscape_list_splines

List the LandscapeSplinesComponents on a landscape with control-point and segment counts — read tool for spline-driven roads/rivers before editing.

ParameterTypeRequiredDescription
actor_label string Optional Landscape actor label or full path. Omit when the level has exactly one landscape.

landscape_set_lod_settings

Set landscape LOD distribution and/or scalability bias (set-to-value, retry-safe). Omitted fields are left unchanged. Returns the applied values + read-back.

ParameterTypeRequiredDescription
actor_label string Optional Landscape actor label or full path. Omit when the level has exactly one landscape.
lod_distribution number Optional LODDistributionSetting (higher = LODs kick in nearer). Left unchanged when omitted.
scalability_lod_bias integer Optional LODBias-style scalability bias. Left unchanged when omitted.

landscape_set_material

Assign/swap the landscape material asset and read it back. Set-to-value (retry-safe). NOTE: after a material change with new layer slots, layer painting may need a rebuild; use landscape_inspect to check LayerInfo bindings.

ParameterTypeRequiredDescription
actor_label string Optional Landscape actor label or full path. Omit when the level has exactly one landscape.
material_path string Required Content path of the landscape material to assign, e.g. "/Game/Materials/M_Landscape"

landscape_set_nanite

Toggle the landscape enable_nanite property (set-to-value, retry-safe). Does NOT trigger the Nanite data rebuild (returns rebuild_needed:true). UNCERTAIN-API: the property exists in 5.x but the apply-build path is C++/pipeline.

ParameterTypeRequiredDescription
actor_label string Optional Landscape actor label or full path. Omit when the level has exactly one landscape.
enable boolean Required Enable or disable Nanite on the landscape

Leases and batches 6

batch_status

Progress or result of an editor_batch job: status running|succeeded|failed, phase, the step it is on, what a fence is waiting for, per-step results, loaded regions, yields to other agents. wait_s polls until done.

ParameterTypeRequiredDescription
job_id string Required
wait_s number Optional Poll until the batch is done or this many seconds pass (default 0: answer now).

lease_acquire

Reserve part of the editor (world, World Partition region, asset, actor, PIE, or everything) so other agents do not change it mid-sequence. Never blocks: returns {status:"granted", lease_id} or {status:"queued", ticket, position, holder_owner, eta_s, poll_after_s}; poll by calling again with ticket. Granted leases are renewed automatically until lease_release.

ParameterTypeRequiredDescription
resources string | object[] Optional What to lock. Required unless ticket is given.
mode "shared" | "exclusive" Optional Default exclusive. Shared lets other readers hold the same resource.
ttl_s number Optional Lease lifetime in seconds (default 120, max 900). Renewed automatically while this server runs.
lane "interactive" | "long" Optional interactive (default) is served first; long is for bulk work and ages to the front after a while.
ticket string Optional The ticket from an earlier queued answer, to poll for the grant.
label string Optional What the lease is for, shown to other agents in lease_status.
bind_connection boolean Optional Default true: a disconnect orphans the lease for up to 60 seconds, unless it expires sooner or its owner renews it.

lease_adopt

Make this connection act as the owner of a live lease: later commands that name no owner run as that owner, and the owner's orphaned connection-bound leases re-bind here. Needs lease_id and its owner. Connection adoption ends on close; repeat after reconnect. A confirmed adoption also switches this server's process-wide envelope owner and manual lease_id, which remain set across reconnects and unknown-id replies until explicitly changed. It does not start auto-renew or transfer existing renewal timers; renew or release the adopted lease yourself.

ParameterTypeRequiredDescription
owner string Required The owner of the lease (HAYBA_AGENT_ID).
lease_id string Required A live lease of that owner.

lease_release

Release a lease (lease_id), withdraw a queued ticket (ticket), or release everything you hold (all:true). Send exactly one. Other agents waiting on it can then be granted.

ParameterTypeRequiredDescription
lease_id string Optional A lease you hold (the lease_id lease_acquire returned).
token string Optional Deprecated alias of lease_id; send lease_id.
ticket string Optional A queued request to withdraw (the ticket lease_acquire returned).
all true Optional Release every lease and withdraw every ticket you hold.

lease_renew

Extend leases you hold. With lease_id, that lease; with nothing, every lease you hold, which also revives leases the editor orphaned when this server's connection dropped. Rarely needed: leases granted by lease_acquire are renewed in the background.

ParameterTypeRequiredDescription
lease_id string Optional The lease_id lease_acquire returned (ls_...). Omit it to renew every lease you hold.
token string Optional Deprecated alias of lease_id; send lease_id.
ttl_s number Optional New lifetime from now, in seconds (max 900). Omitted: each lease keeps its own TTL.

lease_status

Who holds or waits for which editor resources, the enforcement mode (off / advisory / enforced_for_writes / enforced), the identified agents the editor sees as connected (active_owners), and which of your leases this server is renewing.

No parameters.

Levels and World Partition 9

level_create

Create a new empty level asset. Does not open it — follow with level_load to switch the editor to it.

ParameterTypeRequiredDescription
name string Required
path string Optional

level_get_info

Name and actor count of the level currently open. The cheapest way to confirm which level you are actually editing before making changes.

No parameters.

level_goto_bookmark

Moves the editor viewport to a stored bookmark. This changes what a human is looking at, so it is not a neutral read — prefer editor_set_camera when you just need a viewpoint for a capture. NOT VERIFIED LIVE: described from the handler source.

ParameterTypeRequiredDescription
name string Required A bookmark previously stored by level_set_bookmark

level_list

List every level asset in the project. Use it to find the exact path level_load wants.

No parameters.

level_load

Open a level in the editor, replacing the current one. UNSAVED CHANGES IN THE CURRENT LEVEL ARE AT RISK — call level_save first.

ParameterTypeRequiredDescription
path string Required

level_save

Save the current level. Optional path is an expected current-level package guard, not Save As; a mismatch is refused before mutation. A map or external actor package requiring a save, including clean packages requiring transient-reference repair, is refused before mutation when its file is read-only (code package_read_only, data.make_writable_hint). Saving runs unattended and cannot open a modal dialog. Returns saved, path, dirty and verified readback for that package only, not external actor packages. Plan Mode gated; disk persistence is not undoable.

ParameterTypeRequiredDescription
path string Optional

level_set_bookmark

Stores a named camera position in the current level so it can be returned to later. Bookmarks live in the LEVEL, so this dirties the map and persists only if the level is saved — do not use it as scratch state on a map someone else is working in. NOT VERIFIED LIVE: described from the handler source, because verifying it means dirtying a real level.

ParameterTypeRequiredDescription
name string Required Bookmark identifier
location any[] Optional [x,y,z]; defaults to the current viewport camera position when omitted
rotation any[] Optional [pitch,yaw,roll]

wp_get_cells

A spatial summary of where actors are: it bins every actor in the editor world onto a fixed 512m grid and reports per-bin counts and the classes that dominate each. These are NOT the World Partition runtime cells — cell ids and bounds will not match the partition's own, which is why the reply says cell_source. Requires World Partition to be enabled on the map; use it to find the busy regions before deciding where to look.

No parameters.

wp_get_streaming_state

Answers one question honestly: does the current editor world use World Partition. It previously also reported a hard-coded source_count of 0 — a field named for a measurement that always answers zero reads as "measured, none found", so it now names itself not_enumerated instead of inventing a number.

No parameters.

Lighting and post-process 14

color_grading_set

Set cinematic color grading on a PostProcessVolume — white-balance temp/tint and global saturation/contrast/gamma/gain (each a Vector4 with alpha=1) — with the correct bOverride_* flags and the struct written back. Set-to-value (retry-safe). UNCERTAIN-API: Vector4 absence degrades a field to a warning + unchanged_keys[].

ParameterTypeRequiredDescription
volume string Optional PostProcessVolume label/path; omit to target the unbound (global) volume
white_temp number Optional White-balance temperature (Kelvin)
white_tint number Optional White-balance tint (-1..1)
saturation number Optional Global color saturation (applied to R/G/B, alpha=1)
contrast number Optional Global color contrast (applied to R/G/B, alpha=1)
gamma number Optional Global color gamma (applied to R/G/B, alpha=1)
gain number Optional Global color gain (applied to R/G/B, alpha=1)

exposure_set

Set auto-exposure on a PostProcessVolume — method (manual/histogram/basic), EV bias, min/max EV100 — each with its bOverride_* flag set and the struct written back. The single most-asked PP knob as a focused verb. Set-to-value (retry-safe). UNCERTAIN-API: AutoExposureMethod enum absence degrades to a warning.

ParameterTypeRequiredDescription
volume string Optional PostProcessVolume label/path; omit to target the unbound (global) volume
method "manual" | "histogram" | "basic" Optional Auto-exposure method
bias number Optional Exposure compensation (EV bias)
min_ev number Optional Auto-exposure minimum brightness (EV100)
max_ev number Optional Auto-exposure maximum brightness (EV100)

fog_configure

Configure an ExponentialHeightFog actor — density, height falloff, start distance, inscattering color, volumetric-fog toggle — on its fog component. Set-to-value (retry-safe); omitted fields untouched. UNCERTAIN-API: component/property spellings are probed and land in unchanged_keys[].

ParameterTypeRequiredDescription
actor_id string Optional ExponentialHeightFog actor label/path; omit to target the first fog actor in the level
density number Optional Fog density
height_falloff number Optional Fog height falloff
start_distance number Optional Fog start distance (world units)
color number[] Optional [r,g,b] 0-1 fog inscattering color
volumetric boolean Optional Enable volumetric fog

light_get

Read all key properties of a single light (intensity, color, temperature, attenuation radius, cast-shadows, mobility) — the paired read for verify/diff before a light_set write.

ParameterTypeRequiredDescription
actor_id string Required Light actor label (outliner name) or full path

light_list

Enumerate every light actor in the level with its light component class and key properties (intensity, color, temperature, attenuation radius, cast-shadows, mobility). Paginated. The read entry point so agents tune lights from real values, not guesses.

ParameterTypeRequiredDescription
limit integer Optional Max lights returned (pagination) Default: 100.
offset integer Optional Pagination offset Default: 0.

light_set

Set core properties on an existing light — intensity, RGB color, color temperature (auto-enables use_temperature), attenuation radius, cast-shadows, mobility — then read back. Set-to-value (retry-safe); omitted fields untouched. UNCERTAIN-API: property spellings are probed and land in unchanged_keys[] rather than being silently lost.

ParameterTypeRequiredDescription
actor_id string Required Light actor label or full path
intensity number Optional Light intensity (units depend on light type)
color number[] Optional [r,g,b] 0-255 light color
temperature number Optional Color temperature in Kelvin (also enables use_temperature)
attenuation_radius number Optional Attenuation radius (point/spot/rect lights)
cast_shadows boolean Optional Whether the light casts shadows
mobility "static" | "stationary" | "movable" Optional Component mobility

light_spawn

Spawn a directional/point/spot/rect/sky light with optional intensity, color, temperature and mobility in one call — the primary way to lay down scene lighting. NON-IDEMPOTENT (actor-create). UNCERTAIN-API: the light actor class is probed and errors clearly when not python-exposed.

ParameterTypeRequiredDescription
light_type "directional" | "point" | "spot" | "rect" | "sky" Required Type of light actor to spawn
location number[] Optional [x,y,z] spawn location (default [0,0,0])
rotation number[] Optional [roll,pitch,yaw] spawn rotation (default [0,0,0])
label string Optional Optional actor label
intensity number Optional Optional initial intensity
color number[] Optional Optional [r,g,b] 0-255 color
temperature number Optional Optional color temperature in Kelvin
mobility "static" | "stationary" | "movable" Optional Optional component mobility (default movable)

lighting_capability_probe

Report which UE Python lighting/post-process bindings are available (light actor classes, SkyAtmosphere, ExponentialHeightFog, PostProcessVolume, Lumen/reflection/auto-exposure enums) plus engine version, light-actor count and PPV count — the graceful-degradation gate to call BEFORE any spawn/set op.

No parameters.

lumen_configure

Enable/disable Lumen GI and reflections (false = None) and set final-gather quality + max-trace-distance on a PostProcessVolume, each with its bOverride_* flag and the struct written back — the headline UE5 lighting verb. Set-to-value (retry-safe). UNCERTAIN-API: Lumen enums are probed and their absence degrades to a warning.

ParameterTypeRequiredDescription
volume string Optional PostProcessVolume label/path; omit to target the unbound (global) volume
gi_enabled boolean Optional Enable Lumen dynamic global illumination (false = None)
reflections_enabled boolean Optional Enable Lumen reflections (false = None)
final_gather_quality number Optional Lumen final-gather quality scale
max_trace_distance number Optional Lumen max trace distance (world units)

postprocess_get

Read back PostProcessSettings values AND which bOverride_* flags are active on a PostProcessVolume (a value with its override false is inert) plus the Lumen GI / reflection / auto-exposure methods — the paired read so agents see what is actually overridden before a postprocess_set / lumen_configure / exposure_set write.

ParameterTypeRequiredDescription
volume string Optional PostProcessVolume label/path; omit to target the unbound (global) volume

postprocess_list_volumes

Enumerate every PostProcessVolume in the level with unbound/priority/blend-weight/enabled — the read entry point so agents target the right volume (or discover none exists) before a postprocess_set / exposure_set / lumen_configure write.

No parameters.

postprocess_set

Set PostProcessSettings on a PostProcessVolume — bloom, vignette, film-grain, chromatic-aberration, motion-blur, ambient-occlusion, depth-of-field f-stop — with the correct bOverride_* flag set alongside each value (a value without its override is a silent no-op) and the whole settings struct written back. Set-to-value (retry-safe); omitted fields untouched. UNCERTAIN-API: a field whose value/override set fails lands in unchanged_keys[].

ParameterTypeRequiredDescription
volume string Optional PostProcessVolume label/path; omit to target the unbound (global) volume
bloom_intensity number Optional Bloom intensity
vignette_intensity number Optional Vignette intensity
film_grain_intensity number Optional Film grain intensity
chromatic_aberration number Optional Chromatic aberration (scene fringe intensity)
motion_blur_amount number Optional Motion blur amount
ambient_occlusion_intensity number Optional Ambient occlusion intensity
depth_of_field_fstop number Optional Depth-of-field aperture (f-stop)

postprocess_spawn_volume

Spawn a PostProcessVolume (unbound/global by default, or box-bounded) with optional priority and blend-weight — the container every postprocess_set / exposure_set / lumen_configure / color_grading_set tweak targets. NON-IDEMPOTENT (actor-create). UNCERTAIN-API: PostProcessVolume class is probed and errors clearly when not python-exposed.

ParameterTypeRequiredDescription
location number[] Optional [x,y,z] spawn location (default [0,0,0])
label string Optional Optional actor label
unbound boolean Optional Unbound = affects the whole scene (global). false = box-bounded Default: true.
priority number Optional Optional blend priority
blend_weight number Optional Optional blend weight (0..1)

sky_setup

Spawn a complete daytime sky triad — SkyAtmosphere + SkyLight + a directional-light Sun — with an optional sun angle/intensity and skylight intensity in one call. NON-IDEMPOTENT (spawns three actors; re-running adds duplicates). UNCERTAIN-API: each class is probed and a missing one degrades to a warning while the rest still spawn.

ParameterTypeRequiredDescription
sun_rotation number[] Optional [roll,pitch,yaw] of the sun DirectionalLight (default [0,-45,0])
sun_intensity number Optional Optional sun (directional light) intensity
skylight_intensity number Optional Optional SkyLight intensity
label_prefix string Optional Prefix for the spawned actor labels Default: "Sky".

Materials 20

material_add_comment

Add a titled comment box around a group of nodes in a material or function graph.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
text string Required Comment title/text shown on the box
node_pos [number, number] Optional Top-left graph position [x, y]
size [number, number] Optional Box size [width, height]
color number[] Optional Box color [r, g, b] or [r, g, b, a] (0..1)
font_size integer Optional Title font size (default 18)

material_add_node

Add a new expression node to a material graph. For a MaterialFunctionCall, pass properties.function (asset path) — the node's inputs/outputs are rebuilt immediately (UpdateFromFunctionResource), so its output pins are wirable right away and are returned in outputs[]. No recompile/refresh dance needed.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
expression_class string Required UE expression class name, e.g. "MaterialExpressionVectorParameter"
node_pos [number, number] Optional Graph position [x, y] for the new node
properties object (map) Optional Initial properties for the node. For a MaterialFunctionCall set "function" (or "function_path") to the function asset path — outputs are rebuilt immediately and returned.

material_add_reroute_declaration

Create a named-reroute declaration (source anchor) so a value can be referenced by name instead of long wires.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
name string Required The reroute name (what usages bind to)
node_pos [number, number] Optional Graph position [x, y]
color number[] Optional Node color [r, g, b] or [r, g, b, a] (0..1)

material_add_reroute_usage

Create a named-reroute usage bound to a declaration by name (replaces a long wire).

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
declaration_id string Required node_id of the reroute declaration to bind to
node_pos [number, number] Optional Graph position [x, y]

material_apply

Apply a material to an actor in the level (optionally specifying a material slot).

ParameterTypeRequiredDescription
actor_id string Required ID of the actor to apply the material to
material_path string Required Path to the material asset to apply
slot_index integer Optional Material slot index (default 0)

material_compile

Finalize a material OR material FUNCTION: write it to disk, apply staged settings, surface translator errors + shader optimization stats (materials). Graph edits DEFER the disk write — call this once the graph is complete. NOTE: material functions no longer auto-save either, so after editing a function call material_compile with function_path to persist it (this avoids a half-built function crashing the editor when it is opened/compiled).

ParameterTypeRequiredDescription
material_path string Optional Path to the master material asset to compile (either this or function_path)
function_path string Optional Path to a material FUNCTION to finalize + save (either this or material_path)

material_connect_nodes

Connect two nodes in a material graph or connect a node output to a material property. IMPORTANT for multi-output sources (esp. MaterialFunctionCall): you MUST pick the output pin with from_output (the pin NAME) or from_output_index — otherwise the call is rejected, because defaulting to the first output silently swaps function outputs (e.g. Albedo and F0). Get the real pin names/order from material_get_info.expressions[].outputs[]. May return clutter-prevention suggestions: use named reroutes when a source fans out to 2+ targets, or a reroute knee node when a wire would run backward/over another node.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
from_node string Required ID or name of the source node
from_output string Optional Output pin NAME on the source node (from material_get_info.expressions[].outputs[].name). REQUIRED when the source has >1 output (e.g. a material function) unless you pass from_output_index.
to_node string Optional ID or name of the target node
to_input string Optional Input pin name on the target node
to_input_index integer Optional Target input pin by index (unnamed pins, e.g. Substrate slab inputs)
from_output_index integer Optional Source output pin by index (default 0)
to_property string Optional Target material output, e.g. base_color, normal, front_material (Substrate), displacement (Nanite tessellation - needs material_set_property enable_tessellation=true)

material_create

Create a new material asset.

ParameterTypeRequiredDescription
package_path string Required UE content path for the new material
name string Required Name of the material asset

material_create_instance

Create a new material instance derived from a parent material.

ParameterTypeRequiredDescription
parent_material_path string Required Path to the parent material asset
package_path string Required UE content path for the new material instance
name string Required Name of the material instance asset

material_delete_comment

Delete a comment box from a material or function graph (comment_id from material_get_info.comments[].id). Named reroutes are nodes — use material_delete_node for those.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
comment_id string Required Comment id to delete (from material_get_info.comments[].id)

material_delete_node

Delete an existing node from a material graph.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
node_id string Required ID/name of the node to delete

material_disconnect

Break a connection in a material graph — clear a node input or a material output property.

ParameterTypeRequiredDescription
material_path string Required Path to the material asset
to_node string Optional ID or name of the target node whose input should be disconnected
to_input string Optional Input pin name on the target node (defaults to first input)
to_input_index integer Optional Zero-based input pin index (alternative to to_input)
to_property string Optional Material output property name to disconnect (e.g. base_color, normal)

material_function_create

Create a new material function asset in the project.

ParameterTypeRequiredDescription
package_path string Required UE content path for the new material function
name string Required Name of the material function asset

material_get_info

Inspect a material, material function, or material instance: properties, parameters, and the full expression graph. Parameter expressions expose their authored parameter_name, parameter_type, typed default_value, and explicit metadata/default availability. For materials, material_outputs[] distinguishes stored property wires from compiler-active terminals (important when Use Material Attributes retains ignored legacy wires). Each expression input includes its source edge (from_node + from_output), each node reports output_consumed + reachable_from_output, and dead_nodes[] lists every node NOT reachable from a compiler-active material output — i.e. provably dead, safe to delete (no delete-recompile-compare needed).

ParameterTypeRequiredDescription
path string Required Path to the material or material instance to inspect

material_list

List materials and material instances in the project or a specific path.

ParameterTypeRequiredDescription
path string Optional UE content path filter (default: list all)

material_set_comment

Edit an existing comment box (move/resize/retitle/recolor) by id — only the fields you pass change. Completes comment CRUD so comments never need a Python fallback.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
comment_id string Required Comment id to edit (from material_get_info.comments[].id)
text string Optional New title/text
node_pos [number, number] Optional New top-left graph position [x, y]
size [number, number] Optional New box size [width, height]
color number[] Optional New color [r, g, b] or [r, g, b, a] (0..1)
font_size integer Optional New title font size

material_set_node

Move and/or set properties on an existing node in a material graph.

ParameterTypeRequiredDescription
material_path string Optional Path to the material asset (either this or function_path required)
function_path string Optional Path to the material function asset (either this or material_path required)
node_id string Required ID/name of the existing node to update
node_pos [number, number] Optional New graph position [x, y]
properties object (map) Optional Properties to set on the node

material_set_param

Set a scalar, vector (rgba), or texture parameter on a material instance.

ParameterTypeRequiredDescription
instance_path string Required Path to the material instance
param_name string Required Name of the parameter to set
value number | number[] | string Required Parameter value: scalar, vector (1-4 elements), or texture asset path

material_set_property

Stage strict master-material settings with observed readback. Set used_with_spline_meshes:true for spline routes, then call material_compile to compile the required permutation and save.

ParameterTypeRequiredDescription
material_path string Required Path to the master material asset
properties object Required Material settings. Allowlisted boolean used_with_* flags are staged with verified readback; use used_with_spline_meshes:true for UE spline routes, then call material_compile to compile and save.

material_validate

Statically check a material OR material FUNCTION graph for translator-crash-prone wiring WITHOUT compiling: reroutes/named-reroutes used downstream that resolve to no input, and connections to non-existent output indices — both trigger an uncatchable HLSL-translator assert that kills the editor. material_compile runs these same checks and refuses to compile when any fail, so call this first to fix issues safely.

ParameterTypeRequiredDescription
material_path string Optional Path to the master material to validate (either this or function_path)
function_path string Optional Path to a material FUNCTION to validate (either this or material_path)

MetaSound 7

metasound_add_node

Needs the optional HaybaMCPMetaSound plugin in your project.

Adds a registered native MetaSound node and returns its stable node_id GUID. Mutates in memory; call metasound_compile to validate and save.

ParameterTypeRequiredDescription
metasound_path string Required
class_name string Required Registered MetaSound class name, for example Sine
namespace string Optional Defaults to UE
variant string Optional
major_version integer Optional

metasound_compile

Needs the optional HaybaMCPMetaSound plugin in your project.

Conforms the asset to its document, initializes editor node locations, validates, and saves explicitly. Half-authored graphs are never implicitly saved by node edits. With save true, a read-only package is refused before conforming (code package_read_only, data.make_writable_hint). A save that fails after conforming returns ok:false, valid:true, mutation_status applied_unsaved.

ParameterTypeRequiredDescription
metasound_path string Required
save boolean Optional Defaults true

metasound_connect

Needs the optional HaybaMCPMetaSound plugin in your project.

Connects two named pins using node GUIDs returned by add_node or inspect. Mutates in memory; call metasound_compile to validate and save.

ParameterTypeRequiredDescription
metasound_path string Required
from_node_id string Required
output_name string Required
to_node_id string Required
input_name string Required

metasound_create

Needs the optional HaybaMCPMetaSound plugin in your project.

Creates an empty MetaSoundSource asset. Author it with metasound_add_node/connect/set_input, inspect it, then use metasound_compile as the explicit validate/save boundary.

ParameterTypeRequiredDescription
package_path string Required Destination /Game folder, or the historic full intended asset path ending in name. Both spellings resolve to the same destination.
name string Required

metasound_inspect

Needs the optional HaybaMCPMetaSound plugin in your project.

Read-only graph export with node GUIDs, named typed pins, edges, counts, and dirty state. Use before and after every mutation.

ParameterTypeRequiredDescription
metasound_path string Required

metasound_list

Needs the optional HaybaMCPMetaSound plugin in your project.

Enumerates MetaSound assets (sources and patches) from the asset registry. Part of the optional HaybaMCPMetaSound satellite; an Unknown command means the satellite is not installed.

ParameterTypeRequiredDescription
path_prefix string Optional Filter by object-path prefix

metasound_set_input

Needs the optional HaybaMCPMetaSound plugin in your project.

Sets a named node input default, or a graph input default when node_id is omitted. Mutates in memory; call metasound_compile to validate and save.

ParameterTypeRequiredDescription
metasound_path string Required
input_name string Required
value any Required
type string Optional float (default), int32, bool, or string
node_id string Optional Omit to set a graph input default

Networking 2

net_debug

Toggles the networking stat overlay (stat net) and packet-handler log stats in the editor viewport. Reach for it when diagnosing replication during PIE. It is a viewport overlay, so the effect is visible in a screenshot rather than in this reply; the reply only tells you the console commands were issued.

ParameterTypeRequiredDescription
enabled boolean Required true turns the net stat overlay and packet-handler logging on, false turns both off
channels any[] Optional Reported back as channels_applied. Defaults to ["all"]. Currently descriptive only — the same overlay is enabled whatever you pass.

net_set_replication

Sets replication flags on one actor in the editor world and marks its level dirty — this edits the LEVEL, so the change persists only if the level is saved, and it is not something to try on a map someone is working in. Every parameter is validated before anything is written, so a rejected request leaves the actor untouched.

ParameterTypeRequiredDescription
actor_path string Required Actor name, label, or full object path in the current editor world
replicate boolean Required Whether the actor replicates at all
always_relevant boolean Optional Left alone when omitted, rather than reset to false
net_dormancy string Optional Awake | Initial | DormantAll. DORM_Never and DORM_DormantPartial cannot be expressed — an unrecognised value is rejected and nothing is written.
replicated_components any[] Optional Component names to mark replicated. Ones that do not resolve come back under missing_components rather than being dropped.

Niagara 14

niagara_activate

Activate (optionally reset) or deactivate a live NiagaraComponent to (re)start/stop the effect — needed because many template systems ship auto_activate=false. SET-SUCCESS: applied:true only when the activate/deactivate call ran; reports the resulting active flag. Idempotent set-to-state.

ParameterTypeRequiredDescription
component string Required NiagaraComponent object path OR an actor label/path carrying one
reset boolean Optional Reset the simulation when (re)activating Default: true.
deactivate boolean Optional Deactivate instead of activate Default: false.

niagara_advance_simulation

Deterministically tick a live NiagaraComponent's sim by N seconds at a fixed dt (AdvanceSimulation) so a screenshot is reproducible — the deterministic-preview primitive the vision loop needs (a transient effect is invisible at t=0). Refuses before UE transport above 7200 native ticks; increase tick_dt or advance in bounded chunks. SET-SUCCESS: applied:true only when the advance call ran; arg order probed defensively. NON-IDEMPOTENT: each call advances the sim cumulatively, so a repeat/retry compounds simulated time — re-run from a fresh spawn for a reproducible frame.

ParameterTypeRequiredDescription
component string Required NiagaraComponent object path OR an actor label/path carrying one
seconds custom Required How many seconds of simulation to advance (max 60)
tick_dt custom Optional Fixed per-tick delta seconds (0.004166666666666667..1) Default: 0.0167.

niagara_capability_probe

Probe whether the Niagara plugin and its python surface are available (NiagaraSystem/Component/FunctionLibrary classes, spawn entry points, and which set_variable_* setters exist). The cheap capability gate to call before any other niagara tool so an agent knows what will work in this editor build.

No parameters.

niagara_component_inspect

Read a live NiagaraComponent's runtime state: active/paused flags and the system asset it plays — the read-back/verify tool for runtime control ops (pairs with niagara_activate / niagara_param_set).

ParameterTypeRequiredDescription
component string Required NiagaraComponent object path OR an actor label/path carrying one

niagara_create_from_template

The HONEST authoring path: duplicate an existing template NiagaraSystem to a new content path and rename it. Since UE Python cannot build emitter graphs, template-instantiation is the supported creation verb (flagged with the engine-limit note). Non-idempotent (creates an asset); idempotent-by-path (returns created:false if the target exists).

ParameterTypeRequiredDescription
template_path string Required Content path of an existing NiagaraSystem to duplicate
dest_path string Required Destination content folder, e.g. "/Game/VFX"
name string Required Asset name for the new system
dry_run boolean Optional Preview the target path without duplicating Default: false.

niagara_list_components

Enumerate Niagara components on placed actors in the editor world (system path + active flag), optionally filtered by system substring or active-only, paginated — the "what VFX is currently in the scene" read tool.

ParameterTypeRequiredDescription
system_filter string Optional Only return components whose system path contains this substring
active_only boolean Optional Only return currently-active components Default: false.
limit integer Optional Max components to return Default: 50.
offset integer Optional Offset for pagination Default: 0.

niagara_param_list

List just the exposed USER parameters of a NiagaraSystem asset (name/type/is_data_interface) — the contract an agent needs before niagara_param_set. Cheaper focused variant of niagara_system_inspect. Exposed-parameter enumeration is UNCERTAIN-API; unresolved reflection is surfaced in warnings[].

ParameterTypeRequiredDescription
system_path string Required Content path of the NiagaraSystem asset

niagara_param_set

Set one USER variable on a live NiagaraComponent (float/int/bool/vec2/vec3/vec4/quat/color/position/object) and mark render state dirty. Named niagara_param_set to avoid colliding with the dormant satellite-plugin C++ niagara_set_param command; broadens value_type coverage. SET-SUCCESS: UE setters return void, so applied:true is reported ONLY when a setter probe ran without raising — otherwise ok:false + applied:false + a warning (never ok:true with an unapplied change).

ParameterTypeRequiredDescription
component string Required NiagaraComponent object path OR an actor label/path carrying one
param_name string Required User parameter name (with or without the "User." prefix)
value_type "float" | "int" | "bool" | "vec2" | "vec3" | "vec4" | "quat" | "color" | "position" | "object" Required Value type of the parameter
value any Required The value: number (float/int), bool, [x,y,z] arrays for vectors/color, or an object path string

niagara_place_actor

Place a PERSISTENT NiagaraActor in the level (survives save, undoable, selectable) with a system assigned — for level-dressing VFX an author wants to keep and re-edit, vs the transient niagara_spawn_transient. Non-idempotent. Surfaces asset_assigned as a set-success flag (ok:false if the system asset could not be assigned).

ParameterTypeRequiredDescription
system_path string Required Content path of the NiagaraSystem
location number[] Optional World location [x,y,z] Default: [0,0,0].
rotation number[] Optional Rotation [roll,pitch,yaw] degrees Default: [0,0,0].
scale number[] Optional Scale [x,y,z] Default: [1,1,1].
label string Optional Optional actor label for the placed NiagaraActor
dry_run boolean Optional Resolve the system without placing an actor Default: false.

niagara_set_user_param_default

Set the DEFAULT value of an exposed user parameter ON the system asset (persists to the saved asset), not just a live component — the param-pack vehicle for customizing instantiated templates. SET-SUCCESS: applied:true only when a setter ran on the exposed-parameter store; the store is UNCERTAIN-API so failures surface ok:false + applied:false + warnings, never a silent no-op. Optionally saves the asset.

ParameterTypeRequiredDescription
system_path string Required Content path of the NiagaraSystem asset
param_name string Required Exposed user parameter name
value_type "float" | "int" | "bool" | "vec2" | "vec3" | "vec4" | "quat" | "color" | "position" | "object" Required Value type of the parameter
value any Required The default value (same encoding as niagara_param_set)
save boolean Optional Save the asset after setting the default Default: false.

niagara_spawn_transient

Spawn a TRANSIENT (auto-destroy) Niagara system at a world location/rotation/scale — the workhorse placement verb for one-shot VFX. Non-idempotent (each call spawns a new component). Named niagara_spawn_transient to avoid colliding with the dormant satellite-plugin C++ niagara_spawn command; adds scale, auto_activate and dry_run. For a persistent, savable effect use niagara_place_actor.

ParameterTypeRequiredDescription
system_path string Required Content path of the NiagaraSystem to spawn
location number[] Optional World location [x,y,z] Default: [0,0,0].
rotation number[] Optional Rotation [roll,pitch,yaw] degrees Default: [0,0,0].
scale number[] Optional Scale [x,y,z] Default: [1,1,1].
auto_destroy boolean Optional Auto-destroy the component when the effect completes Default: true.
auto_activate boolean Optional Activate the effect immediately on spawn Default: true.
dry_run boolean Optional Resolve the system without spawning Default: false.

niagara_system_inspect

Dump a NiagaraSystem asset's structure: emitter handles (name/enabled/sim-target), exposed USER parameters (name/type/is_data_interface), data interfaces, fixed-bounds flag, warmup time and effect type. The inspection-first paired read for the VFX authoring tools. Emitter-handle and exposed-parameter reflection is UNCERTAIN-API in 5.7 — anything unresolved is reported in warnings[] rather than guessed.

ParameterTypeRequiredDescription
system_path string Required Content path of the NiagaraSystem asset

niagara_systems

List/paginate NiagaraSystem assets (path + name) under a content root via the AssetRegistry — the entry read for VFX discovery. Named niagara_systems to avoid colliding with the dormant satellite-plugin C++ niagara_list command; adds prefix + limit/offset pagination.

ParameterTypeRequiredDescription
path_prefix string Optional Content root to search under, e.g. "/Game/VFX" Default: "/Game".
limit integer Optional Max systems to return Default: 50.
offset integer Optional Offset for pagination Default: 0.

niagara_validate

PLUMB-style read-only check of a NiagaraSystem: GPU emitters without fixed bounds, missing effect type, no emitters. Returns categorised violations with severity; ok:false only on errors. Emitter reflection is UNCERTAIN-API — gaps are reported as info-level violations rather than false positives. (autofix not implemented this wave — fixed:[] always.)

ParameterTypeRequiredDescription
system_path string Required Content path of the NiagaraSystem to validate

Objects and reflection 6

object_exists

Existence probe: does an asset path, object path, or level-actor label resolve? Returns {exists, kind}. Cheap guard before a load/edit.

ParameterTypeRequiredDescription
target string Required Object/asset path or level-actor label to test for existence

object_get_property

Generic reflection read on any loadable UObject — replaces get_editor_property python_run pokes. Values are UE ExportText strings. PARAMS: `path` (object/asset path) + optional `names` — NOT widget_blueprint_path/widget_name; those belong to the ui_* tools. To reach a widget's slot, pass the slot's full object path as `path`.

ParameterTypeRequiredDescription
path string Required Object/asset path, e.g. /Game/Foo/MyAsset or a sub-object path
names any[] Optional Optional list of property names to read; omit to dump all editable (CPF_Edit) properties

object_inspect

Read the property tree of any live UObject by path (asset or object) or by level-actor label, filtered + paginated. The generic read-back primitive (actor_inspect is the richer level-actor variant). Differs from the legacy object_get_property (C++-backed, reads one CPF_Edit property by exact path, no actor-label resolution): use object_inspect to explore/discover an object's shape, object_get_property once you know the exact property path.

ParameterTypeRequiredDescription
target string Required Object path (e.g. "/Game/BP_Foo.BP_Foo_C") or a level-actor label
filter string Optional Case-insensitive substring filter on property names
limit integer Optional Max properties returned (pagination) Default: 80.
offset integer Optional Pagination offset Default: 0.

object_set_property

Generic reflection write on any loadable UObject (Modify + PostEditChange + MarkPackageDirty) — replaces set_editor_property python_run pokes. PARAMS: `path` (object/asset path) + `properties` (name to value map) — NOT widget_blueprint_path/widget_name/property; those belong to the ui_* tools. For textures prefer texture_set_settings; for material nodes prefer the material_* tools.

ParameterTypeRequiredDescription
path string Required Object/asset path
properties object (map) Required name to value map (numbers/strings/bools/arrays); set via reflection (HaybaReflection::SetProp)

reflect_class

Describe a UClass: python superclass chain (MRO) and CDO default-object attribute names, with values included for simple scalar types (str/int/float/bool) — so agents stop guessing class shapes before spawning/editing. (Class flags/interfaces need C++ reflection — not exposed to python.)

ParameterTypeRequiredDescription
class_path string Required Class name (e.g. "StaticMeshComponent") or full class path

reflect_search_types

Fuzzy-search the UE python type system (classes/structs/enums exposed on the unreal module) by name substring. Turns "what's the class called?" into one call.

ParameterTypeRequiredDescription
query string Required Case-insensitive substring to match against type names in the unreal module
limit integer Optional Max matches returned Default: 30.

PCG 47

create_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to pcg_create_graph.

Wrapped by hayba_create_pcg_graph (src/tools/create-pcg-graph.ts). Validates before creating; on validation failure returns {created:false, errors:[...]}. A read-only /Game/Hayba/Generated/<name> package is refused before anything is created or replaced (code package_read_only, data.make_writable_hint); the existing graph is kept.

ParameterTypeRequiredDescription
name string Required Asset name; non-alnum chars are collapsed to '_'. Saved under /Game/Hayba/Generated/<name>
graph object Required Graph payload: {nodes:[{id, class, position?:{x,y}, properties:{...}}], edges:[{fromNode|from, fromPin, toNode|to, toPin}]}

execute_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to pcg_execute_graph.

Wrapped by hayba_execute_pcg_graph (src/tools/execute-pcg-graph.ts). Game-thread marshaled. Returning success:true with componentsExecuted>0 is NOT proof that instances were placed — see the 2026-05-23 PCG/landscape postmortem.

ParameterTypeRequiredDescription
assetPath string Required UE object path to the PCGGraph asset

export_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to pcg_export_graph.

Wrapped by hayba_export_pcg_graph (src/tools/export-pcg-graph.ts). Game-thread marshaled.

ParameterTypeRequiredDescription
assetPath string Required UE object path to the PCGGraph asset (e.g. /Game/PCG/MyGraph.MyGraph)

get_node_details

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to pcg_get_node_details.

Wrapped by hayba_get_node_details (src/tools/get-node-details.ts) which prefers the cached catalog and falls back to this command.

ParameterTypeRequiredDescription
class string Required PCG settings class name; leading U/A prefix is stripped

hayba_abstract_to_subgraph

Extract a repeated node cluster into a reusable subgraph. Transforms the graph object in memory and writes nothing.

ParameterTypeRequiredDescription
graph string Required JSON string of the full PCGEx graph
nodeIds string[] Required Array of node IDs to extract into a subgraph
subgraphName string Optional Name for the extracted subgraph (default: SubGraph)

hayba_compatible_pins

Find catalog input pins that accept the type emitted by a specific PCG/PCGEx output pin.

ParameterTypeRequiredDescription
from_class string Required
from_pin string Required

hayba_create_pcg_graph

Author a new PCG graph asset from a node and edge description.

ParameterTypeRequiredDescription
graph string Required JSON string of the PCGEx graph topology
name string Required Asset name for the new PCGGraph

hayba_diff_against_working_asset

Compare a graph description against the asset currently in the project.

ParameterTypeRequiredDescription
wipGraph string Required JSON string of the work-in-progress graph
referenceAssetPath string Required Full UE asset path to the reference PCGGraph
diffMode "structural" | "properties" | "full" Optional What to diff (default: full)

hayba_diff_node_catalog_versions

Compare a prior PCG node catalog snapshot with the currently loaded catalog and report added, removed, and field-level modified classes.

ParameterTypeRequiredDescription
baseline_path string Required

hayba_execute_pcg_graph

Run a PCG graph so it generates content in the level.

ParameterTypeRequiredDescription
assetPath string Required Full UE asset path to execute

hayba_export_pcg_graph

Export an existing PCG graph as JSON so it can be inspected or transformed.

ParameterTypeRequiredDescription
assetPath string Required Full UE asset path to the PCGGraph

hayba_format_graph_topology

Render a graph as readable topology text.

ParameterTypeRequiredDescription
graph string Required JSON string of the PCGEx graph to layout. Edges accept either canonical (fromNode/fromPin/toNode/toPin) or legacy (from/fromPin/to/toPin) keys. Output nodes carry a position:{x,y} object; the C++ legacy handler reads that.
algorithm "layered" | "grid" Optional Layout algorithm (default: layered)
nodeWidth integer Optional Node width in pixels (default: 200)
nodeHeight integer Optional Node height in pixels (default: 100)
horizontalSpacing integer Optional Horizontal gap between layers (default: 150)
verticalSpacing integer Optional Vertical gap between rows (default: 80)
addCommentBlocks boolean Optional Wrap category clusters in PCGComment nodes

hayba_get_node_details

Full detail for one PCG/PCGEx node type: its exact input/output pins, properties and defaults.

ParameterTypeRequiredDescription
class string Required PCGEx node class name

hayba_get_pattern_template

Return a PCG/PCGEx graph template with read-only catalog preflight. Class and pin checks require live Unreal validation before building or cooking.

ParameterTypeRequiredDescription
intent string Required

hayba_get_pcgex_knowledge_detail

Read a PCGExKnowledge node, provider, asset, struct, or concept by exact ID from an optional local bundle. Documentation is a versioned snapshot, not installed UE truth.

ParameterTypeRequiredDescription
id string Required Exact C++ class ID, alias ID, concept ID, or plugin:concept ID

hayba_list_pcg_assets

List the PCG graph assets that exist in the project.

ParameterTypeRequiredDescription
path string Optional Content path filter (default: /Game/)

hayba_match_pin_names

Suggest the correct pin names for an edge between two nodes.

ParameterTypeRequiredDescription
fromClass string Required Source node class
fromPin string Required Pin name on source node (may be approximate)
toClass string Required Target node class to find a matching input pin on

hayba_parameterize_graph_inputs

Promote hard-coded values in a graph to named inputs. Transforms the graph object in memory and writes nothing.

ParameterTypeRequiredDescription
graph string Required JSON string of the PCGEx graph
targets object[] Required List of properties to promote to graph parameters

hayba_query_pcgex_docs

Search local PCGExKnowledge documentation for a node or concept, falling back to the Hayba catalog and registry.

ParameterTypeRequiredDescription
query string Required Node class name or keyword to search documentation
includeSourceSnippet boolean Optional Include up to 80 lines from the header file Default: false.

hayba_scrape_node_registry

Rebuild the PCGEx node registry from the installed plugin - the SQLite catalog that node search reads.

ParameterTypeRequiredDescription
pluginSourcePath string Optional Path to PCGExtendedToolkit/Source/ directory; required unless HAYBA_PCGEX_SOURCE is set
outputDbPath string Optional Output SQLite DB path (default: Resources/pcgex_registry.db)
forceRescan boolean Optional Force re-scan even if DB exists

hayba_search_node_catalog

Find a PCG or PCGEx node by what you want it to DO, searching the node catalog by intent rather than by exact type name.

ParameterTypeRequiredDescription
query string Required Search query — keyword, node class, or category

hayba_search_node_catalog_semantic

Rank PCG and PCGEx nodes by fuzzy intent using a CPU-local semantic vector over catalog descriptions, pins, properties, and categories.

ParameterTypeRequiredDescription
query string Required
k integer Optional Default: 10.

hayba_validate_attribute_flow

Trace attributes through a graph and report where the chain breaks.

ParameterTypeRequiredDescription
graph string Required JSON string of the PCGEx graph to validate attribute flow
strictMode boolean Optional If true, also flag orphan writes (written but never consumed)

hayba_validate_pcg_graph

Check a PCG graph for disconnected pins, type mismatches and dead branches WITHOUT cooking it.

ParameterTypeRequiredDescription
graph string Required JSON string of the PCGEx graph to validate

list_node_classes

Prefer hayba_search_node_catalog for ranked search; this is the raw enumeration.

ParameterTypeRequiredDescription
category string Optional Substring filter on derived category (Pathfinding, Clusters, Paths, Sampling, Topology, Tensors, Shapes, Layout, Spatial, Meta, FloodFill, Misc, PCG/Vanilla)

list_pcg_assets

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to pcg_list_assets.

Wrapped by hayba_list_pcg_assets (src/tools/list-pcg-assets.ts). Game-thread marshaled.

ParameterTypeRequiredDescription
path string Optional Recursive package path filter Default: "/Game/".

pcg_add_node

Add a node of a given PCG settings class to a graph. Returns node_index, settings_class, and node_label — node_label is now the friendly display title (e.g. "Shape : 3D Grid") when the HaybaPCGLibrary C++ helper is available, else it falls back to the settings-class name. For STABLE addressing pass either node_index or settings_class to pcg_wire/pcg_set_prop/pcg_remove_node (class-name and index addressing always work; friendly-title addressing depends on the node having an authored title). New nodes land at (0,0) — run pcg_layout afterward to arrange the graph. To remove a node use pcg_remove_node; to inspect its pins before wiring use pcg_list_pins.

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
settings_class string Required PCG settings class name, e.g. "PCGSurfaceSamplerSettings" or "PCGSubdivideSettings"

pcg_cook_and_wait

Regenerate an actor's PCGComponent, block on the PCG graph settling (NOT world_tick), and return per-mesh ISM instance counts — all in one call. [cost=high] [effects=[mutates_scene,gpu_load,wait]] USE_WHEN: after editing a PCG graph, to regenerate an actor AND read back instance counts in ONE call — PCGComponent.generate is async, so a plain generate reads 0 instances in the same call. GROUND TRUTH is result.ism[] ({mesh,count} per ISM) — trust this over pcg_read_node_output (a possibly-stale inspection cache). result.freshness {changed,before,after} proves the counts are from THIS cook, not a prior run. idle.timedOut:["pcg"] is EXPECTED/BENIGN for PCGEx async chains and does NOT mean the cook failed (see idle_note); when result.ism is non-empty the cook succeeded regardless of the pcg idle timeout NOT_WHEN: you only want to read existing instances without regenerating — use pcg_inspect_instances

ParameterTypeRequiredDescription
actor string Required Label or path of the actor owning the PCGComponent to cook
timeout_s integer Optional Hard timeout waiting for the PCG graph to settle Default: 120.

pcg_create_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to create_graph.

Alias of create_graph (the create-pcg-graph.ts wrapper dispatches the non-aliased form).

ParameterTypeRequiredDescription
name string Required
graph object Required

pcg_disconnect

Cut a single edge between two PCG nodes: pcg_disconnect(graph, from_node, from_pin, to_node, to_pin). Returns {ok:false, error} if no such edge exists (never a silent no-op). NON-IDEMPOTENT. To delete a whole node and all its wires use pcg_remove_node; to create a wire use pcg_wire.

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
from_node string | integer Required Source node title or index (or "Input" for the graph input node).
from_pin string Optional Source output pin label (default "Out"). Use pcg_list_pins to confirm. Default: "Out".
to_node string | integer Required Target node title or index (or "Output" for the graph output node).
to_pin string Optional Target input pin label (default "In"). Default: "In".

pcg_execute_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to execute_graph.

Alias of execute_graph (the execute-pcg-graph.ts wrapper dispatches the non-aliased form).

ParameterTypeRequiredDescription
assetPath string Required

pcg_export_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to export_graph.

Alias of export_graph (the export-pcg-graph.ts wrapper dispatches the non-aliased form).

ParameterTypeRequiredDescription
assetPath string Required

pcg_get_node

Read one PCG node's settings FULLY and UNtruncated: pcg_get_node(graph, node, path?). With `path` ("/"-nested, e.g. "config/fitting/scale_to_fit") returns that single value in full; without it dumps every readable property. Use when hayba_export_pcg_graph truncates a long struct string. Read-only.

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
node string | integer Required Node title (exact/substring) or 0-based index.
path string Optional Optional editor-property path on the node's settings, "/"-nested (e.g. "config/fitting/scale_to_fit"). Omit to dump every readable property.

pcg_get_node_details

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to get_node_details.

Alias of get_node_details (the get-node-details.ts wrapper dispatches the non-aliased form).

ParameterTypeRequiredDescription
class string Required PCG settings class name

pcg_inspect_instances

Read back the Instanced-Static-Mesh instance counts (and a sample transform) produced on an actor by its PCG cook.

ParameterTypeRequiredDescription
actor string Required Label or path of the actor owning the PCGComponent to inspect

pcg_layout

Auto-arrange a PCG graph left-to-right by dependency (layered/sugiyama: rank = longest path from a source, nodes y-stacked within a rank). Fixes the "every added node piled at (0,0)" mess. Idempotent. NOTE: node positions may only visibly update after the graph's asset-editor tab is closed and reopened.

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
x_spacing number Optional Horizontal gap between ranks (default 320). Default: 320.
y_spacing number Optional Vertical gap between nodes in a rank (default 180). Default: 180.

pcg_list_assets

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to list_pcg_assets.

Alias of list_pcg_assets (the list-pcg-assets.ts wrapper dispatches the non-aliased form).

ParameterTypeRequiredDescription
path string Optional Default: "/Game/".

pcg_list_node_classes

Alias of list_node_classes.

ParameterTypeRequiredDescription
category string Optional Substring filter on derived category

pcg_list_pins

List a PCG node's input and output pins with their exact labels and allowed types: pcg_list_pins(graph, node) to {inputs:[{label,type}], outputs:[{label,type}]}. Read-only. Use this BEFORE pcg_wire to get the exact pin label (labels are non-obvious, e.g. the graph Input node's output pin is "In", a spline sampler's input is "Spline").

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
node string | integer Required Node title (exact/substring) or 0-based index. Also accepts "Input"/"Output" for the graph I/O nodes.

pcg_read_node_output

Alias of read_node_output. STALE-READ WARNING: reads a possibly-STALE inspection cache, not live post-cook data — point_count:0 here is NOT ground truth. Use `pcg_cook_and_wait` result.ism[] for authoritative instance counts.

ParameterTypeRequiredDescription
assetPath string Required
nodeId string Required

pcg_remove_node

Remove a node from a PCG graph by title (settings-class name, exact/unambiguous-substring) or index. The node AND all its incident edges are deleted. Returns the surviving node list (index+label). NON-IDEMPOTENT: indices shift after removal, so re-fetch via hayba_export_pcg_graph before further edits. This is the destructive counterpart to pcg_add_node.

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
node string | integer Required Node to remove: settings-class title (exact or unambiguous substring) or 0-based index in graph.nodes. Ambiguous substrings error with the match count.

pcg_scatter_mesh

Scatter a mesh (or weighted mesh set) across a surface in ONE call — build the jittered PCG graph, spawn a bound PCGVolume, generate, and return instance counts. Hard-fails on 0 instances. [cost=high] [effects=[mutates_scene,gpu_load,wait]] USE_WHEN: to scatter a mesh (or weighted mesh set) across a surface in ONE call — builds the jittered PCG graph, spawns a bound PCGVolume, generates, and returns the instance count. Fails loud on 0 instances. NOT_WHEN: you already have a placed PCGVolume and only want to regenerate/read it back — use pcg_cook_and_wait

ParameterTypeRequiredDescription
area_or_landscape string Required Label or path of the surface source actor (Landscape/LandscapeProxy) the scatter samples
mesh string Optional Single StaticMesh path. Provide this OR `meshes`, not both.
meshes object[] Optional Weighted mesh list; overrides `mesh` when supplied.
density number Optional Points per squared meter for the surface sampler Default: 0.5.
scale_min number Optional Min uniform scale factor Default: 0.9.
scale_max number Optional Max uniform scale factor Default: 1.2.
yaw_jitter number Optional Max random yaw in degrees, added per point Default: 360.
seed integer Optional Deterministic seed for sampler + transform jitter Default: 1337.
volume_scale number Optional Uniform scale applied to the spawned PCGVolume (its cube bounds define the generation domain) Default: 100.
graph_name string Optional Base name for the generated PCGGraph asset Default: "HaybaScatter".
timeout_s integer Optional Hard timeout waiting for the PCG graph to settle Default: 120.

pcg_set_prop

Set an editor property on a PCG node's settings. Supports nested struct paths like "distribution_settings/distribution".

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
node string | integer Required Node title (exact/substring) or 0-based index in the graph
path string Required Editor-property path on the node's settings. Supports nested struct paths with "/", e.g. "distribution_settings/distribution".
value any Required Value to set. Scalars (number/bool/string/array) set directly. Enum properties accept the member name ("AllWorldActors" or "ALL_WORLD_ACTORS"), a qualified "EEnum::Member", or an int. Struct properties accept a JSON object (coerced field-by-field, recursively) or a positional array (e.g. [x,y,z] for a Vector). PCG attribute selectors (e.g. a filter's target_attribute) accept a bare attribute name "WallDist", a property "$Density", or a full "PCGBegin(...)PCGEnd" string.

pcg_validate_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to validate_graph.

Alias of validate_graph (the validate-pcg-graph.ts wrapper dispatches the non-aliased form).

ParameterTypeRequiredDescription
graph object Required

pcg_wire

Wire one PCG node's output pin to another node's input pin (by node title or index, and pin label). Pin names are VALIDATED first: if from_pin/to_pin does not exist on the node, no wire is created and the result is {ok:false, error, valid_from_pins, valid_to_pins} — it never silently drops the edge. Use pcg_list_pins to discover exact labels. To cut an existing edge use pcg_disconnect.

ParameterTypeRequiredDescription
graph string Required PCG graph asset path
from_node string | integer Required Source node title or index. Use "Input" to wire from the graph's input node (its output pin is usually labelled "In").
from_pin string Optional Source output pin label (default "Out") Default: "Out".
to_node string | integer Required Target node title or index. Use "Output" to wire into the graph's output node.
to_pin string Optional Target input pin label (default "In"). NOTE: the visible "Map" pin on PCGEx Staging is internally "CollectionSource" — introspect first if unsure. Default: "In".

read_node_output

STALE-READ WARNING: reads a possibly-STALE inspection CACHE, not live post-cook data. point_count can report 0 (or a prior run's numbers) while the cook actually produced real instances — do NOT treat point_count:0 here as ground truth. GROUND TRUTH for instance counts is `pcg_cook_and_wait` result.ism[] (with result.freshness.changed proving this cook). Returns zero counts if the graph has not been executed. FOLLOW-UP (C++): make this read live post-cook data or return an explicit {stale:true} flag.

ParameterTypeRequiredDescription
assetPath string Required UE object path to the PCGGraph asset
nodeId string Required Node id from the export_graph payload (e.g. 'node_003')

validate_graph

Plugin command. hayba_invoke passes it straight to the editor plugin. Also answers to pcg_validate_graph.

Wrapped by hayba_validate_pcg_graph (src/tools/validate-pcg-graph.ts). Pure validation — does not touch UE world state.

ParameterTypeRequiredDescription
graph object Required Same graph payload shape as create_graph

Physics 3

physics_add_impulse

Applies an impulse to a primitive component in the editor world and reports the resulting linear velocity. A component that is not simulating physics discards an impulse silently, so that case is REFUSED with a message naming the fix rather than answering applied:true — the old reply was true of the call and false of the world. Turn simulation on with physics_set_simulate first.

ParameterTypeRequiredDescription
actor_id string Required
impulse any[] Required [x,y,z]. Fewer than three numbers is rejected rather than zero-filled.
velocity_change boolean Optional true applies the vector as a velocity change, ignoring mass
component_name string Optional

physics_set_collision_profile

Assigns a named collision profile to one primitive component and READS IT BACK. An unrecognised name leaves the component on whatever it had, so a mismatch between requested_profile and profile is returned as an error naming the current setting rather than as a success. Names come from the project Collision settings, e.g. BlockAll, NoCollision, Pawn. This SETS a profile; to find out what is currently intersecting what, use scene_validate_physics.

ParameterTypeRequiredDescription
actor_id string Required
profile_name string Required A profile from Project Settings > Collision, e.g. BlockAll, OverlapAllDynamic, NoCollision
component_name string Optional Defaults to the root primitive component

physics_set_simulate

Turns rigid-body simulation on or off for one primitive component in the EDITOR world. The reply reads the flag back off the component rather than repeating the request, so a component that cannot simulate (no collision, no body instance) is visible as simulating:false with ok:true. Editor-world only: this is not how you drive physics during PIE.

ParameterTypeRequiredDescription
actor_id string Required Actor name or editor label in the current editor world
enabled boolean Required
component_name string Optional Which primitive component. Omitted means the root component, falling back to the first primitive component found.

Plans 3

hayba_initiate_infrastructure_brainstorm

Plan complex graph architectures. IMPORTANT: After calling this tool, do NOT call hayba_create_pcg_graph, hayba_validate_pcg_graph, or any graph-mutation tool until the user explicitly approves an approach from the proposal.

ParameterTypeRequiredDescription
topic string Required The infrastructure or system design topic to brainstorm
context string Optional Additional context about the project or constraints
constraints string[] Optional Explicit constraints or requirements

hayba_mark_plan_step

Update the status of a single step in the proposed plan shown in the UE Plan panel. Marking a step "completed" auto-advances the next step to "running". Call this as you work through an approved plan so the user sees live progress.

ParameterTypeRequiredDescription
index integer Required Zero-based index of the plan step to update
status "running" | "completed" | "failed" Optional New status for the step (default "completed") Default: "completed".

hayba_propose_plan

Propose a concrete, reviewable plan before destructive operations. Required when Plan Mode is on. Approval follows the configured per-plan or per-command scope; it is not an exact operation approval. Steps may be strings or {title, description, tool} objects.

ParameterTypeRequiredDescription
steps string | object[] Required Ordered list of plan steps
await_seconds integer Optional How long the agent will wait for human approval (informational; default 30)

PLUMB constraints 23

plumb_constraint_define

Author/upsert a bound constraint: a primitive id + params + a binding (exactly one of {asset, tag}). Validated against the closed primitive set — invalid primitives/params/bindings are rejected.

ParameterTypeRequiredDescription
id string Required
primitive string Required One of the closed primitive ids (see plumb_primitives)
params object (map) Optional
binding object Required Exactly one of {asset, tag}
hard boolean Optional Override the primitive default hard/soft
note string Optional
refs string[] Optional

plumb_constraint_list

List the constraint library (optionally filtered to an asset binding).

ParameterTypeRequiredDescription
asset string Optional Filter to constraints bound to this asset/tag context

plumb_constraint_propose

Draft (does not save) constraints for an asset from its baked profile, using only closed primitives. Review/edit then call plumb_constraint_define.

ParameterTypeRequiredDescription
asset string Required

plumb_constraint_remove

Remove a constraint from the library by id.

ParameterTypeRequiredDescription
id string Required

plumb_grammar_expand

Expand a seed symbol using the stored production rules + the PLUMB constraint store as guards. Returns a PlacementPlan. In dry-run (no UE scene), geometry-dependent constraints self-skip — rejections only reflect TS-evaluable constraints.

ParameterTypeRequiredDescription
seed object Required Seed symbol to expand from

plumb_lesson_add

Add/update a lesson — the durable [[slug]] knowledge that explains WHY a constraint exists (browsed in the Studio Lessons panel; cited by constraint/validator refs).

ParameterTypeRequiredDescription
slug string Required kebab/snake-case id, matches [[slug]] refs
title string Required
body string Required Human-readable explanation of the lesson
refs string[] Optional Related slugs or asset paths
tags string[] Optional

plumb_lesson_remove

Remove a lesson by slug.

ParameterTypeRequiredDescription
slug string Required

plumb_mask_add

Add or update a mask (surface = triangle set; volume = translucent shape) on a baked profile. Surface/volume masks are the regions constraints reference.

ParameterTypeRequiredDescription
asset string Required
id string Required
type "surface" | "volume" Required
color string Optional
source "ai" | "human" Optional
confidence number Optional
locked boolean Optional
triangles integer[] Optional
shape object Optional
detail string Optional

plumb_mask_remove

Remove a mask from a profile by id.

ParameterTypeRequiredDescription
asset string Required
mask_id string Required

plumb_primitives

List the COMPLETE closed constraint grammar — the 10 primitives, their gate, hard/soft default, params, and docs. Author constraints by picking one and filling params.

No parameters.

plumb_production_define

Author/upsert a grammar production rule: an LHS symbol kind (+ optional attribute guards) to an RHS sequence of emit ops (shell/asset/symbol/scatter/decal/fill). Guards are constraint ids that must pass before the production fires.

ParameterTypeRequiredDescription
id string Required
lhs object Required
rhs object[] Required
guards string[] Optional Constraint ids that must pass before this production fires
priority number Required Higher priority = tried first when multiple productions match

plumb_profile_annotate

Layer AI/human qualitative semantics (class, up/front vectors, named affordance regions) onto a baked profile, with optional field locks. Qualitative constraints can only hard-gate on locked fields.

ParameterTypeRequiredDescription
asset string Required
cls string Optional Semantic class, e.g. "tree", "door"
up [number, number, number] Optional Local up vector
front [number, number, number] Optional Local front vector (drives the `facing` primitive)
affordances object[] Optional Named local-space regions, e.g. door swing / seat
lock string[] Optional Field paths to lock so qualitative constraints may hard-gate, e.g. ["semantics.front", "affordance:swing"]

plumb_profile_bake

Bake the deterministic geometry/physics half of a Physical Asset Profile. Pass just the asset to auto-fetch bounds from UE (mesh_get_info), or supply origin_cm + extent_cm (+ optional pivot_to_base_cm) explicitly. Persists to the profile store.

ParameterTypeRequiredDescription
asset string Required Asset path, e.g. /Game/Meshes/SM_GiantTree_01
origin_cm [number, number, number] Optional AABB centre in cm (UE units). Omit to auto-fetch via mesh_get_info.
extent_cm [number, number, number] Optional AABB half-extent in cm. Omit to auto-fetch via mesh_get_info.
pivot_to_base_cm number Optional Pivot to base offset in cm (negative when the pivot is above the visible base, e.g. SM_GiantTree_01 ≈ -380). Auto-derived from bounds.min.z when omitted.
mass_kg number Optional
com_cm [number, number, number] Optional Local centre of mass in cm
footprint_cm [number, number][] Optional Convex base footprint, local XY in cm; defaults to the AABB box
profile_archetype string Optional Archetype tag, default "rigid_prop"

plumb_profile_get

Fetch one full Physical Asset Profile by asset path.

ParameterTypeRequiredDescription
asset string Required

plumb_profile_list

List baked profiles (asset_id, archetype, affordance count, locked fields). Feeds the Memory tab.

No parameters.

plumb_segment

AI-segment a studied asset: given the study_render color passes, the agent's themed part labels + a box/points per view, runs SAM in the visual sidecar and back-projects to geometry-hugging surface masks (triangles via the world-position pass + a UV display texture), written into the profile. Replaces hand-placed blocky masks.

ParameterTypeRequiredDescription
asset string Required Asset whose profile receives the masks (must be baked).
study_dir string Required study_render output dir (.scratch/study/<assetSafe>/).
parts object[] Required Themed parts the agent proposes, each with a box/points per view it sees them in.
vote_threshold integer Optional Min per-triangle multi-view votes to keep (default 1).

plumb_socket_add

Add or replace a socket (connection point) on a baked profile. Idempotent on socket id.

ParameterTypeRequiredDescription
asset string Required Asset path the socket belongs to (must have a baked profile)
socket object Required

plumb_study

AI study entry point: returns the asset's baked profile (if any) + the closed primitive grammar + mask kinds + guidance, so the agent can propose masks (plumb_mask_add) and constraints (plumb_constraint_define).

ParameterTypeRequiredDescription
asset string Required

plumb_study_take

Drain pending "Study with AI" requests from the Semantic Studio button. Returns the assets to study (then call plumb_study + author masks/constraints for each).

No parameters.

plumb_validate

VERIFY PLACEMENT IS ACTUALLY CORRECT: runs the PLUMB constraint library over a set of instances and returns a directional Verdict — per-gate ok, signed value_m (how far off, and which way), and a FixVector telling you exactly how to move each instance to satisfy it. Catches grounding, clearance, alignment, spacing and interpenetration violations the viewport would reveal but you cannot. Hard fails set stopped_at; soft fails accumulate soft_cost. WHY: this is the quantified check that turns "looks placed" into "provably grounded and non-overlapping".

ParameterTypeRequiredDescription
instances object[] Required Instances to validate (object id + optional asset/tags + transform)
constraint_ids string[] Optional Restrict to these library constraint ids; default = all enabled
write_overlay boolean Optional Also write per-instance results to .scratch/verdicts.json for the plan-mode viewport overlay
record_findings boolean Optional Record constraint failures as validator findings in the unified Validation surface (default true)

Project 4

project_get_info

Where this project is on disk and which engine built it. Call it before any path-building work rather than guessing a content root, and to resolve the Saved/ directory the editor log lives in. Takes no parameters.

No parameters.

project_get_settings

Reads UGeneralProjectSettings — the identity fields shown on the Project Settings > Description page — plus the editor startup map. Read-only; use project_set_settings to change any of them. Fields that were never filled in come back as empty strings, not as missing keys.

No parameters.

project_list_plugins

Every ENABLED plugin, engine and project alike, with its version and category. This is the reliable way to answer 'is Water/PCG/Niagara available here' before calling a domain that needs one — a capability probe against reality rather than an assumption. Disabled plugins are not listed at all.

No parameters.

project_set_settings

Writes project identity settings to the ini files, in two modes: pass section+key+value to write any ini key directly, or pass any of the named fields to write DefaultGame.ini. It flushes to disk immediately — this edits config the whole team shares, so prefer project_get_settings first. Values are strings in both modes.

ParameterTypeRequiredDescription
section string Optional Raw-ini mode: the ini section, e.g. /Script/EngineSettings.GameMapsSettings. Requires key and value; writes GEngineIni and takes precedence over the named fields below.
key string Optional Raw-ini mode: the ini key. Only with section + value.
value string Optional Raw-ini mode: the value to write. Only with section + key.
project_name string Optional Named mode: written to DefaultGame.ini
company_name string Optional
description string Optional
homepage string Optional
project_version string Optional
company_distinguished_name string Optional
project_id string Optional
support_contact string Optional
copyright_notice string Optional

Python 1

python_run

Execute a Python script inside UE via PythonScriptPlugin. Universal escape hatch for invoking any UE command not otherwise exposed.

ParameterTypeRequiredDescription
script string Required Python source to execute. Runs in a FRESH namespace per call (__name__ == "__hayba_user__"): nothing is pre-imported, so `import unreal` explicitly, and no state survives from a previous python_run. Only print() output and stderr come back — assign nothing and you observe nothing.
allow_unsafe boolean Optional Deprecated compatibility field; accepted but always ineffective. Embedded python_run permanently refuses Tier 3 host filesystem, subprocess, and network access. Use typed brokered tools (#412/#415).
deadline_s number Optional Cooperative deadline in seconds (default 5, max 60). Above 5 requires an exclusive lease on the current world (lease_acquire mode:"exclusive"); otherwise the editor refuses it with HCR-TIME-002.
world_partition boolean Optional Set true when the script loads or unloads World Partition actors. The editor then skips its global undo transaction, which WP unloads corrupt (UTransBuffer non-zero active count, then a Landscape crash). Scripts using WorldPartitionEditorLoaderAdapter / load_actors / unload_actors are detected automatically.
transaction boolean Optional false = do not wrap this call in an editor undo transaction (no Ctrl+Z for it). Default true.
read_only boolean Optional Declare that the script only reads. The editor then treats it as a read for leases. Undeclared scripts conflict with every other owner's lease (X on global) under EnforcedForWrites.
resources string | object[] Optional Declare what the script writes (same forms as lease_acquire, e.g. "asset:/Game/Props/SM_Rock"). A declared script conflicts only with leases on those resources.

Sequencer 11

seq_bind_actor

Possess a level actor (by label or path) in the sequence and return its binding GUID — the prerequisite handle for all per-actor tracks. Idempotent by actor label (reuses an existing binding). Probes seq.add_possessable then MovieSceneSequenceExtensions.add_possessable.

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence
actor string Required Actor label or full path of the level actor to possess
dry_run boolean Optional Resolve the actor without adding the binding Default: false.

seq_camera_cut

Add a camera-cut section binding a camera actor over a time range (seconds) — how a shot gets its camera. Possesses the camera, ensures a master camera-cut track, and sets the section range + camera binding id. Named seq_camera_cut to avoid colliding with the dormant satellite-plugin C++ seq_add_camera_cut command.

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence
camera_actor string Required Camera actor label or path to cut to
start_seconds number Required Cut start time (seconds)
end_seconds number Required Cut end time (seconds)
dry_run boolean Optional Resolve the camera without adding the cut Default: false.

seq_inspect

Read-back full sequence state: display frame rate, tick resolution, duration (seconds), master tracks, and a paginated list of bindings with per-binding track counts. The inspection-first paired read for the authoring tools (analogue of the C++ seq_get_info, python-only so it works without the satellite plugin).

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence
limit integer Optional Max bindings to return Default: 50.
offset integer Optional Binding offset for pagination Default: 0.

seq_list

List/paginate LevelSequence assets under a content root (via the AssetRegistry) with per-sequence master-track and binding counts — discovery before any edit.

ParameterTypeRequiredDescription
path_filter string Optional Content root to search under, e.g. "/Game/Cinematics" Default: "/Game".
limit integer Optional Max sequences to return Default: 30.
offset integer Optional Offset for pagination Default: 0.

seq_list_bindings

Paginated read of a sequence's bindings — GUID, display name, kind and possessed object class — the map an agent needs to find GUIDs for keyframing.

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence
limit integer Optional Max bindings to return Default: 50.
offset integer Optional Offset for pagination Default: 0.

seq_new

Create a new LevelSequence asset at a content path (the entry point for every cinematic), setting its display frame rate and saving. Idempotent by asset path (returns created:false if it already exists). Named seq_new to avoid colliding with the dormant satellite-plugin C++ seq_create command.

ParameterTypeRequiredDescription
path string Required Content folder for the new sequence, e.g. "/Game/Cinematics"
name string Required Asset name for the LevelSequence, e.g. "LS_Intro"
frame_rate number Optional Display frame rate (fps), default 30 Default: 30.
dry_run boolean Optional Preview the target asset path without creating it Default: false.

seq_open

Open a LevelSequence in the Sequencer editor for human review or before render (analogue of the dormant C++ seq_play). Probes LevelSequenceEditorBlueprintLibrary.open_level_sequence then AssetEditorSubsystem.

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence to open in Sequencer

seq_playback_range

Set the sequence playback in/out range in seconds (defines what renders and plays). Idempotent set-to-value. Probes set_playback_start_seconds/set_playback_end_seconds then a display-rate frame fallback. Named seq_playback_range to avoid colliding with the dormant satellite-plugin C++ seq_set_playback_range command.

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence
start_seconds number Required Playback in point (seconds)
end_seconds number Required Playback out point (seconds)

seq_track_add

Add a track (transform/float/visibility/camera_cuts/audio/event) to a binding (via binding_guid) or as a master track, returning the track id and class. Named seq_track_add to avoid colliding with the dormant satellite-plugin C++ seq_add_track command.

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence
track_type "transform" | "float" | "visibility" | "camera_cuts" | "audio" | "event" Required Track type to add
binding_guid string Optional Binding GUID for a per-actor track; omit for a master track
dry_run boolean Optional Report the resolved track class without adding it Default: false.

seq_transform_keyframe

Keyframe location/rotation/scale on a possessed actor's transform track at a time (seconds), creating the track/section if absent. Closes the C++ gap where the dormant seq_add_keyframe is float-only. Channels resolved by name prefix (Location/Rotation/Scale) + axis suffix; keys authored in tick resolution.

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence
binding_guid string Required Binding GUID of the possessed actor to keyframe
time_seconds number Required Time (seconds) at which to place the key
location number[] Optional World location [x,y,z]
rotation number[] Optional Rotation [roll,pitch,yaw] degrees
scale number[] Optional Scale [x,y,z]

seq_validate

PLUMB-style read-only check of a sequence: dangling bindings (no tracks), empty tracks (no sections), sections out of the playback range, missing/empty camera cut, zero-length playback. Returns categorised issues with severity; ok:false only on errors. (autofix not implemented this wave — fixed:[] always.)

ParameterTypeRequiredDescription
asset_path string Required Content path of the LevelSequence to validate

Slivers 4

hayba_sliver_get

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Get the full spec (params + determinism + executor) of an installed sliver by id.

ParameterTypeRequiredDescription
id string Required

hayba_sliver_import

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Install a sliver from a local file path or an http(s) URL into the user sliver library.

ParameterTypeRequiredDescription
source string Required

hayba_sliver_list

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

List installed Slivers (deterministic abstractions). Optional category or namespace filter.

ParameterTypeRequiredDescription
category string Optional
namespace string Optional

hayba_sliver_run

Not callable through hayba_invoke. Load its pack with hayba_pack_load first.

Execute a sliver with concrete parameter values. Returns outputs + declared side_effects + durationMs.

ParameterTypeRequiredDescription
id string Required
params object (map) Optional Default: {}.

Splines 5

spline_add_point

Append a point to a spline, or insert it at `index`. Returns the new point_count, which is the index bound for spline_set_point and spline_remove_point.

ParameterTypeRequiredDescription
actor_id string Required
location any[] Required
index integer Optional

spline_create

Create a spline actor at a location. The spline starts empty — add its shape with spline_add_point. Splines drive roads, rivers, fences, cable runs and PCG spline samplers.

ParameterTypeRequiredDescription
label string Required
location any[] Optional

spline_get_info

Read a spline's point count, total length and every point's position. The read half of spline editing — call it before set/remove so indices refer to what you think they do.

ParameterTypeRequiredDescription
actor_id string Required

spline_remove_point

Delete a spline point by index. Indices of later points SHIFT DOWN afterwards, so remove from the end backwards when deleting several.

ParameterTypeRequiredDescription
actor_id string Required
index integer Required

spline_set_point

Move an existing spline point to a new location, addressed by index. Use spline_get_info first to see the current points — an out-of-range index fails rather than appending.

ParameterTypeRequiredDescription
actor_id string Required
index integer Required
location any[] Required

Static meshes 12

mesh_audit

WHICH MESHES ARE COSTING FRAME TIME: static meshes with LOD0 triangle counts, LOD count, material slot count and how many things reference them. USE_WHEN: a scene is heavy and you need to know where the triangles and draw calls actually are.

ParameterTypeRequiredDescription
top_n integer Optional How many of the heaviest meshes to return. Default 25, max 500.

mesh_extract

Reads back mesh geometry + topology health numerically (welds/winding/holes a screenshot can't confirm). Primary source is actor_label to UDynamicMeshComponent (e.g. PCG grammar shell). Stats are over the whole mesh; raw arrays are opt-in and bounded. For a verdict-only call use mesh_topology_stats (arrays forced off).

ParameterTypeRequiredDescription
actor_label string Optional Editor actor label; reads its UDynamicMeshComponent (primary source for PCG dynamic-mesh output). Provide this OR path, not both.
component_index number Optional Which UDynamicMeshComponent on the actor (default 0)
component_name string Optional Match the dynamic mesh component by name instead of index
path string Optional UStaticMesh asset path (/Game/...) — alternative source (render data: counts + bounds + optional arrays)
lod number Optional StaticMesh LOD to read (default 0); ignored for dynamic mesh
include_triangles boolean Optional Include the triangles index array [[i,j,k],...] (bounded by max_elements)
include_positions boolean Optional Include the vertices array [[x,y,z],...] (bounded by max_elements)
include_normals boolean Optional Include computed per-triangle face normals (dynamic mesh only)
max_elements number Optional Hard cap on emitted array elements (default 2000); stats are always over the whole mesh
bbox_min any[] Optional [x,y,z] local-space AABB min; with arrays requested, only emit triangles whose centroid is inside the box
bbox_max any[] Optional [x,y,z] local-space AABB max

mesh_get_bounds

Read a StaticMesh's local bounds: origin, box extent, sphere radius, and min/max corners (cm). The cheap standalone sizing readback (BoxSphereBounds), distinct from the C++ mesh_get_info bounds used by the physical-asset baker.

ParameterTypeRequiredDescription
asset_path string Required Content path of the StaticMesh

mesh_get_info

Plugin command. hayba_invoke passes it straight to the editor plugin.

Triangle and vertex counts, the LOD chain with its screen sizes, material slots and local bounds for one static mesh. Called from TS by the physical-asset baker and world_generate for bounds, so it is documented here rather than surfaced as its own agent tool: agents should reach for mesh_get_bounds / mesh_get_lods / mesh_get_materials, which split the same information and do not load the asset whole.

ParameterTypeRequiredDescription
path string Required Object path of a UStaticMesh, e.g. /Engine/BasicShapes/Cube.Cube

mesh_get_lods

Report a StaticMesh's LOD count and per-LOD triangle/vertex counts (StaticMeshEditorSubsystem, falling back to EditorStaticMeshLibrary). Degrades to lod_count with null tri/vert when the per-LOD getters are unavailable on this build.

ParameterTypeRequiredDescription
asset_path string Required Content path of the StaticMesh

mesh_get_materials

List a StaticMesh's material slots: slot index, slot name, and the assigned material asset path (from static_materials). The map an agent reads before mesh_set_material_slot.

ParameterTypeRequiredDescription
asset_path string Required Content path of the StaticMesh

mesh_get_sockets

List a StaticMesh's named sockets with relative transform (location/rotation/scale) — the attachment points an agent needs before snapping child actors onto a mesh. Reads the `sockets` property defensively.

ParameterTypeRequiredDescription
asset_path string Required Content path of the StaticMesh, e.g. "/Game/Meshes/SM_Rock"

mesh_list

Enumerate static meshes from the asset registry without loading any of them — the cheap way to find something to place or inspect. Always pass path_prefix on a real project unless you actually want engine content in the results. Exact subclasses only, so a mesh subclass is not listed.

ParameterTypeRequiredDescription
path_prefix string Optional Keep only assets whose object path starts with this, e.g. /Game/LanternPuzzle. Omitted means every static mesh the registry knows, engine content included.

mesh_list_dynamic

Enumerate every UDynamicMeshComponent in the editor level with tri/vert/material counts — replaces the hand-rolled 'loop all actors to DynamicMeshComponent to tris' python_run for inspecting PCG/grammar output. Pair with mesh_topology_stats(actor_label=...) for a full weld/manifold verdict on a specific one.

ParameterTypeRequiredDescription
label_contains string Optional Only list components on actors whose label contains this substring

mesh_set_lod

Sets a LOD's screen size (and optionally its reduction target) on a static mesh, then rebuilds it. Returns ok, path, lod_index, screen_size and reduction_percent_triangles readback. Plan Mode gated and transactional. Editor-only, and it modifies the asset — save it afterwards. It REFUSES a mesh with any zero-UV LOD, because the rebuild would hit an engine assert and take the editor down with it; that refusal is a real limit of the asset, not a bug in this command.

ParameterTypeRequiredDescription
path string Required Object path of the UStaticMesh
lod_index number Required Which source model; must be within lod_count from mesh_get_info
screen_size number Required Screen size at which this LOD takes over
reduction_percent_triangles number Optional Optional triangle-reduction target for this LOD

mesh_set_material_slot

Assign a material/MaterialInstance asset to a StaticMesh material slot by index, saving the mesh and reading back the applied material path. Probes StaticMeshEditorSubsystem.set_material then the static_materials array. Idempotent set-to-value (assigning the same material twice is the same state). Sets the material ASSET on the slot — use material_* tools to edit the graph.

ParameterTypeRequiredDescription
asset_path string Required Content path of the StaticMesh to modify
slot_index integer Required Material slot index to set
material_path string Required Content path of the material/MaterialInstance to assign

mesh_topology_stats

Stats-only alias of mesh_extract (raw geometry arrays forced off). Use to get a fast weld/winding/holes verdict: non_manifold_vertices==0 && degenerate_triangles==0 && connected_components==1 && a small explainable boundary_edges == healthy.

ParameterTypeRequiredDescription
actor_label string Optional Editor actor label; reads its UDynamicMeshComponent
component_index number Optional Which UDynamicMeshComponent (default 0)
component_name string Optional Match component by name instead of index
path string Optional UStaticMesh asset path (alternative source)
lod number Optional StaticMesh LOD (default 0)

Textures 5

texture_audit

WHICH TEXTURES ARE COSTING MEMORY: every Texture2D ranked by resource size, with dimensions, format, LOD group and compression, and a flag where the name implies a role the compression contradicts. USE_WHEN: chasing memory or load times. NOT_WHEN: inspecting one texture you already know about (texture_get_info).

ParameterTypeRequiredDescription
top_n integer Optional How many of the heaviest textures to return. Default 25, max 500. The scan covers every Texture2D regardless.

texture_get_info

Inspect a Texture2D: dimensions, source/platform format, mip count, compression settings, LOD group, sRGB, never-stream, address modes.

ParameterTypeRequiredDescription
path string Required Texture asset path, e.g. /Game/Tex/T_Rock

texture_list

List Texture2D assets, optionally filtered by path prefix.

ParameterTypeRequiredDescription
path_prefix string Optional Only list textures whose path starts with this, e.g. /Game/Tex

texture_set_compression

Set a texture's compression (TC_*) and optionally LOD group + sRGB. Re-imports the texture resource. For other properties (mip gen, max size, filter, address, ...) use texture_set_settings.

ParameterTypeRequiredDescription
path string Required Texture asset path
compression_settings string Required TextureCompressionSettings, e.g. Normalmap / Masks / Default (TC_ prefix optional)
lod_group string Optional TextureGroup, e.g. World / WorldNormalMap (TEXTUREGROUP_ prefix optional)
srgb boolean Optional sRGB flag

texture_set_settings

Set any texture properties at once via reflection. Aliases: compression_settings, lod_group, srgb, never_stream, address_x, address_y, mip_gen_settings, max_texture_size, flip_green_channel, filter, virtual_texture_streaming, lod_bias. Any raw UTexture UPROPERTY name also works. Re-imports the resource after applying.

ParameterTypeRequiredDescription
path string Required Texture asset path
properties object (map) Required Settings to set, e.g. { compression_settings: "Normalmap", srgb: false, mip_gen_settings: "Sharpen4" }

UMG widgets 31

ui_add_element

Add a widget (Button/TextBlock/Image/panel/…) to an existing Widget Blueprint tree, optionally under a named panel, with slot layout props. Marks the BP structurally modified + dirty.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
child_class string Required Widget class — short name (Button, TextBlock, CanvasPanel, HorizontalBox, …) or full class path
parent_widget_name string Optional Name of an existing PANEL widget to parent under; defaults to the root panel
name string Optional Name for the new widget (auto-generated if omitted)
slot_props object (map) Optional Slot layout props: x/y/w/h (canvas), fill/padding (box); other keys set on the slot by reflection

ui_bind_event

Make a widget react to input: bind a widget event (Button OnClicked, OnHovered, OnPressed) to an event node in its Widget Blueprint, then wire the node's "then" pin to what should happen. Idempotent - binding again returns the existing node. Expose the widget with ui_set_variable and compile first.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint that owns the widget, e.g. /Game/UI/WBP_Title
widget_name string Required The widget whose event fires, e.g. "StartButton". It must be exposed as a variable first (ui_set_variable) and the blueprint compiled.
event_name string Required The event to bind — "OnClicked" for a click. A wrong name is refused with the list of events the widget has.
graph_name string Optional Event graph to place the node in; omit for the main one
x number Optional Node position in the graph
y number Optional Node position in the graph

ui_bind_property

Bind a widget property (Text, ToolTipText, Visibility, bIsEnabled) to a blueprint variable - the designer Bind dropdown. This is how a reusable pure-Blueprint component gets a settable caption without a C++ base class. Omit variable_name to clear the binding.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Widget whose property is being bound (e.g. "Chip_Label"). Marked Is Variable automatically — a binding cannot resolve otherwise.
property_name string Required Bindable property on that widget, WITHOUT the "Delegate" suffix — "Text", "ToolTipText", "Visibility", "bIsEnabled". Rejected with the expected delegate name if the property is not bindable.
variable_name string Optional Blueprint variable to drive the property. Create it first with blueprint_add_variable (type "text" for a Text property). OMIT to CLEAR an existing binding.

ui_build_tree

Build a whole widget subtree from one nested spec - {class, name?, properties?, slot_props?, children?}. One call instead of one ui_add_element per widget. Depth-first in order; on failure the widgets already created are KEPT and named in the error so you can see exactly how far it got.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
parent_widget_name string Optional Existing panel to build under. Defaults to the root panel.
tree object | object[] Required A node, or an array of sibling nodes, each {class, name?, properties?, slot_props?, children?}. Built depth-first in order. On failure the widgets created before the failing node are KEPT and named in the error.

ui_compile_widget

Compile a Widget Blueprint asset. Returns compilation status (UpToDate/Error/Dirty), warnings, and errors. Optionally save on successful compilation.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to compile
save_on_success boolean Optional Save the package on successful compile Default: false.

ui_copy_style

"Make this look like that one" — copies a working widget's brush (draw_as, resource, margin, tint, size) and text style (font, typeface, size, colour) onto another. Copies STYLE ONLY: slot layout and text content stay the target's, so matching a look cannot wreck a layout. Use dry_run to see what would be copied. USE_WHEN: one widget already looks right. NOT_WHEN: you know the values (ui_set_brush / ui_set_text_style) or want the widget itself (ui_duplicate_element).

ParameterTypeRequiredDescription
widget_blueprint_path string Required Blueprint containing the source widget
from_widget string Required Widget whose style to copy
to_widget string Required Widget to restyle
to_widget_blueprint_path string Optional Blueprint containing the target, when it differs from the source blueprint.
include "brush" | "text"[] Optional Which aspects to copy. Never copies slot layout or text content. Default: ["brush","text"].
dry_run boolean Optional Report what would be copied without writing. Default: false.

ui_create_widget

CREATE A NEW MENU, SCREEN OR HUD as a UMG Widget Blueprint asset — the designer-editable kind an artist can also open. Seeds a root CanvasPanel ready for content. USE_WHEN: starting any new piece of UI. NOT_WHEN: adding to an existing one (ui_add_element / ui_build_tree), or inspecting what a running game is showing (editor_pie_widget_tree).

ParameterTypeRequiredDescription
path string Required UE content package directory, e.g. "/Game/LanternPuzzle/UI"
name string Required Asset name, e.g. "WBP_PuzzlePanel"
parent_class string Optional Parent class (must descend from UserWidget); class path or short name. Defaults to UserWidget.

ui_duplicate_element

Duplicate a widget and its entire subtree, cloning properties and slot layout. The copy and every duplicated descendant are registered as designer variables. Use for repeated rows, cards and list entries.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to duplicate. Its whole subtree is copied.
new_name string Optional Name for the copy. Auto-uniquified from the source name if omitted.
parent_widget_name string Optional Panel to place the copy under. Defaults to the source widget own parent (i.e. a sibling copy).
slot_props object (map) Optional Slot layout overrides for the copy, applied after the source slot layout is cloned.

ui_get_widget_info

Get detailed info about a Widget Blueprint: full widget tree with properties, variable GUIDs, slot layout, and typed property values per widget.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to inspect
include_properties boolean Optional Include widget properties in the response Default: true.
include_guid boolean Optional Include GUIDs in the response Default: true.

ui_layout_snapshot

Resolve the real on-screen geometry of every widget by running a Slate prepass on the compiled widget class, plus per-widget font, measured text width and brush facts. This is the measurement layer ui_validate judges. layout_resolved:false means the blueprint could not be instantiated (usually: compile it first) and geometry is absent rather than zero.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to lay out
screen_width number Optional Resolution to lay out at. Defaults to the blueprint’s design-time size.
screen_height number Optional Resolution to lay out at. Defaults to the blueprint’s design-time size.
widget_names string[] Optional Return only these exact widget names. Use this for targeted style/geometry reads on large trees.
offset integer Optional Zero-based widget offset for paginating production-sized trees.
limit integer Optional Widgets to return per page (maximum 50, matching the UE transport limit).

ui_list_widget_blueprints

List the Widget Blueprints that exist in the project, with the _C class path needed to use one as a child widget or as a parent class. Reads the asset registry, so no blueprint is loaded.

ParameterTypeRequiredDescription
path string Optional Restrict to a content path, e.g. "/Game/UI". Searched recursively.
filter string Optional Case-sensitive substring the asset name must contain

ui_list_widget_types

List UMG widget classes that can be added via ui_add_element or ui_replace_element. Native classes by default; pass include_blueprints to also list your own Widget Blueprint classes, or panels_only to narrow to containers.

ParameterTypeRequiredDescription
filter string Optional Optional text filter for widget class names

ui_measure_text

Measure a string exactly, through the Slate font measure service, in a widget real font or an explicit one. Returns rendered width/height plus how many characters fit in the box: the actual string, typical mixed-case prose, and the worst case if every glyph were the font widest. Use this to size a label for variable-length runtime text (player names, item names, translations) BEFORE it clips in game.

ParameterTypeRequiredDescription
text string Required The string to measure
widget_blueprint_path string Optional Measure using this blueprint widget’s actual font. Pair with widget_name.
widget_name string Optional Widget whose font (and, by default, box width) to measure against.
font_asset string Optional Composite UFont asset path. A UFontFace is rejected — Slate cannot measure or render one as text.
font_size number Optional Font size in px. Required when not measuring against a widget.
typeface string Optional Typeface name within the font, e.g. "Bold"
available_width number Optional Box width in px to fit against. Defaults to the widget’s laid-out width when a widget is given.
font_scale number Optional DPI/application scale to measure at Default: 1.

ui_move_element

Reorder a widget among its siblings. Child order is draw order and tab order in box panels. Slot layout is preserved across the move; an out-of-range index is rejected with the valid range.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to reorder
index integer Required New zero-based index among its siblings. Out-of-range values are rejected with the valid range.

ui_query

Return the widget tree of a Widget Blueprint - per-widget name, class, slot, variable GUID and typed properties. Pass name_pattern / class_filter / flatten to get a flat list of matching widgets instead of the whole tree.

ParameterTypeRequiredDescription
path string Required Full path of the Widget Blueprint to inspect, e.g. "/Game/LanternPuzzle/UI/WBP_PuzzlePanel"
include_properties boolean Optional Include widget properties in the response Default: false.
include_guid boolean Optional Include GUIDs in the response Default: false.
include_slot boolean Optional Include slot layout info in the response Default: true.
name_pattern string Optional Case-sensitive substring a widget name must contain. Returns a flat `matches` list instead of the tree.
class_filter string Optional Class a widget must be or derive from, e.g. "PanelWidget" for every panel. Returns a flat `matches` list instead of the tree.
flatten boolean Optional Return the flat `matches` list even when no filter is given.

ui_remove_element

Remove a widget from a Widget Blueprint designer tree, together with its whole subtree. Variable GUIDs for every removed descendant are purged, not just the named widget. Removing the root requires an explicit replacement_root.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to remove
replacement_root string Optional If removing the root widget, provide a replacement widget class to become the new root

ui_rename_element

Rename a designer widget, carrying its variable GUID across so existing bindings keep resolving. The widget name IS the variable name the graph and C++ BindWidget use, so this is an API change.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Current name of the widget
new_name string Required New name. Must be unique within this widget tree.

ui_render_widget_to_png

SEE a Widget Blueprint: draws it to a PNG and returns the image inline, with no PIE session and no editor restart. out_path accepts only an optional clean PNG filename; Hayba writes it without overwrite under Saved/Screenshots/Hayba and returns the resolved absolute path. This is how you check fonts, colours, brushes, spacing and overflow in seconds instead of a rebuild-and-play cycle. Read coverage_percent — 0 means the widget drew nothing and the PNG is blank. USE_WHEN: you want to look at the UI. NOT_WHEN: you want numbers (ui_layout_snapshot) or a verdict (ui_validate).

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to draw
width integer Optional Render width in px. Defaults to the blueprint’s design-time size.
height integer Optional Render height in px. Defaults to the blueprint’s design-time size.
scale number Optional Multiplies the size, 0.1–4.0. Use 2 to read small text.
out_path string Optional Optional clean PNG filename only. Written without overwrite under Saved/Screenshots/Hayba; omit for a unique filename.
opaque_background boolean Optional Force alpha to 255 (default true). UMG draws onto transparency, and an unmodified alpha channel makes most viewers show the whole image as black. Pass false only when you intend to composite.
inline_image boolean Optional Return the PNG inline so you can actually look at it (default true). Skipped automatically above ~3MB; read out_path in that case.

ui_reparent_element

Move an existing designer widget from its current parent to a new parent panel. Preserves widget instance and GUID. Creates the correct slot class for the new parent.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to reparent
new_parent_name string Required Name of the existing panel widget to reparent under
slot_props object (map) Optional Optional slot layout props for the new parent slot

ui_replace_element

Replace a designer widget with a different class at the same position. Preserves parent, child index, slot layout, and the complete child subtree by default (preserve_children); optionally preserves the name, variable GUID (preserve_guid), and every property the two classes share by name and type (preserve_properties). Set preserve_children:false only to explicitly delete descendants.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to replace
new_class string Required New widget class to replace with (short name or full class path)
new_name string Optional Valid Unreal object name for the replacement widget (defaults to original name)
preserve_guid boolean Optional Preserve the original widget GUID Default: true.
preserve_properties boolean Optional Preserve original widget properties on the replacement Default: false.
preserve_children boolean Optional Preserve and reparent the original child subtree onto the replacement (default true). Set false only to explicitly delete the subtree. Default: true.

ui_save_widget

Save a Widget Blueprint package to disk. Optionally compile before save. Returns whether the save succeeded and whether the package is still dirty.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to save. A read-only package is refused with code package_read_only; see data.make_writable_hint.
compile_first boolean Optional Run compile before saving Default: false.

ui_search_widgets

Search within a Widget Blueprint for widgets matching a name pattern or class filter. Returns matching widget paths and properties.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to search
widget_name_pattern string Optional Case-sensitive substring to match widget names against
widget_class string Optional Filter by widget class. Matches the exact class or any ancestor, so "PanelWidget" returns every panel and "TextBlock" returns TextBlocks and RichTextBlocks that derive from it.
include_properties boolean Optional Include widget properties in each result Default: false.
include_guid boolean Optional Include the designer variable GUID in each result Default: false.

ui_set_brush

Set the brush on an Image or Border widget in a Widget Blueprint: texture/material resource, tint color, draw style, image size, and 9-slice margins.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the Image or Border widget
resource string Optional Texture2D or Material asset path for the brush, e.g. "/Game/LanternPuzzle/UI/Icons/T_LanternIcon"
tint number[] Optional RGBA tint color (0-1)
draw_as "Image" | "Border" | "Box" | "RoundedBox" | "NoDrawType" Optional Brush draw style. Box = 9-slice: the four Margin values fix the corners and the middle stretches — this is what a frame or panel background wants. Image stretches the whole texture. Border draws edges only.
image_size number[] Optional Image size [Width, Height]
margin number[] Optional 9-slice margins [Left, Top, Right, Bottom]
brush_property "Brush" | "Background" Optional Which brush to write. Image widgets use "Brush" (the default); Border widgets expose theirs as "Background". Default: "Brush".

ui_set_default_font

Rewrite every text widget still on an engine default font (Roboto) onto a project font, in one call. New TextBlocks always arrive as /Engine/EngineFonts/Roboto "Bold" and ui_set_text_style only changes the fields you pass — so setting size and colour but forgetting font_asset+typeface silently keeps Roboto and still reports success. Use dry_run first to see what would change. USE_WHEN: a blueprint has the default font anywhere. NOT_WHEN: restyling one widget (ui_set_text_style).

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to sweep
font_asset string Required Composite UFont asset to apply, e.g. "/Game/UI/Fonts/F_LanternBody". Must NOT be a UFontFace.
typeface string Optional Typeface within the font. Defaults to Regular — the engine default is Bold, which reads as emphasis nobody asked for. Default: "Regular".
only_engine_fonts boolean Optional Only rewrite text that is still on an /Engine/ font (the default). Set false to force every text widget onto this font, including ones deliberately styled otherwise. Default: true.
dry_run boolean Optional Report what would change without writing anything. Default: false.

ui_set_property

Set a single arbitrary property on a designer widget by name and value. Typed wrapper around ui_set_widget_properties for the common case of changing one thing.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to set the property on
property_name string Required UE property name to set (e.g. "Text", "ColorAndOpacity", "Visibility")
value string | number | boolean | number[] Required Property value — string, number, boolean, or array of numbers for colors/vectors

ui_set_slot_layout

Set CanvasPanel slot layout on a designer widget: anchors (as `anchors` [minX,minY,maxX,maxY], or `anchors_min`+`anchors_max` [x,y] pairs), `position`, `size`, `alignment`, `z_order`, `auto_size`; box/grid slots take `padding`, `fill`, alignments, row/column. Anchors + position + alignment are committed to the CanvasPanelSlot atomically (one LayoutData write). Unknown parameter names are REJECTED with a validation error rather than silently dropped. For non-Canvas slots use the slot_props field in ui_set_widget_properties.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget whose SLOT is being laid out
anchors_min number[] Optional Canvas: min anchor [X, Y] in 0-1 screen fractions
anchors_max number[] Optional Canvas: max anchor [X, Y] in 0-1 screen fractions
anchors number[] | object Optional Canvas: anchors as [minX, minY, maxX, maxY] or {min:[x,y], max:[x,y]}. Sugar for anchors_min + anchors_max.
position number[] Optional Canvas: position [X, Y] in px relative to the anchor
size number[] Optional Canvas: size [Width, Height] in px
alignment number[] Optional Canvas: pivot [X, Y] in 0-1 (0.5,0.5 centres on the position)
auto_size boolean Optional Canvas: size to the widget’s desired size instead of the explicit size
z_order integer Optional Canvas: draw order among siblings (higher draws on top)
padding number | number[] | object Optional Box/grid/overlay/border/size-box slots: padding as a single number, [L,T,R,B], or {left,top,right,bottom}. Zero is honoured, so this can clear padding.
fill number Optional Horizontal/VerticalBox slots: fill weight. 0 means size-to-content.
horizontal_alignment "Fill" | "Left" | "Center" | "Right" Optional Alignment within the slot
vertical_alignment "Fill" | "Top" | "Center" | "Bottom" Optional Alignment within the slot
row integer Optional Grid/UniformGrid slots: row index
column integer Optional Grid/UniformGrid slots: column index
row_span integer Optional Grid slots: rows spanned
column_span integer Optional Grid slots: columns spanned

ui_set_text_style

Set text styling on a TextBlock widget in a Widget Blueprint: font, typeface, size, letter spacing, color, outline, shadow, justification. All values survive compile+save+restart.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the TextBlock widget to style
text string Optional Text content to display
font_asset string Optional Path to a composite UFont asset, e.g. "/Game/UI/Fonts/Cormorant". Must NOT be a UFontFace - Slate renders a raw font face as its glyph-preview tiles instead of as text, and the handler warns when it sees one.
typeface string Optional Font typeface name (e.g. "Regular", "Bold", "Italic")
size number Optional Font size in points
letter_spacing integer Optional Slate font letter spacing (stored in Font.LetterSpacing)
color number[] Optional Text color as RGBA (0-1)
outline_size number Optional Outline size
outline_color number[] Optional Outline color as RGBA (0-1)
shadow_offset number[] Optional Shadow offset [X, Y]
shadow_color number[] Optional Shadow color as RGBA (0-1)
justification "Left" | "Center" | "Right" Optional Text justification

ui_set_variable

Expose (or hide) a widget as a blueprint variable - the designer Is Variable checkbox. Without it the graph and C++ BindWidget cannot reach the widget at all.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to expose or hide
is_variable boolean Optional true exposes the widget as a variable (the designer "Is Variable" checkbox); false hides it again. Default: true.
category string Optional Variable category shown in the blueprint variable list

ui_set_visibility

Set the visibility of a designer widget in a Widget Blueprint. Changes survive compile, save, and editor restart.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to change visibility on
visibility "Visible" | "Hidden" | "Collapsed" | "HitTestInvisible" | "SelfHitTestInvisible" Required New visibility state

ui_set_widget_properties

Generic tool: set named properties and/or slot layout on a designer widget. Operates on the authoritative WidgetTree (not the generated template). Property values may be nested objects for struct properties (Brush, Font). Reports per-key outcomes: succeeded, failed_properties, unknown_slot_props. NOT transacted - these edits deliberately stay out of the editor undo stack, because the transaction buffer can pin PIE references and crash the editor. Prefer the typed tools (ui_set_property, ui_set_text_style, ui_set_slot_layout) for common operations.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the target Widget Blueprint
widget_name string Required Name of the widget to set properties on
properties object (map) Optional Property values keyed by their real UE property name (e.g. "Text", "ColorAndOpacity", "Font"). Values may be nested objects for struct properties, arrays for colors/vectors, or an asset path string for object references.
slot_props object (map) Optional Layout properties applied to the widget’s PANEL SLOT rather than the widget: canvas (anchors/position/size/alignment/auto_size/z_order), box (fill/padding/alignment), grid (row/column/spans). Keys the slot type does not support come back in unknown_slot_props instead of being silently dropped.

ui_validate

CHECK A SCREEN AGAINST GAME-UI STANDARDS: runs the UI rule catalogue over a real Slate layout and reports precise, actionable findings - text that overflows (and the exact character count at which it does), labels with no room for translation growth, content inside TV title/action-safe margins, touch targets below the platform minimum, overlapping siblings, contrast below WCAG, controls gamepad focus cannot reach, and performance traps. Judged per platform (pc/console/handheld/mobile) and per strictness (relaxed/standard/strict). USE_WHEN: after building or editing a Widget Blueprint, and before calling the screen done. NOT_WHEN: you only need the tree (ui_query) or one measurement (ui_measure_text). Rules that need geometry are reported as SKIPPED when the layout cannot be resolved - never as passing.

ParameterTypeRequiredDescription
widget_blueprint_path string Required Full path of the Widget Blueprint to validate
platform "pc" | "console" | "handheld" | "mobile" Optional Which conventions to judge against. "console" applies TV safe areas and the 28px legibility floor; "mobile" applies 44px touch targets; "handheld" sits between them. Default: "pc".
strictness "relaxed" | "standard" | "strict" Optional Override the configured UI strictness for this run. relaxed = only what is broken; standard = plus UI conventions; strict = plus house-style polish. Defaults to the validator setting.
screen_width number Optional Resolution to evaluate at. Defaults to the blueprint design size.
screen_height number Optional Resolution to evaluate at. Defaults to the blueprint design size.
rule_ids string[] Optional Run only these rules, by id.
persist boolean Optional Write the findings to the validator history so they appear in the editor Validation panel. Set false for a read-only check that leaves no trace. Default: true.

Unreal docs 4

docs_lookup_api

CHECK A PROPERTY OR FUNCTION EXISTS BEFORE YOU USE IT. Lists the real properties of a class (name, C++ type, category, tooltip, whether it is editable and blueprint-visible) and functions (blueprint-callable, event). USE_WHEN: before setting a property by name or calling a function — a wrong name is otherwise a silent no-op or a failed edit. Pass include_inherited when a member you expected is missing; it is usually declared on a parent.

ParameterTypeRequiredDescription
path string Required Class path or name, e.g. "/Script/UMG.TextBlock" or "TextBlock".
include_inherited boolean Optional Include members inherited from parent classes. Off by default because the inherited surface of a UObject is large; turn it on when a member you expect is missing — it is often declared on a parent. Default: false.

docs_lookup_class

Inspect a UE class in the running editor: full inheritance chain, class flags, and how many properties and functions it has. USE_WHEN: confirming a class exists and what it derives from before using it as a parent or a cast target.

ParameterTypeRequiredDescription
path string Required Class path or name, e.g. "/Script/UMG.UserWidget", "UserWidget", or "TextBlock". Resolved against the LIVE editor, so it reflects the engine version and plugins actually loaded.

query_ue_docs

SEARCH THE INDEXED UE C++ API BEFORE GENERATING CODE. Returns signatures, declaring types, include paths, short source docs and explicit deprecation metadata from the configured versioned Engine/Source database. USE_WHEN: you need source-level intent or want to avoid a deprecated API. NOT_WHEN: you need properties reflected by the currently loaded editor; use docs_lookup_api. Search is deterministic keyword mode; semantic search is reported unavailable until an embedding corpus is installed.

ParameterTypeRequiredDescription
query string Required UE C++ API name or concept. Examples: "FActorIterator", "iterate actors", "deprecated navigation".
class_filter string Optional Optional declaring class/type filter, for example "AActor" or "FActorIterator".
kind_filter "class" | "struct" | "enum" | "function" Optional Optional symbol kind. Omit to search classes, structs, enums and functions together.
mode "keyword" Optional Search mode. This database currently supports honest deterministic keyword search only. Default: "keyword".
limit integer Optional Maximum results, from 1 to 50. Default: 20.

Validator 7

validator_clear

Clear the validator history. Requires { confirm: true } to actually wipe.

ParameterTypeRequiredDescription
confirm boolean Required

validator_history

Read persisted validator findings (the record of everything validator_run / plumb_validate caught). Filter by limit / since_iso / include_resolved / rule_ids.

ParameterTypeRequiredDescription
limit integer Optional
since_iso string Optional
include_resolved boolean Optional
rule_ids string[] Optional

validator_resolve

Mark a validator finding as resolved (or restore it). Identifies the finding by its ISO timestamp.

ParameterTypeRequiredDescription
timestamp string Required
resolved boolean Required

validator_rules

List the validator rule catalog — every post-condition check and bound PLUMB constraint that validator_run / plumb_validate will evaluate, with each rule's message, hint, refs, and disabled state.

ParameterTypeRequiredDescription
include_disabled_state boolean Optional

validator_run

CATCHES SILENT WRONGNESS YOU CANNOT SEE: runs the validator rules over the current scene and returns concrete post-condition findings — actors floating above ground, interpenetrating meshes, off-grid/mis-scaled placements, missing expected results, and PLUMB constraint violations. Pass scope='all' (default) or { rule_ids: [...] }; findings persist to history and the Validation panel. WHY: you have no viewport — this is how you verify placement actually landed correctly instead of assuming it did.

ParameterTypeRequiredDescription
scope "all" | object Optional
persist boolean Optional

validator_set_rule_enabled

Enable or disable a validator rule by id. Persists to .scratch/validator-config.json.

ParameterTypeRequiredDescription
rule_id string Required
enabled boolean Required

validator_strictness

Read or set validation strictness. Three modes — relaxed (only what is broken), standard (plus established conventions), strict (plus house-style polish) — set globally or per category (ui, pcg, landscape, material, blueprint, python, asset, general). A rule declares the lowest mode at which it fires, so raising strictness only ever adds findings. Call with no arguments to read the current settings. Persists to .scratch/validator-config.json, the same file the editor Configure panel reads.

ParameterTypeRequiredDescription
mode "relaxed" | "standard" | "strict" Optional New strictness. Omit to read the current settings without changing anything.
category "ui" | "pcg" | "landscape" | "material" | "blueprint" | "python" | "asset" | "general" Optional Set strictness for one category only. Omit to set the global default.
reset_category "ui" | "pcg" | "landscape" | "material" | "blueprint" | "python" | "asset" | "general" Optional Clear a category override so it follows the global default again.

Water 11

water_body_inspect

Deep read-back of one water body: component validity (catches placeholder-stub spawns), wave presence, water/underwater material refs, affects-landscape flag, owning zone and bounds. The paired read for validate-before/after-mutate. Property/material reflection is probed with alternate names; anything unresolved surfaces in warnings[].

ParameterTypeRequiredDescription
body_path string Required Actor path or label of the water body

water_body_lake_create

Spawn an AWaterBodyLake at a water level with an optional footprint radius and label. Lakes are a core terrain-water feature. NON_IDEMPOTENT; supports dry_run. NOTE: closed-spline shoreline shaping is UNCERTAIN-API and deferred — the body spawns with its default footprint and a warning is surfaced. Degrades cleanly if Water is off.

ParameterTypeRequiredDescription
location number[] Required World location [x,y,z] of the lake center
radius number Optional Optional footprint radius (applied as uniform actor scale hint)
water_z number Optional Optional water surface Z (defaults to location Z)
zone_path string Optional Optional WaterZone to bind under
label string Optional Optional actor label
dry_run boolean Optional Plan without spawning Default: false.

water_body_list

Paginated introspection of all water bodies in the level: class, label, owning-zone binding (AABB containment), bounds and whether waves are attached. The inspection-first read to call before any water mutate. Degrades cleanly to a plugin-disabled envelope if the Water plugin is off.

ParameterTypeRequiredDescription
class_filter string Optional Only return bodies whose class name contains this substring (e.g. "Ocean")
limit integer Optional Max bodies to return Default: 30.
offset integer Optional Offset for pagination Default: 0.

water_body_ocean_create

Spawn an AWaterBodyOcean at a world location with an optional scale and label, and confirm an optional owning WaterZone (zones bind bodies by overlap). The single most common worldbuilding water op — an outcome verb over raw actor_spawn. NON_IDEMPOTENT (each call spawns a new actor); supports dry_run. Degrades to a plugin-disabled envelope if Water is off.

ParameterTypeRequiredDescription
location number[] Optional World location [x,y,z] Default: [0,0,0].
extent number[] Optional Optional actor scale [x,y,z] to size the ocean
zone_path string Optional Optional WaterZone to bind under (confirmed to exist; binding is by overlap)
label string Optional Optional actor label
dry_run boolean Optional Plan without spawning Default: false.

water_body_river_create

Spawn an AWaterBodyRiver following a world-space path (>=2 points). Rivers are the hardest water body to author by hand — this hides the spline wiring. NON_IDEMPOTENT; supports dry_run. SET-SUCCESS: surfaces spline_applied (whether the WaterSplineComponent point write actually ran — UNCERTAIN-API); per-point width/depth/velocity metadata is deferred with a warning. Degrades cleanly if Water is off.

ParameterTypeRequiredDescription
points number[][] Required Ordered world-space path [[x,y,z],...] (>=2 points)
width number Optional Default river width Default: 512.
depth number Optional Default river depth Default: 256.
velocity number Optional Default flow velocity Default: 125.
zone_path string Optional Optional WaterZone to bind under
label string Optional Optional actor label
dry_run boolean Optional Plan without spawning Default: false.

water_check_plugin

THE honest gate for the water pack: probe whether the Water plugin is enabled (WaterBodyOcean/WaterZone classes present), whether its editor subsystem is ready, and report version/enable-list. Returns a STRUCTURED {enabled,...} result and NEVER throws — call this first so an agent gets an actionable enable hint instead of an AttributeError. Plugin version is UNCERTAIN-API (no python reflection) and stays null with a warning.

No parameters.

water_validate

PLUMB-style quantified check of the water scene: bodies present but no WaterZone, bodies outside every zone (silent render drop), wave steepness out of [0..1], inverted wavelength range, multiple oceans. Returns green/red status + categorised findings with severity + a fix hint; ok:false only on errors. The closed-loop correctness engine for water (the worldbuilding moat). autofix not implemented this wave.

ParameterTypeRequiredDescription
scope "level" Optional Validation scope (only level supported this wave) Default: "level".

water_waves_inspect

Read a body's wave setup: generator type, num_waves, wavelength range, steepness, seed, wind direction and attached WaterWavesAsset. The paired read for the most-tuned water parameter. Generator + property reflection is UNCERTAIN-API in 5.7 — probed with alternate names; anything unresolved is null with a warning, never guessed.

ParameterTypeRequiredDescription
body_path string Required Actor path or label of the water body

water_waves_set_gerstner

Configure a body's GerstnerWaterWaveGeneratorSimple (num_waves, wavelength range, steepness, wind direction, seed) — the primary knob for ocean look, with sane-range arg validation. SET-SUCCESS: the generator + every property setter is UNCERTAIN-API and returns void, so applied:true is reported ONLY when the generator resolved AND at least one setter ran without raising; otherwise ok:false + applied:false + a warning (never ok:true with an unapplied change). fields_applied lists exactly which knobs took. Idempotent set-to-value.

ParameterTypeRequiredDescription
body_path string Required Actor path or label of the water body
num_waves integer Optional Number of Gerstner waves
min_wavelength number Optional Minimum wavelength
max_wavelength number Optional Maximum wavelength
steepness number Optional Wave steepness [0..1]
wind_dir number Optional Dominant wind/wave direction (degrees)
seed integer Optional Random seed
dry_run boolean Optional Resolve the generator without applying Default: false.

water_zone_create

Spawn an AWaterZone (optionally sized + render-target resolution) to bound water bodies — bodies do NOT render without a covering zone (5.7 bounded zones). NON_IDEMPOTENT; supports dry_run. SET-SUCCESS: surfaces extent_applied/resolution_applied for the UNCERTAIN-API property writes. Degrades cleanly if Water is off.

ParameterTypeRequiredDescription
location number[] Optional World location [x,y,z] Default: [0,0,0].
extent number[] Optional Zone XY extent [x,y] in world units
resolution number[] Optional Water-info render-target resolution [x,y]
label string Optional Optional actor label
dry_run boolean Optional Plan without spawning Default: false.

water_zone_inspect

Read a WaterZone: bounds, water-info render-target resolution, LOD far distance, which bodies it covers (AABB containment) and which bodies in the level are orphaned (covered by NO zone — the silent "body outside zone" rendering drop). Property reflection is UNCERTAIN-API; probed with alternate names.

ParameterTypeRequiredDescription
zone_path string Required Actor path or label of the WaterZone

World and scene 13

hayba_import_landscape

Deprecated for one release; use world_ingest. Import a heightmap (PNG or R16) through the shared staged workflow, preserving partition settings and legacy import-only behavior. Leaves changes unsaved. The heightmap is sampled 0..uint16-max to 0..maxHeightM (m). Spawns one Landscape covering worldSizeKm x worldSizeKm.

ParameterTypeRequiredDescription
heightmapPath string Required Absolute path to a PNG or R16 heightmap file
worldSizeKm number Optional Landscape XY size in km Default: 8.
maxHeightM number Optional Maximum height in m (0..maxHeightM mapped from uint16) Default: 600.
actorLabel string Optional Label for the spawned Landscape actor Default: "Hayba_Terrain".
landscapeMaterial string Optional UE material path; empty = no material

import_landscape

Deprecated for one release; use world_ingest. Import a heightmap (PNG or R16) through the shared staged workflow, preserving partition settings and legacy import-only behavior. Leaves changes unsaved. The heightmap is sampled 0..uint16-max to 0..maxHeightM (m). Spawns one Landscape covering worldSizeKm x worldSizeKm.

ParameterTypeRequiredDescription
heightmapPath string Required Absolute path to a PNG or R16 heightmap file
worldSizeKm number Optional Landscape XY size in km Default: 8.
maxHeightM number Optional Maximum height in m (0..maxHeightM mapped from uint16) Default: 600.
actorLabel string Optional Label for the spawned Landscape actor Default: "Hayba_Terrain".
landscapeMaterial string Optional UE material path; empty = no material

scene_export

Export a 3D scene graph for LLM reasoning (flat / relational / hierarchical).

ParameterTypeRequiredDescription
mode "flat" | "relational" | "hierarchical" Optional
window object Optional
max_items integer Optional

scene_get_actor_relations

Report one actor's attachment parent, its attached children and its asset references. Answers 'what would move or break if I reparent or delete this' — it is not an inventory, use actor_list for that.

ParameterTypeRequiredDescription
actor_id string Optional

scene_validate_physics

Detect floating / interpenetrating actors in the level.

ParameterTypeRequiredDescription
deep_check boolean Optional
window object Optional

world_budget_snapshot

Read-only structural evidence for currently loaded editor actors or a folder path and descendants aggregated across all loaded Outliner roots. Same-path folders in separate roots are combined. Counts loaded actors, classes, folder paths, and ISM/HISM instances; reports unknown unloaded World Partition/PCG coverage. Optional user targets compare counts for that stated aggregate only. This does not establish runtime memory, streaming, NPC, frame-time, or texel-density fitness.

ParameterTypeRequiredDescription
folder string Optional Folder path aggregate across loaded roots; includes descendants
max_loaded_actors integer Optional
max_loaded_ism_instances integer Optional

world_compare_snapshots

Compare two caller-supplied loaded-editor world budget snapshots under one declared protocol, with optional paired completed PIE proxy captures. Matching complete scans yield structural deltas and caller-supplied cap headroom; incomplete scans retain observed counts but withhold deltas and verdicts. PIE proxy deltas require compatible captures and full requested samples for each metric. The caller protocol is not independently verified; no production performance or design score is inferred.

ParameterTypeRequiredDescription
baseline object Required
candidate object Required
max_loaded_actors integer Optional Optional caller-supplied loaded actor cap. Headroom and verdict require two complete, matching scans.
max_loaded_ism_instances integer Optional Optional caller-supplied loaded ISM/HISM instance cap. This is not a runtime performance budget.

world_generate

Build an environment from a natural-language biome description. Parses the prompt into layers (canopy/rock/undergrowth/groundcover), resolves one of the PROJECT'S OWN StaticMeshes per layer, plans a deterministic seeded scatter across an area actor, then PLUMB-VALIDATES and auto-corrects every instance IN MEMORY (grounded, non-interpenetrating) before spawning — "scatter and prove", not scatter-and-hope. Use dry_run to get the validated plan without spawning.

ParameterTypeRequiredDescription
area_actor string Required Label of an actor whose location centres the biome region
prompt string Required Natural-language biome description
radius_cm number Optional Scatter radius in cm (default 1500)
count integer Optional Total instances across all layers (default 40)
seed integer Optional Deterministic seed (default 1337)
ground_tolerance_m number Optional Grounded tolerance in metres (default 0.1)
dry_run boolean Optional Plan + validate only; do not spawn

world_ingest

Inspect, plan, import, prepare, save, and verify world content with explicit capability and partial-failure results.

ParameterTypeRequiredDescription
source object Required
destination object Required
terrain object Optional
partition object Optional
assets object Optional
materials object Optional
validation object Optional
execution object Optional

world_inspect

Inspect the open Unreal world and return normalized capability and readiness facts.

No parameters.

world_query

Find loaded Unreal source objects in one exact captured mesh tile by an authored tag, folder, actor class, or mesh asset. Optionally compare each match to one reference source ID or authored fact using a typed candidate relation from sampled point bounds. First use world_tile_capture, then pass its tile_id and capture_id as expected_capture_id here. Returns canonical actor/component/instance provenance, point evidence, and coverage gaps. A partial capture cannot prove absence; this does not infer visual labels, collision, visibility, gameplay quality, or a production budget verdict.

ParameterTypeRequiredDescription
tile_id string Required Tile ID returned by world_tile_capture.
expected_capture_id string Required The exact capture ID returned by world_tile_capture; never substitute a newer capture silently.
target object Required Exact authored tag, folder, actor class, or mesh asset to find. This is not an inferred visual label.
reference_source_node_id string Optional Canonical source node ID of the object used as the spatial reference.
reference object Optional Alternatively, exact authored fact selecting reference sources. The query compares matching targets to these references.
relation_kind "near_sampled_bounds" | "above_sampled_bounds" | "sampled_bounds_overlap" | "sampled_bounds_contains" Optional Provisional relation computed from sampled point bounds, not collision or visibility.
near_threshold_cm number Optional Maximum sampled-bounds gap for near relation, in Unreal centimeters.
above_minimum_gap_cm number Optional
above_maximum_gap_cm number Optional
offset integer Optional Default: 0.
limit integer Optional Default: 32.

world_semantic_snapshot

Inspect three separate loaded-world observations: mesh hierarchy and spatial clusters (source=mesh), CPU mesh point-cloud tiles linked to actor/component/instance sources, compact authored semantic groups, and spatial relations (source=mesh_tile), or first-visible editor-camera depth (source=view_depth). Use world_tile_capture to capture a tile on demand. For mesh_tile, pass its tile_id and the capture_id returned by start as expected_capture_id even on the first overview; reuse both for pages and relations. An uncaptured tile reports not_captured; an evicted pinned capture ID is refused so the agent can recapture. No visual-quality or production-performance verdict.

ParameterTypeRequiredDescription
source "mesh" | "mesh_tile" | "view_depth" Optional Mesh scans, captured geometry tiles, and view-depth observations have distinct provenance and IDs. Default: "mesh".
section "overview" | "actors" | "nodes" | "clusters" | "members" | "splats" | "groups" | "pages" | "semantic" | "relations" | "points" Optional Mesh: actors/nodes/clusters/members/splats. Mesh tile: pages/semantic/relations/nodes/points. View depth: groups/points. Overview returns metadata. Default: "overview".
offset integer Optional Default: 0.
limit integer Optional Default: 32.
cluster_index integer Optional Required for members; optional filter for splats. Indices are local to one scan.
node_index integer Optional Optional authored-node ancestor filter for splats.
member_kind "nodes" | "actors" Optional Default: "nodes".
expected_scan_id string Optional For mesh pages, pass the previous page scan ID to refuse a changed mesh scan.
group_id string Optional For view_depth points only, filter by a fixed world-space cell ID from the groups page. These IDs differ from the World preview’s quantile scopes.
tile_id string Optional For mesh_tile, identify a world-space LOD tile. An uncaptured unpinned tile reports not_captured; an evicted or invalidated expected_capture_id is refused.
page_id integer Optional Required for mesh_tile nodes and points. Get available page IDs with section pages.
expected_capture_id string Optional For mesh_tile, pass the capture ID returned by world_tile_capture even on the first overview, then reuse it for all pages. The exact retained observation is queried; eviction or world changes refuse it. View depth can also use this guard.

world_tile_capture

Start, poll, or cancel an asynchronous World tile capture. Start with either canonical tile_id (tile:LOD:X:Y:Z) or position_cm {x,y,z} plus lod (0–2); position coordinates are centimeters and resolve to the containing tile. Samples bounded CPU mesh geometry from loaded editor actors only; it does not load cells, render, or capture during PIE. Start returns tile_id and capture_id immediately. Poll by capture_id until captured or partial, then read source=mesh_tile with world_semantic_snapshot using tile_id and expected_capture_id from start, including on the first overview and all relation/detail pages.

ParameterTypeRequiredDescription
action "start" | "status" | "cancel" Required Start a loaded-world tile capture, poll its capture ID, or cancel queued/in-progress work.
tile_id string Optional Canonical World tile address tile:LOD:X:Y:Z, e.g. tile:2:-1:3:0. Tile edges are 4000 cm at LOD 0, 2000 cm at LOD 1, and 1000 cm at LOD 2. Start accepts this or position_cm with lod. Status/cancel may use this or capture_id.
position_cm object Optional World-space point in centimeters for start. Each finite axis must be within ±100,000,000 cm. With lod, the containing tile index is floor(position_cm / (4000 / (1 << lod))) on each axis, including negative positions.
lod integer Optional Required with position_cm for start: 0 = 4000 cm tiles, 1 = 2000 cm, 2 = 1000 cm. Do not combine with tile_id.
capture_id string Optional ID returned by start. Use for status/cancel to follow that exact request. For snapshot pages, pass it as expected_capture_id to pin the captured observation and detect world changes or eviction.

Zones and conventions 5

hayba_analyze_conventions

Scan a UE project Content directory and infer conventions from existing folder structure and asset naming.

ParameterTypeRequiredDescription
projectRoot string Required Path to UE project root (contains .uproject file)
save boolean Optional If true, write inferred conventions to target (default: false — dry run)
target "global" | "project" Optional Where to save (required when save is true)

hayba_open_zone_painter

Open the zone painter for a world. CREATES the project when it does not already exist.

ParameterTypeRequiredDescription
projectId string Optional Existing project ID. Omit to create a new project.
projectName string Optional Name for the new project (used when projectId is omitted).
phase "a" | "b" Optional Phase A = blank canvas, Phase B = heightmap overlay (default: a).

hayba_read_zones

Read the zones a user has painted, to drive placement decisions.

ParameterTypeRequiredDescription
projectId string Optional Project ID to read submitted zones from.
scratchSessionId string Optional Scratch session ID (for standalone zone painting without a project).

hayba_set_painter_heightmap

Point the zone painter at the heightmap it should paint over.

ParameterTypeRequiredDescription
projectId string Required Project ID to associate the heightmap with.
heightmapPath string Required Absolute path to the baked heightmap PNG or R16 file.

hayba_setup_conventions

Multi-turn wizard to configure UE project conventions. Call repeatedly with advancing stages.

ParameterTypeRequiredDescription
stage "start" | "folders" | "naming" | "workflow" | "confirm" | "save" Required Current wizard stage
preset "epic-default" | "gamedevtv" | "custom" Optional Preset to load (required at start stage)
answers object (map) Optional Accumulated user responses from previous stages
target "global" | "project" Optional Where to save (required at save stage)
projectRoot string Optional UE project root path (required if target is project)

Not callable yet 4

The editor plugin handles these commands, but an agent cannot call them on this version. They are listed so you know the capability exists. Calling one returns an error.