# UnrealMCP — AI Bridge for Unreal Engine 5 (pypi · unrealmcp)

Control the Unreal Engine 5 editor from any MCP client: Blueprints, materials, Niagara.

- Trust score: 0/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-07

## Components

- pypi · `unrealmcp`: 0/100 (this document), [markdown](https://verifymcp.io/servers/aadeshrao123-unreal-mcp/unrealmcp.md), [page](https://verifymcp.io/servers/aadeshrao123-unreal-mcp/unrealmcp)

## Channel facts

- Registry: `pypi`
- Package: `unrealmcp`
- Version: `1.3.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-07.

- **Supply Chain Security**: 25/100
  - Malware scan not yet available for this package.
  - CVE check failed: an unpatched critical CVE affects this package; the score is capped at 0.
  - Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it.
  - 8 of 78 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 32/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 37/100
  - AI-judged instruction clarity (poor).
  - Context-footprint check failed: tool/resource definitions use about 35352 tokens (~123/item across 286 items; 286 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add aadeshrao123-unreal-mcp -- uvx unrealmcp
```

### Codex

```bash
codex mcp add aadeshrao123-unreal-mcp -- uvx unrealmcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "aadeshrao123-unreal-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "unrealmcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add aadeshrao123-unreal-mcp --command uvx --arg unrealmcp
```

### Hermes

```yaml
mcp_servers:
  aadeshrao123-unreal-mcp:
    command: "uvx"
    args: ["unrealmcp"]
```

### Other

```json
{
  "mcpServers": {
    "aadeshrao123-unreal-mcp": {
      "command": "uvx",
      "args": [
        "unrealmcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-07 (score 0, 0)

- [security regression] Malware scan: pass → unverified

### 2026-08-06 (score 0)

First indexed and scored.

## MCP tools (286)

### `execute_python` (~52 tokens)

Execute arbitrary Python code inside the running Unreal Editor.

The `unreal` module is pre-imported. Set a variable named `result`
to return structured data back to Claude Code.

Input parameters:

- `code` (string, required)

Output parameters:

- `result` (string)

### `health_check` (~20 tokens)

Check if the UE5 editor bridge is running and responsive.

Output parameters:

- `result` (string)

### `find_assets` (~153 tokens)

Search the Asset Registry by class, path, and/or name pattern.

Args:
    class_type: Shortcut ("material", "blueprint", "static_mesh", "texture",
        "data_table", "niagara_system", etc.) or "PackagePath.ClassName"
    path: Content path filter (e.g. "/Game/Materials")
    name_pattern: Substring match on asset name (case-insensitive)
    recursive: Search subdirectories (default True)
    max_results: Maximum results to return (default 200)

Input parameters:

- `class_type` (string)
- `max_results` (integer)
- `name_pattern` (string)
- `path` (string)
- `recursive` (boolean)

Output parameters:

- `result` (string)

### `list_assets` (~75 tokens)

List assets in a Content Browser directory.

Args:
    path: Content path (e.g. "/Game", "/Game/Materials")
    class_filter: Optional class shortcut (e.g. "material", "blueprint")

Input parameters:

- `class_filter` (string)
- `path` (string)
- `recursive` (boolean)

Output parameters:

- `result` (string)

### `open_asset` (~37 tokens)

Open an asset in the UE5 editor (blueprint, material, data table, widget, etc.).

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `get_asset_info` (~29 tokens)

Get asset metadata: class, package, and key properties.

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `get_asset_properties` (~25 tokens)

Get all editable properties of an asset.

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `set_asset_property` (~87 tokens)

Set a property on an asset.

Args:
    property_name: Property name (e.g. "two_sided", "blend_mode")
    property_value: JSON-encoded value (e.g. "true", "0.5", '"translucent"')

Input parameters:

- `asset_path` (string, required)
- `property_name` (string, required)
- `property_value` (string, required)

Output parameters:

- `result` (string)

### `find_references` (~59 tokens)

Find assets that reference or are referenced by the given asset.

direction: "dependents" (who uses this), "dependencies" (what this uses), or "both"

Input parameters:

- `asset_path` (string, required)
- `direction` (string)

Output parameters:

- `result` (string)

### `duplicate_asset` (~40 tokens)

Duplicate an asset to a new location.

Input parameters:

- `dest_name` (string, required)
- `dest_path` (string, required)
- `source_path` (string, required)

Output parameters:

- `result` (string)

### `rename_asset` (~37 tokens)

Rename or move an asset. UE5 automatically fixes all references.

Input parameters:

- `dest_path` (string, required)
- `source_path` (string, required)

Output parameters:

- `result` (string)

### `delete_asset` (~50 tokens)

Delete an asset or directory from the Content Browser.

Checks for references first unless force=True.
Paths without a dot are treated as directories.

Input parameters:

- `asset_path` (string, required)
- `force` (boolean)

Output parameters:

- `result` (string)

### `save_asset` (~23 tokens)

Save a specific asset to disk.

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `save_all` (~17 tokens)

Save all unsaved (dirty) assets.

Output parameters:

- `result` (string)

### `import_asset` (~128 tokens)

Import an external file (texture, mesh, FBX, etc.) into the Content Browser.

Args:
    source_file: Absolute path to file on disk (e.g. "C:/textures/wood.png")
    destination_path: Content Browser path (e.g. "/Game/Textures")
    destination_name: Custom asset name (default: source filename without extension)
    replace_existing: Overwrite if asset already exists (default True)

Input parameters:

- `destination_name` (string)
- `destination_path` (string, required)
- `replace_existing` (boolean)
- `source_file` (string, required)

Output parameters:

- `result` (string)

### `import_assets_batch` (~170 tokens)

Import multiple files into the Content Browser in one batch.

Provide EITHER 'files' (explicit list) OR 'source_directory' (scan a folder).

Args:
    destination_path: Content Browser destination (e.g. "/Game/Textures")
    files: List of absolute file paths to import
    source_directory: Absolute path to a folder — all matching files will be imported
    extensions: File extensions to include when scanning a directory (e.g. ["png", "jpg", "fbx"]).
        If omitted with source_directory, all files are imported.
    replace_existing: Overwrite existing assets (default True)

Input parameters:

- `destination_path` (string, required)
- `extensions`
- `files`
- `replace_existing` (boolean)
- `source_directory` (string)

Output parameters:

- `result` (string)

### `get_selected_assets` (~18 tokens)

Get currently selected assets in the Content Browser.

Output parameters:

- `result` (string)

### `sync_browser` (~26 tokens)

Navigate the Content Browser to show a specific asset.

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `create_material` (~222 tokens)

Create a new Material asset.

Returns error if the asset already exists (avoids editor overwrite popup).
Pass force=true to delete and recreate.

Args:
    name: Material name (e.g. "M_MyMaterial")
    path: Content Browser path
    blend_mode: opaque | masked | translucent | additive | modulate | alpha_composite | alpha_holdout
    shading_model: default_lit | unlit | subsurface | clear_coat | subsurface_profile |
        two_sided_foliage | cloth | eye | thin_translucent
    two_sided: Render on both sides
    opacity_mask_clip_value: Clip value for masked blend mode (0.0-1.0)
    force: If true, delete existing asset and recreate (default false)

Input parameters:

- `blend_mode` (string)
- `force` (boolean)
- `name` (string, required)
- `opacity_mask_clip_value`
- `path` (string)
- `shading_model` (string)
- `two_sided` (boolean)

Output parameters:

- `result` (string)

### `create_material_instance` (~212 tokens)

Create a Material Instance from a parent material.

Returns error if asset already exists. Pass force=true to delete and recreate.

Args:
    parent_path: Full path to parent (e.g. "/Game/Materials/M_Base")
    name: Instance name (e.g. "MI_Red")
    scalar_params: JSON dict of scalar overrides — {"Opacity": 0.5, "Metallic": 1.0}
    vector_params: JSON dict of vector overrides — {"BaseColor": [1.0, 0.0, 0.0, 1.0]}
    texture_params: JSON dict of texture overrides — {"Texture": "/Game/Textures/T_Wood"}
    force: If true, delete existing asset and recreate (default false)

Input parameters:

- `force` (boolean)
- `name` (string, required)
- `parent_path` (string, required)
- `path` (string)
- `scalar_params`
- `texture_params`
- `vector_params`

Output parameters:

- `result` (string)

### `build_material_graph` (~599 tokens)

Build a complete material node graph in one atomic operation.

Creates expression nodes and wires them together in a single call.
By default clears existing expressions first (safe rebuild — all external
references stay intact).

Args:
    material_path: Full path to existing material (e.g. "/Game/Materials/M_Portal")
    nodes: JSON array of node definitions. Each node has:
        - type: Short class name (e.g. "TextureCoordinate", "Custom", "ScalarParameter",
            "Constant3Vector", "TextureSample", "Multiply", "Add", "Panner", "Time",
            "VectorParameter", "LinearInterpolate", "ComponentMask")
            Auto-prefixed with "MaterialExpression" if needed.
        - pos_x, pos_y: Graph position (default -300, 0)
        - properties: Dict of editor properties to set. Common ones:
            - parameter_name: str — name shown in material instances
            - default_value: number or [r,g,b,a]
            - slider_min, slider_max: float — slider range
            - group: str — parameter group name
            - Values starting with "/" are loaded as assets
            - Lists of 3-4 become LinearColor, lists of 2 become Vector2D
        For Custom HLSL nodes (type="Custom"), also supports:
        - code: HLSL source code string
        - description: Node title in the graph
        - output_type: "float" | "float2" | "float3" | "float4"
        - inputs: List of input pin names (e.g. ["UV", "Speed"])
        - outputs: List of {"name": str, "type": str} for additional outputs
    connections: JSON array of connections. Each connection has:
        - from_node: Source node index (int, 0-based into nodes array)
        - from_pin: Output pin name ("" for default output)
        - to_node: Target node index (int) or "material" for material output
        - to_pin: Input pin name, or material property when to_node="material":
            BaseColor, Metallic, Specular, Roughness, Anisotropy, EmissiveColor,
            Opacity, OpacityMask, Normal,…

Input parameters:

- `clear_existing` (boolean)
- `connections` (string, required)
- `material_path` (string, required)
- `nodes` (string, required)

Output parameters:

- `result` (string)

### `get_material_info` (~105 tokens)

Inspect a material's properties.

Always returns: blend mode, shading model, two-sided, expression count.

Use include (comma-separated) to request additional sections:
\- "parameters": scalar/vector/texture parameter names
\- "textures": used texture paths
\- "statistics": shader instruction counts

Omit include to get only basic properties (minimal tokens).
Pass include="parameters,textures,statistics" for everything.

Input parameters:

- `include`
- `material_path` (string, required)

Output parameters:

- `result` (string)

### `recompile_material` (~30 tokens)

Force recompile and save a material. Reports success/failure.

Input parameters:

- `material_path` (string, required)

Output parameters:

- `result` (string)

### `get_material_errors` (~55 tokens)

Get shader compilation errors for a material.

Returns error messages and the node indices that caused them.
Recompiles first by default to get fresh errors.

Input parameters:

- `material_path` (string, required)
- `recompile` (boolean)

Output parameters:

- `result` (string)

### `set_material_properties` (~139 tokens)

Bulk-set material-level properties in one call.

Args:
    blend_mode: opaque | masked | translucent | additive | modulate | alpha_composite | alpha_holdout
    shading_model: default_lit | unlit | subsurface | clear_coat | etc.
    recompile: Recompile after setting properties (default True)

Input parameters:

- `allow_negative_emissive_color`
- `blend_mode`
- `dithered_lof_transition`
- `material_path` (string, required)
- `opacity_mask_clip_value`
- `recompile` (boolean)
- `shading_model`
- `two_sided`

Output parameters:

- `result` (string)

### `get_material_graph_nodes` (~110 tokens)

Read expression nodes in a material graph.

Use verbosity to control response size:
\- "summary": index, type, position only (~30 tokens/node)
\- "connections": + input connections (default, good balance)
\- "full": + properties + available pins (large response)

Use type_filter to only return nodes matching a type substring
(e.g. "Parameter" returns only parameter nodes).

Input parameters:

- `material_path` (string, required)
- `type_filter`
- `verbosity` (string)

Output parameters:

- `result` (string)

### `add_material_expression` (~125 tokens)

Add a single expression node without clearing other nodes.

Returns the new node_index. Wire it up with connect_material_expressions.

node is a JSON object: {"type": "ScalarParameter", "pos_x": -1200, "pos_y": -400,
"properties": {"parameter_name": "Speed", "default_value": 0.5}}

For Custom HLSL nodes, include top-level "code", "description", "output_type",
"inputs", and "outputs" fields.

Input parameters:

- `material_path` (string, required)
- `node` (string, required)

Output parameters:

- `result` (string)

### `connect_material_expressions` (~197 tokens)

Connect two expression nodes using their indices.

Args:
    from_node: Source node index
    to_node: Target node index (e.g. "5") or "material" for material output
    to_pin: Input pin name, or material property when to_node="material":
        BaseColor, Metallic, Specular, Roughness, Anisotropy, EmissiveColor,
        Opacity, OpacityMask, Normal, Tangent, WorldPositionOffset, Displacement,
        SubsurfaceColor, CustomData0, CustomData1, AmbientOcclusion, Refraction,
        PixelDepthOffset, ShadingModel, SurfaceThickness, FrontMaterial
    from_pin: Output pin name ("" = primary output)

Input parameters:

- `from_node` (integer, required)
- `from_pin` (string)
- `material_path` (string, required)
- `to_node` (string, required)
- `to_pin` (string, required)

Output parameters:

- `result` (string)

### `delete_material_expression` (~55 tokens)

Delete a single expression node by index. Recompiles and saves automatically.

Remaining node indices may shift — re-query with get_material_graph_nodes afterwards.

Input parameters:

- `material_path` (string, required)
- `node_index` (integer, required)

Output parameters:

- `result` (string)

### `add_material_comments` (~79 tokens)

Add comment boxes to a material graph for organization.

comments is a JSON array. Each entry: {text, pos_x, pos_y, size_x, size_y,
font_size, color: [r,g,b], show_bubble, color_bubble, group_mode}.

Input parameters:

- `comments` (string, required)
- `material_path` (string, required)

Output parameters:

- `result` (string)

### `get_material_expression_info` (~52 tokens)

Get detailed info for a single node, including all available input/output pins.

Use this before connecting nodes to discover exact pin names.

Input parameters:

- `material_path` (string, required)
- `node_index` (integer, required)

Output parameters:

- `result` (string)

### `get_material_property_connections` (~36 tokens)

Query which expression node feeds each material output slot.

Only lists slots that have something connected.

Input parameters:

- `material_path` (string, required)

Output parameters:

- `result` (string)

### `set_material_expression_property` (~113 tokens)

Set a property on an existing material expression node.

Accepts snake_case ("parameter_name") or PascalCase ("ParameterName").

Common properties: parameter_name, default_value, slider_min, slider_max,
group, texture, code, description, output_type, inputs, add_inputs, outputs,
SpeedX, SpeedY, CoordinateIndex, R, Constant.

Input parameters:

- `material_path` (string, required)
- `node_index` (integer, required)
- `property_name` (string, required)
- `property_value` (string, required)

Output parameters:

- `result` (string)

### `move_material_expression` (~52 tokens)

Move a material expression node to a new graph position.

Input parameters:

- `material_path` (string, required)
- `node_index` (integer, required)
- `pos_x` (integer, required)
- `pos_y` (integer, required)

Output parameters:

- `result` (string)

### `duplicate_material_expression` (~65 tokens)

Duplicate a node (same type and properties, offset from original).

Returns the new node_index. Connections are NOT copied.

Input parameters:

- `material_path` (string, required)
- `node_index` (integer, required)
- `offset_x` (integer)
- `offset_y` (integer)

Output parameters:

- `result` (string)

### `layout_material_expressions` (~30 tokens)

Auto-layout all nodes using Unreal's built-in arrangement algorithm.

Input parameters:

- `material_path` (string, required)

Output parameters:

- `result` (string)

### `get_material_instance_parameters` (~36 tokens)

Get all overridable parameters from a Material Instance (scalar, vector, texture, switch).

Input parameters:

- `material_path` (string, required)

Output parameters:

- `result` (string)

### `set_material_instance_parameter` (~89 tokens)

Set a parameter override on a Material Instance.

Args:
    param_type: scalar | vector | texture | static_switch
    value: JSON-encoded — float, [r,g,b,a], "/Game/path", or true/false

Input parameters:

- `material_path` (string, required)
- `param_name` (string, required)
- `param_type` (string, required)
- `value` (string, required)

Output parameters:

- `result` (string)

### `list_material_expression_types` (~82 tokens)

List available material expression node types.

Use filter to narrow results (e.g. "texture", "parameter", "math", "noise").
Set max_results to limit output (0 = unlimited).
Set include_details=false for compact output (type names only).

Input parameters:

- `filter`
- `include_details` (boolean)
- `max_results` (integer)

Output parameters:

- `result` (string)

### `get_expression_type_info` (~272 tokens)

Look up pin names and editable properties for a node type WITHOUT creating one.

Returns input pins, output pins, and all editable properties with types and defaults.
Use this BEFORE creating nodes to know exact pin names and avoid connection errors.

Special node types:
\- Custom: Returns additional custom_hlsl_schema with code/inputs/outputs documentation.
\- MaterialFunctionCall: Pass function_path to see the actual inputs/outputs of
    that function. Without it, pins will be empty since they depend on which
    function is loaded. Use search_material_functions to find functions first.
\- Substrate nodes (SubstrateSlabBSDF, SubstrateShadingModels, etc.): Returns
    substrate_note explaining how to connect to FrontMaterial pin.

Args:
    type_name: Short type name (e.g. "Multiply", "TextureSample", "Custom",
        "MaterialFunctionCall", "SubstrateSlabBSDF", "SubstrateShadingModels")
    function_path: For MaterialFunctionCall only — path to the material function
        to load (e.g. "/Engine/Functions/Engine_MaterialFunctions03/Blends/Blend_Overlay").
        Populates the node with the function's actual input/output pins.

Input parameters:

- `function_path`
- `type_name` (string, required)

Output parameters:

- `result` (string)

### `get_available_material_pins` (~109 tokens)

Query all available material output pins for a specific material.

Returns every pin that is currently visible (based on material settings),
whether it's connected, what type it expects, and which node feeds it.

Use this to discover valid to_pin values for connect_material_expressions
with to_node="material". The available pins change based on blend mode,
shading model, and whether Substrate is enabled.

Also reports substrate_enabled and has_front_material_connected status.

Input parameters:

- `material_path` (string, required)

Output parameters:

- `result` (string)

### `disconnect_material_expression` (~72 tokens)

Disconnect a specific input pin on a material expression node.

Args:
    node_index: The target node whose input pin will be disconnected
    input_pin: Name of the input pin to disconnect

Input parameters:

- `input_pin` (string, required)
- `material_path` (string, required)
- `node_index` (integer, required)

Output parameters:

- `result` (string)

### `search_material_functions` (~106 tokens)

Search for Material Functions by name.

Args:
    filter: Name substring to match (e.g. "Blend", "Normal", "Fresnel")
    path: Content Browser path to search in (default "/Game")
    max_results: Maximum results to return (default 50)
    include_engine: Include engine built-in material functions

Input parameters:

- `filter`
- `include_engine` (boolean)
- `max_results` (integer)
- `path` (string)

Output parameters:

- `result` (string)

### `validate_material_graph` (~107 tokens)

Diagnose connection issues in a material graph.

Categorises every node into:
\- orphaned: no inputs AND output not consumed — safe to delete
\- dead_ends: has inputs but output goes nowhere
\- missing_inputs: some input pins are empty
\- unconnected_inputs: ALL input pins are empty (node expects connections)
\- unconnected_outputs: output not consumed by anything

Returns healthy=true when no orphaned or dead-end nodes exist.

Input parameters:

- `material_path` (string, required)

Output parameters:

- `result` (string)

### `trace_material_connection` (~153 tokens)

Trace connections upstream and/or downstream from a specific node.

Shows exactly what feeds into each input pin and what consumes each output pin,
including connections to material outputs (BaseColor, Normal, etc.).

Args:
    node_index: The node to trace from
    direction: "upstream" (what feeds in), "downstream" (what consumes output),
        or "both" (default)
    max_depth: How many hops to trace recursively (1 = immediate neighbors,
        2+ = follow the chain). Max 50. Default 1.

Input parameters:

- `direction` (string)
- `material_path` (string, required)
- `max_depth` (integer)
- `node_index` (integer, required)

Output parameters:

- `result` (string)

### `cleanup_material_graph` (~185 tokens)

Delete orphaned and/or dead-end nodes from a material graph.

WARNING: NEVER call this tool unless the user explicitly asks to clean up
or delete unconnected nodes. Users may intentionally keep disconnected nodes
as references, scratchpads, or work-in-progress. Deleting them without
permission will cause data loss and frustration.

Args:
    mode: What to delete:
        "orphaned" — only nodes with NO connections at all (safest)
        "dead_ends" — nodes whose output goes nowhere (has inputs but no consumers)
        "all" — both orphaned and dead-ends
    dry_run: If true, reports what WOULD be deleted without actually deleting.
        Always use dry_run=true first to preview before deleting.

Input parameters:

- `dry_run` (boolean)
- `material_path` (string, required)
- `mode` (string)

Output parameters:

- `result` (string)

### `create_material_function` (~133 tokens)

Create a new Material Function asset.

Returns error if asset already exists. Pass force=true to delete and recreate.

Args:
    name: Function name (e.g. "MF_CustomBlend")
    path: Content Browser path
    description: Function description shown in tooltips
    expose_to_library: Whether the function appears in the material editor's function library
    force: If true, delete existing asset and recreate (default false)

Input parameters:

- `description` (string)
- `expose_to_library` (boolean)
- `force` (boolean)
- `name` (string, required)
- `path` (string)

Output parameters:

- `result` (string)

### `get_material_function_info` (~62 tokens)

Inspect a Material Function: inputs, outputs, internal nodes.

Returns all FunctionInput pins (name, type, default value, sort priority),
all FunctionOutput pins (name, connections), and a summary of internal nodes.

Input parameters:

- `function_path` (string, required)

Output parameters:

- `result` (string)

### `build_material_function_graph` (~273 tokens)

Build the internal node graph of a Material Function in one atomic call.

Same interface as build_material_graph but for Material Functions.

FunctionInput nodes use type="FunctionInput" with extra fields:
    input_name, input_type (Scalar/Vector2/Vector3/Vector4/Texture2D/TextureCube/
    Texture2DArray/VolumeTexture/StaticBool/MaterialAttributes/TextureExternal/Bool/Substrate),
    description, sort_priority, use_preview_as_default, preview_value ([x,y,z,w])

FunctionOutput nodes use type="FunctionOutput" with extra fields:
    output_name, description, sort_priority

Connections between nodes use the same format as build_material_graph:
    from_node (int), from_pin (str), to_node (int), to_pin (str)

To connect a node to a FunctionOutput's input, use to_pin="" (the output has
a single unnamed input pin labeled "A" internally).

Args:
    function_path: Full path to existing material function
    nodes: JSON array of node definitions
    connections: JSON array of connections
    clear_existing: Remove existing expressions before building (default True)

Input parameters:

- `clear_existing` (boolean)
- `connections` (string, required)
- `function_path` (string, required)
- `nodes` (string, required)

Output parameters:

- `result` (string)

### `add_material_function_input` (~267 tokens)

Add an input pin to a Material Function.

Args:
    function_path: Full path to existing material function
    input_name: Pin name (e.g. "BaseColor", "Strength", "UV")
    input_type: Scalar | Vector2 | Vector3 | Vector4 | Texture2D | TextureCube |
        Texture2DArray | VolumeTexture | StaticBool | MaterialAttributes |
        TextureExternal | Bool | Substrate
    description: Tooltip text
    sort_priority: Controls display order (lower = higher)
    use_preview_as_default: Use preview_value as the default when input is unconnected
    preview_value: JSON array for default value (e.g. "[0.5]", "[1.0, 0.0, 0.0, 1.0]")
    pos_x: Graph X position (default -600)
    pos_y: Graph Y position (default 0)

Input parameters:

- `description` (string)
- `function_path` (string, required)
- `input_name` (string, required)
- `input_type` (string)
- `pos_x` (integer)
- `pos_y` (integer)
- `preview_value`
- `sort_priority` (integer)
- `use_preview_as_default` (boolean)

Output parameters:

- `result` (string)

### `add_material_function_output` (~140 tokens)

Add an output pin to a Material Function.

Args:
    function_path: Full path to existing material function
    output_name: Pin name (e.g. "Result", "Normal", "Mask")
    description: Tooltip text
    sort_priority: Controls display order (lower = higher)
    pos_x: Graph X position (default 200)
    pos_y: Graph Y position (default 0)

Input parameters:

- `description` (string)
- `function_path` (string, required)
- `output_name` (string, required)
- `pos_x` (integer)
- `pos_y` (integer)
- `sort_priority` (integer)

Output parameters:

- `result` (string)

### `set_material_function_input` (~222 tokens)

Modify an existing FunctionInput node's properties.

Args:
    function_path: Full path to existing material function
    node_index: Index of the FunctionInput node (from get_material_function_info)
    input_name: New pin name
    input_type: New type (Scalar/Vector2/Vector3/Vector4/Texture2D/TextureCube/
        Texture2DArray/VolumeTexture/StaticBool/MaterialAttributes/
        TextureExternal/Bool/Substrate)
    description: New tooltip
    sort_priority: New display order
    use_preview_as_default: Use preview value as default
    preview_value: JSON array for default value (e.g. "[0.5]", "[1.0, 0.0, 0.0, 1.0]")

Input parameters:

- `description`
- `function_path` (string, required)
- `input_name`
- `input_type`
- `node_index` (integer, required)
- `preview_value`
- `sort_priority`
- `use_preview_as_default`

Output parameters:

- `result` (string)

### `set_material_function_output` (~104 tokens)

Modify an existing FunctionOutput node's properties.

Args:
    function_path: Full path to existing material function
    node_index: Index of the FunctionOutput node (from get_material_function_info)
    output_name: New pin name
    description: New tooltip
    sort_priority: New display order

Input parameters:

- `description`
- `function_path` (string, required)
- `node_index` (integer, required)
- `output_name`
- `sort_priority`

Output parameters:

- `result` (string)

### `validate_material_function` (~76 tokens)

Diagnose issues in a Material Function's internal graph.

Reports:
\- unconnected_outputs: FunctionOutput nodes with nothing wired to their input
\- unused_inputs: FunctionInput nodes whose output nobody consumes
\- orphaned: internal nodes with no connections at all

Returns healthy=true when no issues found.

Input parameters:

- `function_path` (string, required)

Output parameters:

- `result` (string)

### `cleanup_material_function` (~102 tokens)

Remove unconnected/orphaned nodes from a Material Function.

Deletes:
\- FunctionOutput nodes with no input wired (duplicate output pins)
\- FunctionInput nodes whose output nobody consumes (duplicate input pins)
\- Orphaned internal nodes

WARNING: Only call when the user explicitly asks to clean up.

Args:
    dry_run: If true, reports what would be deleted without deleting.

Input parameters:

- `dry_run` (boolean)
- `function_path` (string, required)

Output parameters:

- `result` (string)

### `search_parent_classes` (~127 tokens)

Search for classes that can be used as Blueprint parents.

Use this BEFORE create_blueprint to find the correct parent class name.
Returns a filtered list of matching classes — never dumps all classes.

Args:
    filter: Keyword to search for (e.g. "Miner", "Actor", "Pawn", "Widget")
    max_results: Maximum results (default 20, max 100)
    include_blueprint_classes: Also include Blueprint-generated classes (default True)

Input parameters:

- `filter` (string, required)
- `include_blueprint_classes` (boolean)
- `max_results` (integer)

Output parameters:

- `result` (string)

### `create_blueprint` (~112 tokens)

Create a new Blueprint asset from any C++ or Blueprint parent class.

Supports parent classes from ANY module (Engine, Game, plugins, etc.).
Use search_parent_classes first to find the correct name.

parent_class accepts short names ("MinerActor"), prefixed ("AMinerActor"),
full paths ("/Script/Jiggify.AMinerActor"), or BP paths ("/Game/Blueprints/BP_Base").

Input parameters:

- `name` (string, required)
- `parent_class` (string)
- `path` (string)

Output parameters:

- `result` (string)

### `add_component_to_blueprint` (~98 tokens)

Add a component to a Blueprint's default components.

Args:
    blueprint_path: Full path to blueprint (e.g. "/Game/Blueprints/BP_MyActor")
    component_class: e.g. "StaticMeshComponent", "PointLightComponent"
    component_name: Optional custom name for the component

Input parameters:

- `blueprint_path` (string, required)
- `component_class` (string, required)
- `component_name` (string)

Output parameters:

- `result` (string)

### `get_blueprint_class_defaults` (~111 tokens)

Get all default property values from a Blueprint's generated class CDO.

Unlike get_blueprint_variable_details (which only shows BP-defined variables),
this reads the CDO and returns ALL editable properties — including C++ parent ones.

Args:
    filter: Substring to filter property names (case-insensitive)
    include_inherited: Include properties from C++ parent (default True)

Input parameters:

- `blueprint_path` (string, required)
- `filter` (string)
- `include_inherited` (boolean)

Output parameters:

- `result` (string)

### `set_blueprint_class_defaults` (~174 tokens)

Set default property values on a Blueprint's generated class CDO.

Works on ALL editable properties — C++ parent properties and BP-defined
variables alike (e.g. SlotWidgetClass, MaxHealth, bCanFly).

Set a single property with property_name + property_value, or set multiple
at once with a properties dict. Both can be used in the same call.

Args:
    blueprint_path: Full path to blueprint (e.g. "/Game/Blueprints/BP_MyActor")
    property_name: Name of a single property to set
    property_value: Value for the single property (JSON-compatible)
    properties: Dict of property names to values for batch setting

Input parameters:

- `blueprint_path` (string, required)
- `properties`
- `property_name`
- `property_value`

Output parameters:

- `result` (string)

### `spawn_actor` (~108 tokens)

Spawn an actor in the level.

Args:
    name: Actor name
    actor_type: StaticMeshActor, PointLight, etc.
    location/rotation/scale: [x,y,z] arrays
    static_mesh: Path to static mesh asset (for mesh actors)

Input parameters:

- `actor_type` (string)
- `location` (array)
- `name` (string, required)
- `rotation` (array)
- `scale` (array)
- `static_mesh` (string)

Output parameters:

- `result` (string)

### `get_selected_actors` (~20 tokens)

Get all currently selected actors in the editor viewport.

Output parameters:

- `result` (string)

### `get_world_info` (~24 tokens)

Get current editor level info (world name, actor count, actor list).

Output parameters:

- `result` (string)

### `get_actor_properties` (~359 tokens)

Get property values from a live actor instance placed in the world.

Unlike get_blueprint_class_defaults (CDO), this reads the placed instance —
per-instance overrides are returned correctly.

Two output modes:
  \- Nested (default, flat=False): top-level FProperty names, structs as nested JSON.
    Filter only matches top-level names — best for quickly inspecting one actor.
  \- Flat (flat=True): every leaf returned as "Settings.BloomIntensity": value
    with a path-aware filter. Best for AI search ("find me everything containing 'bloom'").

Args:
    actor_label: Outliner label or UObject name.
    filter: Case-insensitive substring. Nested mode = top-level only;
        flat mode = matches full dotted path.
    include_components: Also return components' properties.
    flat: Return flat dotted-path dict instead of nested structure.
    max_depth: (flat mode) Max struct nesting depth. Default 3.
    include_metadata: (flat mode) Replace each value with full metadata object
        (type info, clamps, enum values, etc.).
    expand_arrays: (flat mode) Emit array elements as Field[N] entries.
    array_element_limit: (flat mode) Max elements emitted per array. Default 16.

Input parameters:

- `actor_label` (string, required)
- `array_element_limit` (integer)
- `category` (string)
- `cursor` (integer)
- `expand_arrays` (boolean)
- `filter` (string)
- `flat` (boolean)
- `include_components` (boolean)
- `include_inherited` (boolean)
- `include_metadata` (boolean)
- `max_depth` (integer)
- `max_entries` (integer)

Output parameters:

- `result` (string)

### `set_actor_property` (~309 tokens)

Set a property at any nested path on a placed level actor instance.

Writes to the actual placed actor (not its CDO/Blueprint defaults), so editor
overrides are preserved. Walks struct fields and array indices, fires
PostEditChangeProperty on the top-level property, and marks the level dirty.

Args:
    actor_label: Actor's display label in the Outliner (or its UObject name).
    property_path: Dot-separated property path. Examples:
        "Settings.BloomIntensity"
        "Settings.ColorGradingHighlights.Gain"
        "Tags[0]"
        "Settings.bOverride_BloomIntensity"
    property_value: The value to write. Accepts:
        - Numbers, bools, strings for primitives and enums
        - JSON object for structs ({"R":1.0,"G":0.5,"B":0.0,"A":1.0} for FLinearColor)
        - UE text format string for structs ("(R=1.0,G=0.5,B=0.0,A=1.0)")
        - Asset path string for object/class references
    component_name: Optional. If set, the path is resolved starting from a
        component on the actor instead of the actor itself.

Returns: actor identification + the resolved top-level FProperty name.

Input parameters:

- `actor_label` (string, required)
- `component_name` (string)
- `property_path` (string, required)
- `property_value` (required)

Output parameters:

- `result` (string)

### `get_actor_property_metadata` (~571 tokens)

Inspect type/clamp/enum metadata for properties on a placed actor.

Returns a flat dict keyed by dotted path with per-property metadata
(cpp_type, ue_type, category, display_name, tooltip, current_value, clamp_min/max,
ui_min/max, valid_values for enums, inner/element/key/value types for containers,
object_class / meta_class for refs, plus is_struct/is_array/is_enum/is_object
/is_bool / editable / transient / readonly flags).

ALSO returns a "_summary" header containing total_available, total_returned,
truncated, next_cursor, own_count, inherited_count, class_chain, and a
"categories" map (UPROPERTY Category -> count) — use this to navigate without
flooding context. max_entries=0 returns ONLY the summary so you can plan first.

Args:
    actor_label: Outliner label or UObject name.
    property_path: Optional dotted path. Empty = enumerate top-level properties.
        If the path is a struct, enumerates that struct's fields. If a leaf
        scalar/enum, returns metadata for just that property. If an OBJECT
        REFERENCE, returns single-property metadata for the ref + a hint
        (use component_name to inspect the target's properties), unless
        descend_into_objects=True is passed.
    filter: Case-insensitive substring on full dotted path.
    category: Case-insensitive exact match against UPROPERTY(Category="X").
        Sub-categories use "|" — e.g. "Lens|Bloom".
    depth: How many struct levels to expand below the start point. 0 = flat.
    expand_enums: Include valid_values list for enum-typed fields.
    include_inherited: Include properties from super classes. False = only
        those declared on the most-derived class (use to scope down components).
    descend_into_objects: When property_path lands on an FObjectProperty,
        enumerate the target object's class instead of returning a single
        metadata blob. Disabled by default — prefer component_name.
    max_entries: Hard cap on emitted entries. Default 50. 0 = summary only.…

Input parameters:

- `actor_label` (string, required)
- `category` (string)
- `component_name` (string)
- `cursor` (integer)
- `depth` (integer)
- `descend_into_objects` (boolean)
- `expand_enums` (boolean)
- `filter` (string)
- `include_inherited` (boolean)
- `max_entries` (integer)
- `property_path` (string)

Output parameters:

- `result` (string)

### `spawn_actor_by_class` (~277 tokens)

Spawn ANY AActor subclass by full path, short name, or Blueprint asset path.

Replaces the hardcoded whitelist of spawn_actor. Resolves class_path in this order:
1\. Full UClass path with '.' (e.g. "/Script/Engine.PostProcessVolume",
   "/Script/Engine.SkyAtmosphere")
2\. Blueprint asset path (e.g. "/Game/Blueprints/BP_Miner") — loads the asset and
   uses its GeneratedClass.
3\. Short name fallback — iterates loaded UClasses for a name match
   (handles "PostProcessVolume", "APostProcessVolume", "Sky_Sphere_C", etc.)

Validates: must be AActor subclass, not abstract, not deprecated.
Uses UEditorActorSubsystem::SpawnActorFromClass when available so Ctrl+Z restores.

Args:
    class_path: Full path, BP asset path, or short class name.
    name:       Optional outliner label + UObject name.
    location:   [x, y, z] world location.
    rotation:   [pitch, yaw, roll] degrees.
    scale:      [x, y, z] scale.

Input parameters:

- `class_path` (string, required)
- `location`
- `name` (string)
- `rotation`
- `scale`

Output parameters:

- `result` (string)

### `find_actors` (~277 tokens)

Flexible actor search across the level — combine any number of filters.

Use this to answer "is X in the world", "first 5 actors of class Y", "all actors
starting with name Z and tagged W". All filters AND together. Returns total count
scanned/matched even when results are truncated.

Args:
    name_pattern: Case-insensitive substring on UObject name (e.g. "Light").
    label_pattern: Case-insensitive substring on outliner display label.
    class_filter: Class name (short or full path). When it resolves to a real
        UClass, uses IsA() (or exact_class for ==). Otherwise falls back to
        substring match on the actor's class name/path.
    tag: Match actors with this FName in their Tags.
    exact_class: When class_filter resolves to a UClass, require exact match
        instead of subclass.
    max_results: Cap on returned entries (0 = unlimited; truncated flag set).
    include_transform: Include location/rotation/scale per entry.

Input parameters:

- `class_filter` (string)
- `exact_class` (boolean)
- `include_transform` (boolean)
- `label_pattern` (string)
- `max_results` (integer)
- `name_pattern` (string)
- `tag` (string)

Output parameters:

- `result` (string)

### `get_data_table_rows` (~32 tokens)

Get all rows and their field data from a Data Table asset.

Input parameters:

- `data_table_path` (string, required)

Output parameters:

- `result` (string)

### `get_data_table_row` (~40 tokens)

Get a single row from a Data Table by its row name.

Input parameters:

- `data_table_path` (string, required)
- `row_name` (string, required)

Output parameters:

- `result` (string)

### `get_data_table_schema` (~33 tokens)

Get column names and types defined by the Data Table's row struct.

Input parameters:

- `data_table_path` (string, required)

Output parameters:

- `result` (string)

### `add_data_table_row` (~67 tokens)

Add a new row, optionally setting initial field values.

data is a JSON string mapping field names to values, e.g. '{"FieldA": 1}'.

Input parameters:

- `data` (string)
- `data_table_path` (string, required)
- `row_name` (string, required)

Output parameters:

- `result` (string)

### `update_data_table_row` (~76 tokens)

Update specific fields on an existing row (partial update).

Only fields present in data are modified; everything else keeps its value.
data is a JSON string, e.g. '{"DisplayName": "Miner"}'.

Input parameters:

- `data` (string, required)
- `data_table_path` (string, required)
- `row_name` (string, required)

Output parameters:

- `result` (string)

### `delete_data_table_row` (~37 tokens)

Delete a row from a Data Table by name.

Input parameters:

- `data_table_path` (string, required)
- `row_name` (string, required)

Output parameters:

- `result` (string)

### `rename_data_table_row` (~48 tokens)

Rename a row in-place (preserves row order).

Input parameters:

- `data_table_path` (string, required)
- `new_row_name` (string, required)
- `old_row_name` (string, required)

Output parameters:

- `result` (string)

### `duplicate_data_table_row` (~46 tokens)

Copy an existing row under a new name.

Input parameters:

- `data_table_path` (string, required)
- `new_row_name` (string, required)
- `source_row_name` (string, required)

Output parameters:

- `result` (string)

### `add_blueprint_node` (~236 tokens)

Add a node to a Blueprint graph.

Node types by category:
  FLOW:      Branch, Comparison, Switch, SwitchEnum, SwitchInteger, ExecutionSequence
  DATA:      VariableGet, VariableSet, MakeArray
  CASTING:   DynamicCast, ClassDynamicCast, CastByteToEnum
  UTILITY:   Print, CallFunction, Select, SpawnActor
  SPECIAL:   Timeline, GetDataTableRow, AddComponentByClass, Self, Knot
  EVENT:     Event (specify event_type: BeginPlay, Tick, Destroyed, etc.)

Extra args are only needed for specific node types (message for Print,
variable_name for Variable nodes, target_function for CallFunction, etc.).

Input parameters:

- `blueprint_name` (string, required)
- `event_type` (string)
- `function_name` (string)
- `message` (string)
- `node_type` (string, required)
- `pos_x` (number)
- `pos_y` (number)
- `target_blueprint` (string)
- `target_function` (string)
- `variable_name` (string)

Output parameters:

- `result` (string)

### `connect_blueprint_nodes` (~128 tokens)

Connect two nodes in a Blueprint graph.

Args:
    source_node_id: GUID of the source node
    source_pin_name: Output pin name on source
    target_node_id: GUID of the target node
    target_pin_name: Input pin name on target
    function_name: Function graph (empty = EventGraph)

Input parameters:

- `blueprint_name` (string, required)
- `function_name` (string)
- `source_node_id` (string, required)
- `source_pin_name` (string, required)
- `target_node_id` (string, required)
- `target_pin_name` (string, required)

Output parameters:

- `result` (string)

### `create_blueprint_variable` (~87 tokens)

Create a variable in a Blueprint.

variable_type: bool, int, float, string, vector, rotator

Input parameters:

- `blueprint_name` (string, required)
- `category` (string)
- `default_value` (string)
- `is_public` (boolean)
- `tooltip` (string)
- `variable_name` (string, required)
- `variable_type` (string, required)

Output parameters:

- `result` (string)

### `set_blueprint_variable_properties` (~134 tokens)

Modify properties of an existing Blueprint variable.

All parameters besides blueprint_name and variable_name are optional —
only provided values are changed.

Input parameters:

- `blueprint_name` (string, required)
- `category` (string)
- `default_value` (string)
- `expose_on_spawn` (boolean)
- `is_editable_in_instance` (boolean)
- `is_public` (boolean)
- `replication_condition` (integer)
- `replication_enabled` (boolean)
- `tooltip` (string)
- `var_name` (string)
- `var_type` (string)
- `variable_name` (string, required)

Output parameters:

- `result` (string)

### `add_event_node` (~58 tokens)

Add an event node (ReceiveBeginPlay, ReceiveTick, ReceiveDestroyed, etc.).

Input parameters:

- `blueprint_name` (string, required)
- `event_name` (string, required)
- `pos_x` (number)
- `pos_y` (number)

Output parameters:

- `result` (string)

### `delete_blueprint_node` (~44 tokens)

Delete a node from a Blueprint graph by GUID.

Input parameters:

- `blueprint_name` (string, required)
- `function_name` (string)
- `node_id` (string, required)

Output parameters:

- `result` (string)

### `set_blueprint_node_property` (~201 tokens)

Set a node property or perform semantic editing.

Semantic actions (pass via 'action'):
  add_pin, remove_pin, set_enum_type, set_pin_type,
  set_value_type, set_cast_target, set_function_call, set_event_type

Each action has associated params (pin_type, pin_name, enum_type, new_type,
target_type, target_function, target_class, event_type).

Input parameters:

- `action` (string)
- `blueprint_name` (string, required)
- `enum_type` (string)
- `event_type` (string)
- `function_name` (string)
- `new_type` (string)
- `node_id` (string, required)
- `pin_name` (string)
- `pin_type` (string)
- `property_name` (string)
- `property_value` (string)
- `target_class` (string)
- `target_function` (string)
- `target_type` (string)

Output parameters:

- `result` (string)

### `create_blueprint_function` (~42 tokens)

Create a new function in a Blueprint.

Input parameters:

- `blueprint_name` (string, required)
- `function_name` (string, required)
- `return_type` (string)

Output parameters:

- `result` (string)

### `add_function_input` (~58 tokens)

Add an input parameter to a Blueprint function.

Input parameters:

- `blueprint_name` (string, required)
- `function_name` (string, required)
- `is_array` (boolean)
- `param_name` (string, required)
- `param_type` (string, required)

Output parameters:

- `result` (string)

### `add_function_output` (~58 tokens)

Add an output parameter to a Blueprint function.

Input parameters:

- `blueprint_name` (string, required)
- `function_name` (string, required)
- `is_array` (boolean)
- `param_name` (string, required)
- `param_type` (string, required)

Output parameters:

- `result` (string)

### `delete_blueprint_function` (~33 tokens)

Delete a function from a Blueprint.

Input parameters:

- `blueprint_name` (string, required)
- `function_name` (string, required)

Output parameters:

- `result` (string)

### `rename_blueprint_function` (~43 tokens)

Rename a function in a Blueprint.

Input parameters:

- `blueprint_name` (string, required)
- `new_function_name` (string, required)
- `old_function_name` (string, required)

Output parameters:

- `result` (string)

### `read_blueprint_content` (~73 tokens)

Read complete Blueprint content: event graph, functions, variables, components.

Input parameters:

- `blueprint_path` (string, required)
- `include_components` (boolean)
- `include_event_graph` (boolean)
- `include_functions` (boolean)
- `include_interfaces` (boolean)
- `include_variables` (boolean)

Output parameters:

- `result` (string)

### `analyze_blueprint_graph` (~66 tokens)

Analyze a specific graph — nodes, connections, and execution flow.

Input parameters:

- `blueprint_path` (string, required)
- `graph_name` (string)
- `include_node_details` (boolean)
- `include_pin_connections` (boolean)
- `trace_execution_flow` (boolean)

Output parameters:

- `result` (string)

### `get_blueprint_variable_details` (~40 tokens)

Get detailed info about Blueprint variables (empty name = all variables).

Input parameters:

- `blueprint_path` (string, required)
- `variable_name` (string)

Output parameters:

- `result` (string)

### `get_blueprint_function_details` (~48 tokens)

Get detailed info about Blueprint functions (empty name = all functions).

Input parameters:

- `blueprint_path` (string, required)
- `function_name` (string)
- `include_graph` (boolean)

Output parameters:

- `result` (string)

### `compile_blueprint` (~21 tokens)

Compile a Blueprint.

Input parameters:

- `blueprint_name` (string, required)

Output parameters:

- `result` (string)

### `get_actors_in_level` (~19 tokens)

List all actors in the current level.

Output parameters:

- `result` (string)

### `find_actors_by_name` (~27 tokens)

Find actors whose name matches the given pattern.

Input parameters:

- `pattern` (string, required)

Output parameters:

- `result` (string)

### `delete_actor` (~24 tokens)

Delete an actor from the level by name.

Input parameters:

- `name` (string, required)

Output parameters:

- `result` (string)

### `set_actor_transform` (~49 tokens)

Set an actor's location, rotation, and/or scale.

Input parameters:

- `location` (array)
- `name` (string, required)
- `rotation` (array)
- `scale` (array)

Output parameters:

- `result` (string)

### `spawn_blueprint_actor` (~55 tokens)

Spawn a Blueprint actor instance in the level.

Input parameters:

- `blueprint_path` (string, required)
- `location` (array)
- `name` (string)
- `rotation` (array)
- `scale` (array)

Output parameters:

- `result` (string)

### `set_static_mesh_properties` (~47 tokens)

Set the static mesh on a StaticMeshComponent in a Blueprint.

Input parameters:

- `blueprint_name` (string, required)
- `component_name` (string, required)
- `static_mesh` (string)

Output parameters:

- `result` (string)

### `set_physics_properties` (~76 tokens)

Set physics properties on a Blueprint component.

Input parameters:

- `angular_damping` (number)
- `blueprint_name` (string, required)
- `component_name` (string, required)
- `gravity_enabled` (boolean)
- `linear_damping` (number)
- `mass` (number)
- `simulate_physics` (boolean)

Output parameters:

- `result` (string)

### `set_mesh_material_color` (~82 tokens)

Set material color on a mesh component.

color: [R, G, B, A] values 0-1

Input parameters:

- `blueprint_name` (string, required)
- `color` (array, required)
- `component_name` (string, required)
- `material_path` (string)
- `material_slot` (integer)
- `parameter_name` (string)

Output parameters:

- `result` (string)

### `get_available_materials` (~115 tokens)

List materials that can be applied to objects.

Args:
    search_path: Content Browser root to scan (e.g. "/Game/Weapons/")
    include_engine_materials: Include /Engine/ materials in results
    filter: Case-insensitive substring match on material asset name
    max_results: Cap on returned entries. 0 = unlimited (use sparingly)

Input parameters:

- `filter`
- `include_engine_materials` (boolean)
- `max_results` (integer)
- `search_path` (string)

Output parameters:

- `result` (string)

### `apply_material_to_actor` (~42 tokens)

Apply a material to a level actor.

Input parameters:

- `actor_name` (string, required)
- `material_path` (string, required)
- `material_slot` (integer)

Output parameters:

- `result` (string)

### `apply_material_to_blueprint` (~51 tokens)

Apply a material to a Blueprint component.

Input parameters:

- `blueprint_name` (string, required)
- `component_name` (string, required)
- `material_path` (string, required)
- `material_slot` (integer)

Output parameters:

- `result` (string)

### `get_actor_material_info` (~27 tokens)

Get material slot info for a level actor.

Input parameters:

- `actor_name` (string, required)

Output parameters:

- `result` (string)

### `get_blueprint_material_info` (~30 tokens)

Get material slot info for a Blueprint's mesh components.

Input parameters:

- `blueprint_name` (string, required)

Output parameters:

- `result` (string)

### `take_screenshot` (~81 tokens)

Capture the editor to a PNG.

mode "viewport" captures the level viewport; "window" captures the
entire active editor window (material editor, BP graph, widget designer, etc.).

Returns the file path, width, and height. Use Read tool to view the image.

Input parameters:

- `file_path` (string)
- `mode` (string)

Output parameters:

- `result` (string)

### `list_data_asset_classes` (~65 tokens)

List all UDataAsset subclasses currently loaded in the editor.

Returns name, full class path, parent class, whether it is a
UPrimaryDataAsset, and the number of editable properties.

Input parameters:

- `filter` (string)
- `include_abstract` (boolean)

Output parameters:

- `result` (string)

### `create_data_asset` (~122 tokens)

Create a new data asset of any UDataAsset subclass.

Args:
    class_name: Short name ("ItemData") or full path ("/Script/Jiggify.UItemData")
    asset_path: Full content path including name (e.g. "/Game/Data/Items/DA_IronOre")
    initial_properties: Optional dict of property values to set after creation.
        Supports primitives, structs, arrays, object paths, gameplay tags, etc.

Input parameters:

- `asset_path` (string, required)
- `class_name` (string, required)
- `initial_properties`

Output parameters:

- `result` (string)

### `get_data_asset_properties` (~79 tokens)

Read ALL property values from a data asset (no visibility filter).

Args:
    filter: Substring to filter property names (case-insensitive)
    include_inherited: Include properties from parent C++ classes (default True)

Input parameters:

- `asset_path` (string, required)
- `filter` (string)
- `include_inherited` (boolean)

Output parameters:

- `result` (string)

### `set_data_asset_property` (~308 tokens)

Set a single property on a data asset.

Supports all types: primitives, enums, FName, FText, structs ({"tagName": "..."}),
arrays, object refs ("/Game/..."), soft refs, and None (clears reference).

property_name is case-sensitive (exact FProperty name).

\**Mass Entity Config — Editing Trait Properties:**
To edit trait properties on a MassEntityConfigAsset (e.g., BeltSpeed, SlotCount),
set property_name="Config" with a JSON value containing the Traits array.
Each trait needs a "_ClassName" with FULL path "/Script/Module.ClassName".

Example — set BeltSpeed on a conveyor config:
    set_data_asset_property(
        asset_path="/Game/.../DA_ConveyorMassConfig_Mk2",
        property_name="Config",
        property_value={
            "Traits": [{"_ClassName": "/Script/Jiggify.MassConveyorBeltTrait", "BeltSpeed": 200}]
        }
    )

IMPORTANT: _ClassName MUST be full path ("/Script/Jiggify.MassConveyorBeltTrait"),
NOT short name ("MassConveyorBeltTrait"). Short names create wrong base class.
For configs with multiple traits, include ALL traits in the array (entire array is replaced).
Only set the properties you want to change — others use C++ defaults.

Input parameters:

- `asset_path` (string, required)
- `property_name` (string, required)
- `property_value` (required)

Output parameters:

- `result` (string)

### `set_data_asset_properties` (~60 tokens)

Set multiple properties in a single call (one load + one save).

More efficient than calling set_data_asset_property in a loop.
Same value format as set_data_asset_property.

Input parameters:

- `asset_path` (string, required)
- `properties` (object, required)

Output parameters:

- `result` (string)

### `get_property_valid_types` (~244 tokens)

Return valid classes/structs/enum-values for a property dropdown.

Mirrors the exact enumeration the Unreal Details panel uses:
\- Instanced UObject* / TArray<UObject*>  -> GetDerivedClasses(PropertyClass)
\- TSubclassOf<T>                         -> GetDerivedClasses(MetaClass)
\- TArray<FInstancedStruct>               -> UScriptStruct descendants of BaseStruct
\- Enum properties                        -> all named entries + values

Supports dot-notation: property_path="Config.Traits" navigates into nested structs.

IMPORTANT: Use 'filter' to avoid huge responses — without it, properties like
Fragments return 200+ entries (~10k tokens).

Args:
    class_name: Class or struct name (e.g. "MassAssortedFragmentsTrait")
    property_path: Dot-separated path (e.g. "Config.Traits", "Fragments")
    filter: Case-insensitive substring filter on name and path
    include_abstract: Include abstract base classes (default False)

Input parameters:

- `class_name` (string, required)
- `filter` (string)
- `include_abstract` (boolean)
- `property_path` (string, required)

Output parameters:

- `result` (string)

### `search_class_paths` (~302 tokens)

Search for UClass types by name filter and parent class constraint.
Returns full /Script/Module.ClassName paths needed for _ClassName in trait editing.

Use this to find the correct class_path before calling set_data_asset_property
with Mass Entity Config traits.

Args:
    filter: Case-insensitive substring match on class name (e.g. "Conveyor", "Miner")
    parent_class: Only return subclasses of this class (e.g. "MassEntityTraitBase"
        for traits, "MassFragment" for fragments, "MassTag" for tags,
        "MassProcessor" for processors). Empty = search all classes.
    max_results: Maximum results to return (default 50)
    include_properties: If true, also return each class's editable UPROPERTY names,
        types, and default values. Use sparingly — adds tokens per result.

Examples:
    search_class_paths(filter="Conveyor", parent_class="MassEntityTraitBase")
    → finds MassConveyorBeltTrait with class_path "/Script/Jiggify.MassConveyorBeltTrait"

    search_class_paths(filter="Pipeline", parent_class="MassFragment")
    → finds all pipeline-related fragments

    search_class_paths(parent_class="MassEntityTraitBase")
    → lists ALL available traits (no filter)

Input parameters:

- `filter` (string)
- `include_properties` (boolean)
- `max_results` (integer)
- `parent_class` (string)

Output parameters:

- `result` (string)

### `get_mass_config_traits` (~115 tokens)

Read all traits from a Mass Entity Config asset with their properties expanded.

Unlike get_data_asset_properties (which shows trait object paths), this tool
expands each trait's editable properties with current values.

Args:
    asset_path: Path to MassEntityConfigAsset (e.g. "/Game/.../DA_ConveyorMassConfig_Mk1")

Returns per trait: index, name, class, class_path (for _ClassName), and all
editable properties with current values.

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `add_mass_config_trait` (~170 tokens)

Add a SINGLE trait to a Mass Entity Config without replacing existing traits.

Safe for configs with complex replicator settings — only appends, never replaces.
Returns error if the trait already exists on the config.

Args:
    asset_path: Path to MassEntityConfigAsset (e.g. "/Game/.../DA_MinerMassEntityConfig_Mk1")
    trait_class: Full class path (e.g. "/Script/Jiggify.MassBuildingHealthTrait")
    properties: Optional dict of property values to set on the new trait.
        Supports floats, ints, bools, strings.
        Example: {"MaxHealth": 150, "Resistance_Fire": 0.2}

Input parameters:

- `asset_path` (string, required)
- `properties`
- `trait_class` (string, required)

Output parameters:

- `result` (string)

### `set_mass_config_trait_property` (~480 tokens)

Modify properties on an EXISTING trait in a Mass Entity Config in-place.

Never replaces the Traits array, never creates new UObjects. Only touches
the specific properties you provide — all other trait values stay intact.
Uses Unreal's own ImportText reflection so it supports ANY property type
(structs, arrays, object refs, meshes, LOD params, enums, etc.).

Identify the trait by EITHER trait_index OR trait_class (not both required).
Set properties with EITHER property_name+property_value (single) OR
properties dict (batch).

Args:
    asset_path: Path to MassEntityConfigAsset
    trait_index: Index of the trait in the Traits array (from get_mass_config_traits)
    trait_class: Class name or full path (e.g. "MassMovementTrait" or
        "/Script/MassMovement.MassMovementTrait")
    property_name: Single property to set (requires property_value)
    property_value: Value for property_name. For structs use dict, for
        object refs use asset path string, for enums use name string.
    properties: Batch set multiple properties {name: value, ...}

Examples:
    # Set MaxSpeed on movement trait by class name
    set_mass_config_trait_property(
        asset_path="/Jiggify/Game/.../DA_Config",
        trait_class="MassMovementTrait",
        property_name="Movement",
        property_value={"MaxSpeed": 300, "MaxAcceleration": 500}
    )

    # Set LODMaxCount on visualization trait by index
    set_mass_config_trait_property(
        asset_path="/Jiggify/Game/.../DA_Config",
        trait_index=4,
        property_name="LODParams",
        property_value={"LODMaxCount": [2000, 5000, 10000, 2147483647]}
    )

    # Batch set multiple properties
    set_mass_config_trait_property(
        asset_path="/Jiggify/Game/.../DA_Config",
        trait_class="MassEnemyTrait",
        properties={"MaxHealth": 50, "BaseDamage": 10, "MoveSpeed": 400}
    )

Input parameters:

- `asset_path` (string, required)
- `properties`
- `property_name`
- `property_value`
- `trait_class`
- `trait_index`

Output parameters:

- `result` (string)

### `remove_mass_config_trait` (~102 tokens)

Remove a single trait from a Mass Entity Config without affecting other traits.

Identify the trait by EITHER trait_index OR trait_class (not both required).

Args:
    asset_path: Path to MassEntityConfigAsset
    trait_index: Index of the trait to remove
    trait_class: Class name or full path (e.g. "MassMovementTrait")

Input parameters:

- `asset_path` (string, required)
- `trait_class`
- `trait_index`

Output parameters:

- `result` (string)

### `list_data_assets` (~92 tokens)

List data assets in a content path, optionally filtered by class.

Args:
    path: Content Browser path (e.g. "/Game/Data")
    class_filter: Class name filter (e.g. "UItemData"). Matches any UDataAsset if empty.

Input parameters:

- `class_filter` (string)
- `max_results` (integer)
- `path` (string)
- `recursive` (boolean)

Output parameters:

- `result` (string)

### `get_widget_tree` (~56 tokens)

Read the complete widget hierarchy from a Widget Blueprint's Designer.

Returns a recursive JSON tree: name, class, is_panel, is_variable,
slot_class, and children[] for panels.

Input parameters:

- `widget_blueprint_path` (string, required)

Output parameters:

- `result` (string)

### `add_widget` (~195 tokens)

Add a new widget to a Widget Blueprint's Designer tree.

Args:
    widget_class: Short name like "TextBlock", "Image", "Button",
        "CanvasPanel", "VerticalBox", "HorizontalBox", "Overlay",
        "SizeBox", "Border", "ScrollBox", "ProgressBar", etc.
    parent_widget_name: Name of the parent panel (e.g. "CanvasPanel_0")
    widget_name: Optional name (auto-generated if empty)
    index: Insert position among siblings (-1 = append)
    slot_properties: Canvas anchors, offsets, etc.
    widget_properties: Widget values like {"Text": "Hello"}

Input parameters:

- `index` (integer)
- `parent_widget_name` (string, required)
- `slot_properties`
- `widget_blueprint_path` (string, required)
- `widget_class` (string, required)
- `widget_name` (string)
- `widget_properties`

Output parameters:

- `result` (string)

### `remove_widget` (~39 tokens)

Remove a widget and its children. Cannot remove the root widget.

Input parameters:

- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `move_widget` (~59 tokens)

Move a widget to a different parent panel.

Cannot move root or into own descendants.

Input parameters:

- `index` (integer)
- `new_parent_name` (string, required)
- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `rename_widget` (~49 tokens)

Rename a widget (fixes up Blueprint variable tracking if bIsVariable).

Input parameters:

- `new_name` (string, required)
- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `duplicate_widget` (~56 tokens)

Deep-copy a widget including children. Auto-renames on conflicts.

Input parameters:

- `new_name` (string)
- `parent_widget_name` (string)
- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `get_widget_properties` (~57 tokens)

Read all property values from a widget (supports all FProperty types).

Input parameters:

- `filter` (string)
- `include_inherited` (boolean)
- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `set_widget_properties` (~47 tokens)

Set multiple widget properties. Same format as set_data_asset_properties.

Input parameters:

- `properties` (object, required)
- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `get_slot_properties` (~54 tokens)

Read layout slot properties (type depends on parent: CanvasPanelSlot, HorizontalBoxSlot, etc.).

Input parameters:

- `filter` (string)
- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `set_slot_properties` (~49 tokens)

Set layout slot properties (anchors, offsets, padding, alignment, etc.).

Input parameters:

- `properties` (object, required)
- `widget_blueprint_path` (string, required)
- `widget_name` (string, required)

Output parameters:

- `result` (string)

### `list_widget_types` (~45 tokens)

List available UWidget subclasses. Use filter to narrow results.

Input parameters:

- `filter` (string)
- `include_abstract` (boolean)
- `panels_only` (boolean)

Output parameters:

- `result` (string)

### `create_input_action` (~92 tokens)

Create a new UInputAction asset.

Args:
    asset_path: Full content path including name (e.g. "/Game/Input/IA_Jump")
    value_type: Boolean | Axis1D | Axis2D | Axis3D
    properties: Optional dict of additional properties to set after creation

Input parameters:

- `asset_path` (string, required)
- `properties`
- `value_type` (string)

Output parameters:

- `result` (string)

### `get_input_action` (~57 tokens)

Read all properties, triggers, and modifiers of an Input Action.

Returns value_type, consume_input, trigger_when_paused, accumulation_behavior,
and full details of all triggers and modifiers with their properties.

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `set_input_action_properties` (~90 tokens)

Set properties on an Input Action.

Args:
    asset_path: Path to the InputAction asset
    value_type: Convenience shortcut — Boolean | Axis1D | Axis2D | Axis3D
    properties: Dict of property names to values (e.g. {"bConsumeInput": false})

Input parameters:

- `asset_path` (string, required)
- `properties`
- `value_type`

Output parameters:

- `result` (string)

### `add_input_action_trigger` (~133 tokens)

Add a trigger to an Input Action.

Args:
    asset_path: Path to the InputAction asset
    trigger_type: Class name — InputTriggerDown | InputTriggerPressed | InputTriggerReleased |
        InputTriggerHold | InputTriggerHoldAndRelease | InputTriggerTap |
        InputTriggerRepeatedTap | InputTriggerPulse | InputTriggerChordAction | InputTriggerCombo
    properties: Optional trigger properties (e.g. {"HoldTimeThreshold": 0.5, "bIsOneShot": true})

Input parameters:

- `asset_path` (string, required)
- `properties`
- `trigger_type` (string, required)

Output parameters:

- `result` (string)

### `add_input_action_modifier` (~149 tokens)

Add a modifier to an Input Action.

Args:
    asset_path: Path to the InputAction asset
    modifier_type: Class name — InputModifierDeadZone | InputModifierScalar | InputModifierNegate |
        InputModifierSwizzleAxis | InputModifierSmooth | InputModifierSmoothDelta |
        InputModifierScaleByDeltaTime | InputModifierResponseCurveExponential |
        InputModifierResponseCurveUser | InputModifierFOVScaling | InputModifierToWorldSpace
    properties: Optional modifier properties (e.g. {"LowerThreshold": 0.2, "Type": "Radial"})

Input parameters:

- `asset_path` (string, required)
- `modifier_type` (string, required)
- `properties`

Output parameters:

- `result` (string)

### `remove_input_action_trigger` (~45 tokens)

Remove a trigger from an Input Action by index.

Use get_input_action to see current trigger indices.

Input parameters:

- `asset_path` (string, required)
- `index` (integer, required)

Output parameters:

- `result` (string)

### `remove_input_action_modifier` (~45 tokens)

Remove a modifier from an Input Action by index.

Use get_input_action to see current modifier indices.

Input parameters:

- `asset_path` (string, required)
- `index` (integer, required)

Output parameters:

- `result` (string)

### `list_input_actions` (~68 tokens)

List all UInputAction assets, optionally filtered by name and path.

Returns name, path, value_type, trigger_count, modifier_count for each.

Input parameters:

- `filter` (string)
- `max_results` (integer)
- `path` (string)
- `recursive` (boolean)

Output parameters:

- `result` (string)

### `create_input_mapping_context` (~64 tokens)

Create a new UInputMappingContext asset.

Args:
    asset_path: Full content path including name (e.g. "/Game/Input/IMC_Default")
    description: Optional localized description

Input parameters:

- `asset_path` (string, required)
- `description` (string)

Output parameters:

- `result` (string)

### `get_input_mapping_context` (~45 tokens)

Read all key mappings from an Input Mapping Context.

Returns each mapping's key, action, triggers, and modifiers with full property details.

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `add_key_mapping` (~150 tokens)

Add a key-to-action mapping to an Input Mapping Context.

Args:
    context_path: Path to the IMC asset
    action_path: Path to the InputAction asset
    key: Key name (e.g. "SpaceBar", "W", "Gamepad_LeftY", "LeftMouseButton")
    triggers: Optional list of triggers, each {"type": "InputTriggerHold", "properties": {...}}
    modifiers: Optional list of modifiers, each {"type": "InputModifierNegate", "properties": {...}}

Input parameters:

- `action_path` (string, required)
- `context_path` (string, required)
- `key` (string, required)
- `modifiers`
- `triggers`

Output parameters:

- `result` (string)

### `remove_key_mapping` (~106 tokens)

Remove a key mapping from an Input Mapping Context.

Remove by index OR by action_path + key combination.

Args:
    context_path: Path to the IMC asset
    index: Mapping index to remove (from get_input_mapping_context)
    action_path: Alternative — remove by action + key combo
    key: Alternative — remove by action + key combo

Input parameters:

- `action_path`
- `context_path` (string, required)
- `index`
- `key`

Output parameters:

- `result` (string)

### `set_key_mapping` (~89 tokens)

Change the key or action on an existing mapping in an IMC.

Args:
    context_path: Path to the IMC asset
    index: Mapping index to modify
    key: New key name (optional)
    action_path: New action path (optional)

Input parameters:

- `action_path`
- `context_path` (string, required)
- `index` (integer, required)
- `key`

Output parameters:

- `result` (string)

### `add_mapping_trigger` (~102 tokens)

Add a trigger to a specific mapping in an Input Mapping Context.

Args:
    context_path: Path to the IMC asset
    mapping_index: Index of the mapping (from get_input_mapping_context)
    trigger_type: Trigger class name (e.g. "InputTriggerPressed")
    properties: Optional trigger properties

Input parameters:

- `context_path` (string, required)
- `mapping_index` (integer, required)
- `properties`
- `trigger_type` (string, required)

Output parameters:

- `result` (string)

### `add_mapping_modifier` (~103 tokens)

Add a modifier to a specific mapping in an Input Mapping Context.

Args:
    context_path: Path to the IMC asset
    mapping_index: Index of the mapping (from get_input_mapping_context)
    modifier_type: Modifier class name (e.g. "InputModifierNegate")
    properties: Optional modifier properties

Input parameters:

- `context_path` (string, required)
- `mapping_index` (integer, required)
- `modifier_type` (string, required)
- `properties`

Output parameters:

- `result` (string)

### `remove_mapping_trigger` (~79 tokens)

Remove a trigger from a mapping in an Input Mapping Context.

Args:
    context_path: Path to the IMC asset
    mapping_index: Index of the mapping
    trigger_index: Index of the trigger within that mapping

Input parameters:

- `context_path` (string, required)
- `mapping_index` (integer, required)
- `trigger_index` (integer, required)

Output parameters:

- `result` (string)

### `remove_mapping_modifier` (~79 tokens)

Remove a modifier from a mapping in an Input Mapping Context.

Args:
    context_path: Path to the IMC asset
    mapping_index: Index of the mapping
    modifier_index: Index of the modifier within that mapping

Input parameters:

- `context_path` (string, required)
- `mapping_index` (integer, required)
- `modifier_index` (integer, required)

Output parameters:

- `result` (string)

### `list_input_mapping_contexts` (~63 tokens)

List all UInputMappingContext assets, optionally filtered.

Returns name, path, mapping_count, description for each.

Input parameters:

- `filter` (string)
- `max_results` (integer)
- `path` (string)
- `recursive` (boolean)

Output parameters:

- `result` (string)

### `list_trigger_types` (~51 tokens)

List all available UInputTrigger subclasses with their editable properties.

Useful for discovering valid trigger_type values. Returns name, display_name,
parent class, and editable property names/types.

Input parameters:

- `filter` (string)

Output parameters:

- `result` (string)

### `list_modifier_types` (~51 tokens)

List all available UInputModifier subclasses with their editable properties.

Useful for discovering valid modifier_type values. Returns name, display_name,
parent class, and editable property names/types.

Input parameters:

- `filter` (string)

Output parameters:

- `result` (string)

### `list_input_keys` (~91 tokens)

List available FKey values (keyboard, mouse, gamepad keys).

Args:
    filter: Substring filter on key name or display name
    category: Filter by category — keyboard | mouse | gamepad | analog | digital
    max_results: Max keys to return (default 500)

Input parameters:

- `category` (string)
- `filter` (string)
- `max_results` (integer)

Output parameters:

- `result` (string)

### `performance_start_trace` (~196 tokens)

Start recording a performance trace from the running Unreal Editor.

Records CPU, GPU, frame timing, and other profiling data to a .utrace file.
Call performance_stop_trace when done to stop recording and auto-load for analysis.

Args:
    file_path: Where to save the .utrace file. Empty = auto-generate in Saved/Profiling/
    channels: Comma-separated trace channels or preset name.
        Presets: "default" (cpu,gpu,frame,log,bookmark,screenshot,region)
        Individual: cpu, gpu, frame, log, bookmark, screenshot, region, memtag, memalloc
        For network profiling add: net
        For asset loading add: loadtime
        For memory tracking add: memtag
        Example: "default,net,loadtime,memtag" for full profiling

Input parameters:

- `channels` (string)
- `file_path` (string)

Output parameters:

- `result` (string)

### `performance_stop_trace` (~70 tokens)

Stop the active trace recording and optionally load it for analysis.

After stopping, the trace is automatically loaded so you can immediately
query it with performance_analyze_insight.

Args:
    auto_load: If True (default), auto-load the recorded trace for analysis

Input parameters:

- `auto_load` (boolean)

Output parameters:

- `result` (string)

### `performance_analyze_insight` (~1691 tokens)

Query profiling data from a loaded .utrace trace.

RECOMMENDED WORKFLOW (compact output, saves context):
  1\. "diagnose"     — ONE CALL full report: verdict, findings, categories, top timers
  2\. "spikes"       — Auto worst frames + category breakdown
  3\. "flame"        — Top timers by exclusive (self) time — actual bottleneck code
  4\. "hotpath"      — Drill into a category or event's children
  5\. "search"       — Find a timer across all frames (stats + worst frames)
  6\. "histogram"    — Frame time distribution (periodic hitches vs sustained?)
  7\. "compare"      — Compare frame vs trace median, show outlier events

Use performance_start_trace/stop_trace to record and auto-load a trace,
or use query="load" to load an existing .utrace file.

Args:
    query: Type of analysis. One of:

        SMART QUERIES (compact output, do analysis in C++):
        - "diagnose"      — ONE CALL full performance report. Returns: verdict string,
                            severity-rated findings with recommendations, category
                            breakdown (avg per-frame exclusive ms), top 10 exclusive
                            timers, GPU-bound detection. Start here.
        - "bottlenecks"   — Auto-categorize frame into Animation/Slate/Network/etc
                            with total time per category and top event. VERY compact.
        - "hotpath"       — Drill into a category or event's children, sorted by time
        - "compare"       — Compare frame vs trace median, show outlier events only
        - "spikes"        — Auto worst frames + category breakdown (combines worst_frames
                            + bottlenecks). Shows top 3 categories per spike frame.
        - "search"        — Find a timer across ALL frames. Returns min/avg/max/p95/p99
                            stats + worst frames list. Use filter= for timer name.
        - "histogram"     — Frame time distribution. Shows bucket counts + budget
                            summary (on-budget / s…

Input parameters:

- `bucket_size_ms` (number)
- `category` (string)
- `connection_index` (integer)
- `count` (integer)
- `end_time` (number)
- `event_name` (string)
- `filter` (string)
- `frame_index` (integer)
- `include_values` (boolean)
- `max_depth` (integer)
- `max_samples` (integer)
- `min_deviation_pct` (number)
- `min_duration_ms` (number)
- `mode` (string)
- `query` (string, required)
- `start_time` (number)
- `target_fps` (number)
- `thread` (string)
- `thread_name` (string)
- `threshold_ms` (number)
- `timer_name` (string)
- `trace_path` (string)
- `tracker` (integer)
- `verbosity` (string)

Output parameters:

- `result` (string)

### `set_mcp_debug` (~101 tokens)

Enable or disable token debug estimation on MCP responses.

When enabled, every command response shows a token debug header:
    [TOKEN DEBUG] command_name — ~1,289 tokens (5,156 chars)

This appears at the top of every response so you can immediately
see which commands consume the most tokens.

Disabling clears accumulated stats.

Args:
    enabled: True to enable, False to disable and clear stats.

Input parameters:

- `enabled` (boolean)

Output parameters:

- `result` (string)

### `get_mcp_token_stats` (~62 tokens)

Get accumulated per-command token usage statistics.

Returns commands sorted by max_estimated_tokens (worst offenders first).
Each entry shows: call_count, avg/max/total estimated tokens, response chars.

Enable debug mode first with set_mcp_debug(enabled=True).

Output parameters:

- `result` (string)

### `create_niagara_system` (~79 tokens)

Create a new Niagara System asset.

Args:
    asset_path: Full content path including name (e.g. "/Game/FX/NS_Fire")
    template: Template to base the system on — "empty" or a path to an existing system/template

Input parameters:

- `asset_path` (string, required)
- `template` (string)

Output parameters:

- `result` (string)

### `get_niagara_system_info` (~124 tokens)

Get detailed information about a Niagara System.

Returns system name, emitter list, user parameters, and compilation status.
Use filter to narrow emitters and parameters by name substring.

Args:
    system_path: Path to the Niagara System asset
    include: Comma-separated sections — emitters, parameters, compilation, all
    filter: Optional name substring filter on emitters and parameters
        (e.g. "Spark", "Color", "Flame")

Input parameters:

- `filter`
- `include` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `list_niagara_systems` (~75 tokens)

List Niagara System assets in the project.

Args:
    path: Content Browser directory to search in
    name_filter: Optional substring filter on asset name
    max_results: Maximum number of results to return

Input parameters:

- `max_results` (integer)
- `name_filter`
- `path` (string)

Output parameters:

- `result` (string)

### `delete_niagara_system` (~58 tokens)

Delete a Niagara System asset.

Args:
    system_path: Path to the Niagara System asset
    force: If true, skip reference checks and force deletion

Input parameters:

- `force` (boolean)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `compile_niagara_system` (~63 tokens)

Compile a Niagara System and report any errors.

Args:
    system_path: Path to the Niagara System asset
    wait_for_completion: If true, block until compilation finishes

Input parameters:

- `system_path` (string, required)
- `wait_for_completion` (boolean)

Output parameters:

- `result` (string)

### `get_niagara_emitters` (~104 tokens)

Get emitters in a Niagara System.

Returns name, unique_name, index, enabled state, sim_target, local_space,
determinism, and renderer_count per emitter.
Use filter to get specific emitters by name substring.

Args:
    system_path: Path to the Niagara System asset
    filter: Optional name filter (e.g. "Spark", "Flame", "Trail")

Input parameters:

- `filter`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_emitter` (~124 tokens)

Add an emitter to a Niagara System.

Provide either emitter_path (existing emitter asset) or template (built-in template name).

Args:
    system_path: Path to the Niagara System asset
    emitter_path: Path to an existing NiagaraEmitter asset to add
    emitter_name: Optional display name for the emitter in this system
    template: Built-in template name (e.g. "Fountain", "Sprite", "Mesh")

Input parameters:

- `emitter_name`
- `emitter_path`
- `system_path` (string, required)
- `template`

Output parameters:

- `result` (string)

### `remove_niagara_emitter` (~62 tokens)

Remove an emitter from a Niagara System by name.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the emitter to remove

Input parameters:

- `emitter_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_emitter_property` (~106 tokens)

Set a property on an emitter within a Niagara System.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    property: Property name (e.g. "SimTarget", "FixedBounds", "LocalSpace")
    value: Property value as string

Input parameters:

- `emitter_name` (string, required)
- `property` (string, required)
- `system_path` (string, required)
- `value` (string, required)

Output parameters:

- `result` (string)

### `duplicate_niagara_emitter` (~77 tokens)

Duplicate an emitter within a Niagara System.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the emitter to duplicate
    new_name: Optional name for the duplicated emitter

Input parameters:

- `emitter_name` (string, required)
- `new_name`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `reorder_niagara_emitter` (~89 tokens)

Move an emitter to a new position in the system's emitter list.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the emitter to move
    new_index: Target index (0-based) in the emitter list

Input parameters:

- `emitter_name` (string, required)
- `new_index` (integer, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_modules` (~186 tokens)

Get modules in an emitter's script usage stack.

Returns name, display_name, index, script_usage, script_path, and optionally
input parameters per module. Use filter to get specific modules by function name.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    script_usage: Which stack — EmitterSpawn, EmitterUpdate, ParticleSpawn, ParticleUpdate,
        SystemSpawn, SystemUpdate, or "all" for every stack
    include_inputs: If true, include each module's input parameters
    filter: Optional function name filter (e.g. "Spawn", "Color", "Gravity", "Velocity")

Input parameters:

- `emitter_name` (string, required)
- `filter`
- `include_inputs` (boolean)
- `script_usage` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_module` (~154 tokens)

Add a module to an emitter's script usage stack.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_path: Path to the module script asset (e.g. "/Niagara/Modules/Update/SolveForcesAndVelocity")
    script_usage: Target stack — EmitterSpawn, EmitterUpdate, ParticleSpawn, ParticleUpdate,
        SystemSpawn, SystemUpdate
    index: Position in the stack (-1 = append at end)

Input parameters:

- `emitter_name` (string, required)
- `index` (integer)
- `module_path` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `remove_niagara_module` (~119 tokens)

Remove a module from an emitter's script usage stack.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module to remove
    script_usage: Stack the module is in — EmitterSpawn, EmitterUpdate, ParticleSpawn, ParticleUpdate,
        SystemSpawn, SystemUpdate

Input parameters:

- `emitter_name` (string, required)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_module_enabled` (~115 tokens)

Enable or disable a module in an emitter's stack.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module
    script_usage: Stack the module is in
    enabled: True to enable, false to disable

Input parameters:

- `emitter_name` (string, required)
- `enabled` (boolean, required)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `reorder_niagara_module` (~122 tokens)

Move a module to a new position within its script usage stack.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module to move
    script_usage: Stack the module is in
    new_index: Target index (0-based) within the stack

Input parameters:

- `emitter_name` (string, required)
- `module_name` (string, required)
- `new_index` (integer, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_module_inputs` (~136 tokens)

Get all input parameters for a specific module.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module
    script_usage: Stack the module is in
    input_filter: Optional substring filter on input parameter names
    include_schema: If true, include massive structural type schemas for inputs

Input parameters:

- `emitter_name` (string, required)
- `include_schema` (boolean)
- `input_filter`
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_module_input` (~151 tokens)

Set a static value on a module input parameter.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module
    input_name: Name of the input parameter to set
    value: Value as string — scalars, vectors "(X,Y,Z)", colors "(R,G,B,A)", enums, bools
    script_usage: Stack the module is in

Input parameters:

- `emitter_name` (string, required)
- `input_name` (string, required)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)
- `value` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_dynamic_input` (~431 tokens)

Set a dynamic input (random range, linked parameter, custom expression, or arbitrary script) on a module input.

Uses FNiagaraStackGraphUtilities::SetDynamicInputForFunctionInput for the script
path, which is the same code path the editor uses when picking a dynamic input
from the stack UI.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module
    input_name: Name of the input parameter
    script_usage: Stack the module is in
    dynamic_input_type: One of:
        - "random_range" / "uniform_random"   — Ranged random (min_value, max_value)
        - "parameter_link"                    — Link to an existing parameter (parameter_name)
        - "custom_expression"                 — Custom HLSL expression node (expression)
        - "script" / "asset"                  — Arbitrary dynamic input script (dynamic_input_script_path)
    min_value / max_value: Values for random_range types (float or vector JSON object)
    parameter_name: Parameter name for parameter_link type
    expression: HLSL expression for custom_expression type
    dynamic_input_script_path: Asset path of a DynamicInput-usage UNiagaraScript
        (for dynamic_input_type="script"). Discover candidates via search_niagara_functions.
    suggested_name: Optional friendly name for the dynamic input in the stack UI
    pin_defaults: Optional {pin_name: default_value_string} dict applied to the
        new dynamic input node's own input pins after wiring

Input parameters:

- `dynamic_input_script_path`
- `dynamic_input_type` (string, required)
- `emitter_name` (string, required)
- `expression`
- `input_name` (string, required)
- `max_value`
- `min_value`
- `module_name` (string, required)
- `parameter_name`
- `pin_defaults`
- `script_usage` (string, required)
- `suggested_name`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_curve` (~201 tokens)

Set a curve on a module input parameter.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module
    input_name: Name of the input parameter
    script_usage: Stack the module is in
    curve_type: Curve type — "FloatCurve", "ColorCurve", "VectorCurve"
    keys: JSON array of curve keys, e.g. [{"time":0,"value":1},{"time":1,"value":0}]
        For color curves: [{"time":0,"r":1,"g":0,"b":0,"a":1}]

Input parameters:

- `curve_type` (string, required)
- `emitter_name` (string, required)
- `input_name` (string, required)
- `keys` (string, required)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_user_parameters` (~128 tokens)

Get user-exposed parameters from a Niagara System asset or a level actor's component.

Returns name, type, and value_type per parameter.
Provide either system_path (asset) or actor_name (level instance).
Use filter to narrow by parameter name substring.

Args:
    system_path: Path to the Niagara System asset
    actor_name: Name of an actor in the level with a NiagaraComponent
    filter: Optional name filter (e.g. "Color", "Intensity", "Size")

Input parameters:

- `actor_name`
- `filter`
- `system_path`

Output parameters:

- `result` (string)

### `add_niagara_user_parameter` (~470 tokens)

Add a user parameter to a Niagara System. Supports every type the editor's
User Parameters "+" menu can add — primitives, structs, enums, and Data Interfaces.

Use list_niagara_parameter_types to discover valid type names before calling.

Args:
    system_path: Path to the Niagara System asset
    parameter_name: Name for the new parameter (auto-prefixed with "User.")
    parameter_type: Type name. Resolved via NiagaraTypeRegistry, so anything
        Niagara registered is valid. Examples:
          - Primitives: "float", "int", "bool", "Vector2", "Vector", "Vector4",
            "LinearColor", "Quat", "Position", "Matrix"
          - Niagara structs: "NiagaraID", "NiagaraRandInfo", "NiagaraSpawnInfo"
          - Enums: "ENiagaraExecutionState", any registered UEnum path
          - Data Interfaces (bare or prefixed):
            "ArrayFloat", "ArrayVector", "ArrayVector4", "ArrayInt32",
            "Curve", "Vector2DCurve", "VectorCurve", "Vector4Curve",
            "CurlNoise", "Grid2D", "Grid3D", "SkeletalMesh", "StaticMesh",
            "Texture", "TextureCube", "VolumeTexture", "Texture2DArray",
            "RenderTarget2D", "SplineComponent", "Camera", "Collision",
            "PhysicsAsset", "Spline", and any other NiagaraDataInterface subclass
            including plugin-provided ones.
    default_value: Optional default. For scalars pass as string or number;
        for vector/color/struct pass UE-standard text form like "(X=1,Y=2,Z=3)"
        or "(R=1,G=0.5,B=0,A=1)". Data interfaces use the CDO defaults — use
        set_niagara_user_parameter afterwards for richer initialization.

Returns the created parameter with its resolved type name, kind
(primitive / struct / enum / data_interface / object), size_bytes, and
(for DIs) class_path.

Input parameters:

- `default_value`
- `parameter_name` (string, required)
- `parameter_type` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_user_parameter` (~138 tokens)

Set a user parameter value on a Niagara System asset or level actor instance.

Provide either system_path (asset default) or actor_name (runtime override).

Args:
    parameter_name: Name of the user parameter
    parameter_type: Type of the parameter (must match existing type)
    value: Value as string
    actor_name: Name of an actor in the level for runtime override
    system_path: Path to the system asset for default value

Input parameters:

- `actor_name`
- `parameter_name` (string, required)
- `parameter_type` (string, required)
- `system_path`
- `value` (string, required)

Output parameters:

- `result` (string)

### `remove_niagara_user_parameter` (~61 tokens)

Remove a user parameter from a Niagara System.

Args:
    system_path: Path to the Niagara System asset
    parameter_name: Name of the parameter to remove

Input parameters:

- `parameter_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `link_niagara_parameter` (~162 tokens)

Link a module input to a Niagara parameter (user, system, emitter, or particle scope).

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Name of the module
    input_name: Name of the input to link
    script_usage: Stack the module is in
    linked_parameter: Full parameter name including namespace
        (e.g. "User.MyParam", "Emitter.Age", "Particles.Velocity")

Input parameters:

- `emitter_name` (string, required)
- `input_name` (string, required)
- `linked_parameter` (string, required)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_renderer` (~129 tokens)

Add a renderer to an emitter.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    renderer_type: Renderer class — SpriteRenderer, MeshRenderer, RibbonRenderer,
        LightRenderer, ComponentRenderer
    material_path: Optional material asset path for sprite/mesh/ribbon renderers
    mesh_path: Optional static mesh path for MeshRenderer

Input parameters:

- `emitter_name` (string, required)
- `material_path`
- `mesh_path`
- `renderer_type` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `remove_niagara_renderer` (~86 tokens)

Remove a renderer from an emitter by index.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    renderer_index: Index of the renderer to remove (from get_niagara_emitters)

Input parameters:

- `emitter_name` (string, required)
- `renderer_index` (integer, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_renderer_info` (~86 tokens)

Get detailed information about a renderer on an emitter.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    renderer_index: Index of the renderer (default 0, the first renderer)

Input parameters:

- `emitter_name` (string, required)
- `renderer_index` (integer)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_renderer_property` (~126 tokens)

Set a property on an emitter's renderer.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    property: Property name (e.g. "Material", "Alignment", "FacingMode", "SortOrder")
    value: Property value as string
    renderer_index: Index of the renderer (default 0)

Input parameters:

- `emitter_name` (string, required)
- `property` (string, required)
- `renderer_index` (integer)
- `system_path` (string, required)
- `value` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_renderer_binding` (~166 tokens)

Set an attribute binding on an emitter's renderer.

Binds a renderer input (e.g. color, size) to a particle/emitter attribute.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    binding_name: Binding slot name (e.g. "ColorBinding", "DynamicMaterialBinding",
        "PositionBinding", "SpriteRotationBinding")
    attribute: Attribute to bind to (e.g. "Particles.Color", "Particles.Scale")
    renderer_index: Index of the renderer (default 0)

Input parameters:

- `attribute` (string, required)
- `binding_name` (string, required)
- `emitter_name` (string, required)
- `renderer_index` (integer)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_event_handler` (~201 tokens)

Add an event handler to an emitter that responds to events from a source emitter.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the receiving emitter
    source_emitter: Name of the emitter producing the event
    event_name: Event name (e.g. "CollisionEvent", "DeathEvent", "LocationEvent")
    execution_mode: How events are handled — "every_particle", "spawn_particles",
        "single_particle"
    spawn_number: Number of particles to spawn per event (for spawn_particles mode)
    max_events_per_frame: Limit on events processed per frame (0 = unlimited)

Input parameters:

- `emitter_name` (string, required)
- `event_name` (string, required)
- `execution_mode` (string)
- `max_events_per_frame` (integer)
- `source_emitter` (string, required)
- `spawn_number` (integer)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_simulation_stage` (~139 tokens)

Add a simulation stage to an emitter.

Simulation stages allow additional processing passes over particles or data interfaces.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    stage_name: Display name for the simulation stage
    iteration_source: What to iterate over — "particles" or a data interface name
    num_iterations: Number of times to execute this stage per frame

Input parameters:

- `emitter_name` (string, required)
- `iteration_source` (string)
- `num_iterations` (integer)
- `stage_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_event_handlers` (~60 tokens)

Get all event handlers configured on an emitter.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter

Input parameters:

- `emitter_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `spawn_niagara_effect` (~145 tokens)

Spawn a Niagara System as an actor in the level.

Args:
    system_path: Path to the Niagara System asset
    location: World location as "(X,Y,Z)" — defaults to origin
    rotation: Rotation as "(Pitch,Yaw,Roll)" — defaults to zero
    scale: Scale as "(X,Y,Z)" — defaults to (1,1,1)
    name: Optional actor label name
    auto_activate: If true, the system begins playing immediately

Input parameters:

- `auto_activate` (boolean)
- `location`
- `name`
- `rotation`
- `scale`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `control_niagara_effect` (~68 tokens)

Control a Niagara effect actor in the level.

Args:
    actor_name: Name/label of the Niagara actor
    action: Control action — "activate", "deactivate", "reset", "destroy"

Input parameters:

- `action` (string, required)
- `actor_name` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_component` (~122 tokens)

Add a NiagaraComponent to an existing actor in the level.

Args:
    actor_name: Name/label of the target actor
    system_path: Path to the Niagara System asset to assign
    component_name: Optional name for the component
    relative_location: Relative offset as "(X,Y,Z)"
    auto_activate: If true, auto-activate on begin play

Input parameters:

- `actor_name` (string, required)
- `auto_activate` (boolean)
- `component_name`
- `relative_location`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_actors` (~43 tokens)

Get all Niagara actors in the current level.

Args:
    system_filter: Optional filter on the Niagara System name or path

Input parameters:

- `system_filter`

Output parameters:

- `result` (string)

### `list_niagara_modules` (~101 tokens)

List available Niagara module scripts for use with add_niagara_module.

Args:
    category: Filter by category — "all", "spawn", "update", "forces", "rendering",
        "collision", "audio", "events"
    search: Optional substring search on module name
    max_results: Maximum number of results to return

Input parameters:

- `category` (string)
- `max_results` (integer)
- `search`

Output parameters:

- `result` (string)

### `list_niagara_emitter_templates` (~62 tokens)

List available emitter templates for use with add_niagara_emitter.

Args:
    category: Filter by category — "all", "sprite", "mesh", "ribbon", "light", "audio"

Input parameters:

- `category` (string)

Output parameters:

- `result` (string)

### `list_niagara_data_interfaces` (~49 tokens)

List available Niagara Data Interfaces (Grid2D, Grid3D, AudioSpectrum, etc.).

Args:
    filter: Optional substring filter on data interface name

Input parameters:

- `filter`

Output parameters:

- `result` (string)

### `list_niagara_parameter_types` (~263 tokens)

Live query of FNiagaraTypeRegistry — every type the editor's User Parameters
"+" menu can add, including plugin-registered Data Interfaces.

Args:
    scope: Which registry slice to query. "user" (default) = types addable as
        User.* parameters. Other scopes: "system", "emitter", "particle",
        "parameter", "payload", "numeric", "index", "all".
    kind: Filter by classification — "primitive", "struct", "enum",
        "data_interface", "object", or "all" (default).
    filter: Case-insensitive substring match on type name. For data interfaces
        also matches against the short name (without the "NiagaraDataInterface" prefix),
        so filter="ArrayFloat" finds NiagaraDataInterfaceArrayFloat.
    max_results: Cap on returned entries (default 500).

Returns entries with name, kind, size_bytes, plus:
    - data_interface: class_path, short_name, category, description
    - enum: enum_path, num_entries
    - struct: struct_path, description

Input parameters:

- `filter`
- `kind` (string)
- `max_results` (integer)
- `scope` (string)

Output parameters:

- `result` (string)

### `get_niagara_emitter_attributes` (~157 tokens)

Get attributes defined on an emitter at a given scope.

Returns name, type, scope, and source per attribute. Includes both rapid iteration
parameters and well-known particle attributes (Position, Velocity, Color, etc.).
Use filter to narrow by attribute name substring.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    scope: Attribute scope — "particle", "emitter", "system", "all"
    filter: Optional name filter (e.g. "Color", "Position", "Velocity", "Size")

Input parameters:

- `emitter_name` (string, required)
- `filter`
- `scope` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_rapid_iteration_parameters` (~157 tokens)

Get rapid iteration parameters (the actual configurable values on modules).

These are the real module inputs — spawn rate, gravity, colors, sizes, etc.
Returns parameter names, types, current values, and which module they belong to.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    script_usage: Stack filter — emitter_spawn, emitter_update, particle_spawn, particle_update, or all
    filter: Optional substring filter on parameter name (e.g. "Color", "SpawnRate", "Gravity")

Input parameters:

- `emitter_name` (string, required)
- `filter`
- `script_usage` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_rapid_iteration_parameter` (~317 tokens)

Set a rapid iteration parameter value on a module.

This is the primary way to change module input values like spawn rate, colors,
forces, sizes, lifetimes, etc. Use get_niagara_rapid_iteration_parameters first
to discover available parameters and their types.

Value format depends on type:
  float: 5.0
  int: 10
  bool: true/false
  vector: {"x": 1, "y": 2, "z": 3} or [1, 2, 3]
  color: {"r": 1, "g": 0.5, "b": 0, "a": 1} or [1, 0.5, 0, 1]

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    module_name: Module name (e.g. "SpawnRate", "InitializeParticle", "GravityForce")
    input_name: Input parameter name (e.g. "SpawnRate", "Color", "Gravity")
    value: Value to set (type must match the parameter's type)
    script_usage: Stack the module is in — emitter_update, particle_spawn, particle_update, etc.

Input parameters:

- `emitter_name` (string, required)
- `input_name` (string, required)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)
- `value` (required)

Output parameters:

- `result` (string)

### `get_niagara_renderer_properties` (~157 tokens)

Get editable properties of a renderer with current values and valid enum values.

Token-efficient: use filter to get only specific properties instead of all.
Property names can be used directly with set_niagara_renderer_property.

Common filters: "Facing", "Material", "Sort", "Shadow", "Width", "Shape", "UV"

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    renderer_index: Renderer index (default 0)
    filter: Substring filter on property name — strongly recommended to save tokens

Input parameters:

- `emitter_name` (string, required)
- `filter`
- `renderer_index` (integer)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_system_property` (~161 tokens)

Set a system-level property on a Niagara System via reflection.

Supports any UPROPERTY on UNiagaraSystem: WarmupTime, WarmupTickDelta,
bDeterminism, RandomSeed, bFixedBounds, FixedBounds, bFixedTickDelta,
FixedTickDeltaTime, etc. Use exact C++ property name (PascalCase).

Args:
    system_path: Path to the Niagara System asset
    property: Property name (e.g. "WarmupTime", "bDeterminism", "RandomSeed")
    value: Value as string (e.g. "2.0", "true", "42")

Input parameters:

- `property` (string, required)
- `system_path` (string, required)
- `value` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_system_errors` (~125 tokens)

Get compilation errors, warnings, and validation issues for a Niagara System.

Returns issues found during compilation and validation. Use to diagnose why
a system isn't working, find outdated modules, or check for configuration problems.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Optional — filter to issues from a specific emitter
    severity: Filter by severity — "error", "warning", "info", or "all" (default)

Input parameters:

- `emitter_name`
- `severity` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_particle_stats` (~107 tokens)

Get live particle counts and emitter execution state from running preview.

Shows how many particles are alive per emitter, total spawned count,
execution state (Active/Inactive/Complete), and bounds info.
Requires the system to be previewing in the Niagara editor or spawned in level.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Optional — filter to a specific emitter's stats

Input parameters:

- `emitter_name`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `set_niagara_playback_range` (~156 tokens)

Set the timeline playback range in the Niagara editor.

Controls how long the preview plays. If your effect dies at 0.02s, extend
the range. For looping effects set a longer range (e.g. 5-10 seconds).

Args:
    system_path: Path to the Niagara System asset
    range_end: End time in seconds (e.g. 5.0 for 5 second preview)
    range_start: Start time in seconds (default 0.0)
    frame_rate: Optional frame rate override (default 60)

Input parameters:

- `frame_rate`
- `range_end` (number, required)
- `range_start` (number)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_playback_range` (~80 tokens)

Get the current timeline playback range and frame rate settings.

Returns the start/end time in seconds and the frame rate configuration.
Use to check if the playback range is too short (common cause of effects
appearing to not play).

Args:
    system_path: Path to the Niagara System asset

Input parameters:

- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_module_versions` (~117 tokens)

Check for outdated modules in an emitter and their available versions.

Identifies modules that have newer versions available — a common source of
Niagara warnings and compatibility issues. Use to find modules that need upgrading.

Args:
    system_path: Path to the Niagara System asset
    emitter_name: Name of the target emitter
    filter: Optional module name filter (e.g. "Spawn", "Color", "Force")

Input parameters:

- `emitter_name` (string, required)
- `filter`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `create_niagara_scratch_pad_module` (~172 tokens)

Create a new scratch pad script on a Niagara System.

Duplicates the editor's default template (DefaultModuleScript /
DefaultDynamicInputScript / DefaultFunctionScript from NiagaraEditorSettings) so
the resulting graph is pre-wired with Input / MapGet / MapSet / Output just like
clicking "Create New Module" in the Scratch Script Manager. Falls back to a
manually-built minimal graph if the template asset is unavailable.

Args:
    system_path: Niagara System asset path
    module_name: Desired scratch script name (unique within the system's ScratchPadScripts)
    module_type: "module" (default), "dynamic_input", or "function"

Input parameters:

- `module_name` (string)
- `module_type` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `duplicate_niagara_scratch_pad_module` (~83 tokens)

Duplicate an existing scratch pad module on a system.

Args:
    system_path: Niagara System asset path
    module_name: Source scratch pad module name
    new_name: Optional new name (defaults to "<source>_Copy")

Input parameters:

- `module_name` (string, required)
- `new_name`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `delete_niagara_scratch_pad_module` (~40 tokens)

Delete a scratch pad module from a Niagara System.

Input parameters:

- `module_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `rename_niagara_scratch_pad_module` (~48 tokens)

Rename a scratch pad module on a Niagara System.

Input parameters:

- `module_name` (string, required)
- `new_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_graph_nodes` (~247 tokens)

Introspect every node inside a Niagara graph.

Three resolver modes:
  1\. system_path + module_name        — scratch pad module graph
  2\. system_path + emitter_name + script_usage — EMITTER STACK GRAPH
     (emitter_spawn|emitter_update|particle_spawn|particle_update),
     where stack modules appear as NiagaraNodeFunctionCall nodes
  3\. script_path                      — standalone UNiagaraScript asset

Args:
    system_path: Niagara System asset path
    module_name: Scratch pad module name (mode 1)
    emitter_name + script_usage: Emitter stack graph (mode 2)
    script_path: Standalone script asset (mode 3)
    verbosity: "summary" | "connections" (default) | "full"
    type_filter: Case-insensitive substring on short class name
    name_filter: Case-insensitive substring on node title

Input parameters:

- `emitter_name`
- `module_name`
- `name_filter`
- `script_path`
- `script_usage`
- `system_path`
- `type_filter`
- `verbosity` (string)

Output parameters:

- `result` (string)

### `get_niagara_node_info` (~157 tokens)

Deep inspect a single Niagara node: full pin layout, connections, type-specific detail.

Provide exactly one of node_index / node_class / node_id.

Args:
    system_path + module_name: Resolve scratch pad module (one option)
    script_path: Resolve standalone script asset (alternative)
    node_index: Ordinal index into Graph->Nodes (stable per session)
    node_class: Short ("MapGet") or full ("NiagaraNodeParameterMapGet")
    node_id: FGuid string matching UEdGraphNode::NodeGuid

Input parameters:

- `module_name`
- `node_class`
- `node_id`
- `node_index`
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `trace_niagara_connection` (~217 tokens)

Breadth-first trace of connections from a starting node through the graph.

Answers "what feeds this node?" (upstream) and "where does this node's
output go?" (downstream). Each visited node reports its depth, so the
dependency chain is visible without dumping the whole graph.

Args:
    system_path + module_name OR script_path: Graph resolver
    node_index / node_class / node_id: Starting node identifier
    direction: "upstream" | "downstream" | "both" (default)
    max_depth: Max BFS depth (default 8)
    pin_name: Optional starting-pin filter — only walk links on pins whose
              name contains this substring (e.g. "Vector Array")

Input parameters:

- `direction` (string)
- `max_depth` (integer)
- `module_name`
- `node_class`
- `node_id`
- `node_index`
- `pin_name`
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `validate_niagara_graph` (~101 tokens)

Classify orphaned, dead-end, and missing-input nodes in a Niagara graph.

Returns three arrays:
  orphaned       — nodes with no incoming or outgoing links (excl. anchors)
  dead_ends      — non-anchor nodes with inputs connected but no outputs consumed
  missing_inputs — nodes whose input pins have no link and no default value

Input parameters:

- `module_name`
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `list_niagara_scratch_pad_modules` (~52 tokens)

List all scratch pad modules on a Niagara System.

Returns name, path, usage, node counts, and custom HLSL node count per script.

Input parameters:

- `system_path` (string, required)

Output parameters:

- `result` (string)

### `apply_niagara_scratch_pad` (~77 tokens)

Commit a scratch pad module's edit-copy to the original script (Apply button).

Mirrors FNiagaraScratchPadScriptViewModel::ApplyChanges. Requires the
Niagara System to be open in the editor so the view model exists.

Input parameters:

- `module_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `apply_and_save_niagara_scratch_pad` (~65 tokens)

Apply a scratch pad module's edit-copy AND save the asset (Apply & Save button).

Mirrors FNiagaraScratchPadScriptViewModel::ApplyChangesAndSave.

Input parameters:

- `module_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_script_properties` (~119 tokens)

Read the details-panel properties of a Niagara script.

Returns Category, Description, Keywords, ModuleUsageBitmask,
ProvidedDependencies, RequiredDependencies, LibraryVisibility,
bDeprecated, DeprecationMessage, bExperimental, ExperimentalMessage,
NumericOutputTypeSelectionMode, ScriptMetaData, ConversionUtility.

All properties live on FVersionedNiagaraScriptData; output shape matches
NiagaraIntrospection::SerializeProperty (kind + value + schema fields).

Input parameters:

- `module_name`
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `set_niagara_script_properties` (~180 tokens)

Batch-set details-panel properties on a Niagara script.

Args:
    properties: Dict of property name -> value. Supported:
        Category (str), Description (str), Keywords (str),
        ModuleUsageBitmask (int), ProvidedDependencies (list[str]),
        RequiredDependencies (list[dict]), LibraryVisibility (str enum),
        bDeprecated (bool), DeprecationMessage (str),
        bExperimental (bool), ExperimentalMessage (str).
    system_path + module_name: Resolve scratch pad module
    script_path: OR resolve standalone script asset

ModuleUsageBitmask combines ENiagaraScriptUsage values; e.g. particle
spawn + update = (1<<3) | (1<<4).

Input parameters:

- `module_name`
- `properties` (object, required)
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `list_niagara_script_parameters` (~113 tokens)

List input + output parameters of a Niagara script.

Outputs come from UNiagaraNodeOutput::Outputs (the Output Dynamic Input
node for dynamic inputs, or Output Module for modules).
Inputs come from graph script variable metadata filtered to
Module.* / Input.* / User.* namespaces.

Useful for discovering what an "Add Parameter" dropdown would show or
for diff-auditing a graph before/after mutation.

Input parameters:

- `module_name`
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `add_niagara_script_parameter` (~191 tokens)

Add an input or output parameter to a Niagara script.

For a dynamic input, "output" adds a new entry to the Output Dynamic
Input node (screenshot 5's "Add Parameter" dropdown). Type must be a
name registered in FNiagaraTypeRegistry — use list_niagara_parameter_types
to discover valid options (e.g. "float", "Vector", "LinearColor", "Quat",
"Position", "NiagaraID", "Matrix").

Args:
    name: Parameter name (input names without namespace prefix become Module.<name>)
    type: Niagara type name
    direction: "output" (default — appends to output node) | "input"

Input parameters:

- `direction` (string)
- `module_name`
- `name` (string, required)
- `script_path`
- `system_path`
- `type` (string, required)

Output parameters:

- `result` (string)

### `remove_niagara_script_parameter` (~56 tokens)

Remove a named input or output parameter from a Niagara script.

Input parameters:

- `direction` (string)
- `module_name`
- `name` (string, required)
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `rename_niagara_script_parameter` (~67 tokens)

Rename a script parameter in-place across both asset and edit-copy graphs.

Input parameters:

- `direction` (string)
- `module_name`
- `new_name` (string, required)
- `old_name` (string, required)
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `add_niagara_graph_node` (~345 tokens)

Create a new node inside a Niagara scratch-pad / dynamic-input / module graph.

Mirrors the node-creation pattern used by the Niagara editor schema actions
(FGraphNodeCreator + AllocateDefaultPins + NotifyGraphChanged). Spawns on
both asset and edit-copy graphs when a system is open.

Args:
    node_type: One of "Op", "FunctionCall", "DataInterfaceFunction",
               "ParameterMapGet", "ParameterMapSet", "Reroute", "Input"
    pos_x, pos_y: Graph position
    op_name: (node_type=Op) — discover via get_niagara_schema_actions
             (e.g. "Numeric::Add", "Numeric::Mul", "Numeric::Length")
    function_script: (node_type=FunctionCall) UNiagaraScript asset path
    input_name + input_type: (node_type=Input) variable name + Niagara type
    di_class + function_name: (node_type=DataInterfaceFunction) — wraps a
             data-interface member function. Discover via
             list_niagara_data_interface_functions. Examples:
             di_class="NiagaraDataInterfaceArrayPosition", function_name="Length"

Use list_niagara_script_parameters after to verify the pin layout.

Input parameters:

- `di_class`
- `function_name`
- `function_script`
- `input_name`
- `input_type`
- `module_name`
- `node_type` (string, required)
- `op_name`
- `pos_x` (integer)
- `pos_y` (integer)
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `list_niagara_data_interface_functions` (~257 tokens)

Enumerate member functions on a Niagara data interface class.

These are the functions you see in the right-click "Functions" submenu
on a DI pin in the editor — built-in DI members like Array.Length,
Array.Get, Array.Add, etc. They aren't UNiagaraScript assets so they
don't show up in search_niagara_functions. Pass the result as
function_name to add_niagara_graph_node(node_type="DataInterfaceFunction").

Each entry reports:
  \- name: pass to function_name param
  \- inputs / outputs: pin schema with names + Niagara types
  \- supports_cpu / supports_gpu / read_function / write_function
  \- description (when DI provides it)

Authoritative source: UNiagaraDataInterface::GetFunctionSignatures
(NIAGARA_API exported, NiagaraDataInterface.h:681).

Args:
    di_class: Short ("NiagaraDataInterfaceArrayPosition") or full path
    filter: Optional substring on function name (e.g. "Length", "Get")
    include_pins: Default True — include input/output pin schema

Input parameters:

- `di_class` (string, required)
- `filter`
- `include_pins` (boolean)

Output parameters:

- `result` (string)

### `delete_niagara_graph_node` (~77 tokens)

Delete a node from a Niagara graph (asset + edit-copy).

Provide node_index (ordinal) OR node_id (FGuid string from
get_niagara_graph_nodes).

Input parameters:

- `module_name`
- `node_id`
- `node_index`
- `script_path`
- `system_path`

Output parameters:

- `result` (string)

### `list_niagara_ops` (~302 tokens)

Enumerate all valid UNiagaraNodeOp operations from FNiagaraOpInfo registry.

This is the authoritative source the editor's context menu reads from —
use it BEFORE calling add_niagara_graph_node with node_type="Op" so you
pass a real op_name (e.g. "Numeric::Mul" vs the invalid "Numeric::Multiply").

Each entry reports: name (for op_name param), friendly_name, category,
description, keywords, alternate_name, compact_name, supports_added_inputs,
and — when include_pins=True — full input/output pin schema with types
and defaults.

Args:
    filter: Case-insensitive substring, matches name / friendly_name /
            category / description / keywords / alternate name. E.g.
            "multiply" finds "Numeric::Mul" via its friendly name.
    category: Exact category match (e.g. "Math", "Comparison", "Boolean",
              "Vector", "Quaternion"). Use the all_categories field in a
              first response to discover valid values.
    exact_name: Return the single op whose internal Name equals this
                string (bypasses other filters).
    include_pins: Include inputs/outputs per op (default True).
    max_results: Cap on returned entries (default 500).

Input parameters:

- `category`
- `exact_name`
- `filter`
- `include_pins` (boolean)
- `max_results` (integer)

Output parameters:

- `result` (string)

### `get_niagara_module_input_binding` (~315 tokens)

Resolve the actual binding of each module input — Default/Local/Linked/Dynamic/Data.

This answers "what is Spawn Count actually driven by?" — something
get_niagara_module_inputs + get_niagara_rapid_iteration_parameters can't
do on their own. Returns per-input:
  \- mode: default | local | linked | dynamic | data | function_call | expression | unknown
  \- value: literal string when mode=local
  \- linked_parameter: full parameter name when mode=linked/data
  \- script_path + function_name: when mode=dynamic/function_call
  \- children: recursive — for dynamic inputs, lists their own bound inputs

Uses FNiagaraStackGraphUtilities::GetStackFunctionInputs (exported) and
replicates GetStackFunctionInputOverridePin manually (non-exported).

Args:
    system_path: Niagara System asset
    emitter_name: Emitter in the system
    module_name: Module display name (e.g. "SpawnPerFrame")
    script_usage: emitter_spawn|emitter_update|particle_spawn|particle_update|
                  system_spawn|system_update
    input_filter: Case-insensitive substring on input name
    max_depth: Recursive descent cap for dynamic-input children (default 3)

Input parameters:

- `emitter_name` (string, required)
- `input_filter`
- `max_depth` (integer)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `clear_niagara_module_input` (~190 tokens)

Reset a module input to its default — equivalent to "Reset to Default" in the stack UI.

Finds the override pin, breaks its connections, removes any orphan
nodes that were exclusively feeding it (dynamic input node, map get,
custom HLSL, etc.), then removes the override pin itself from the
ParameterMapSet so the input reverts cleanly.

Supports nested path syntax: input_name="Spawn Count.Position Array"
clears the Position Array binding INSIDE the dynamic input attached
to Spawn Count — without touching Spawn Count's own binding.

Mirrors FNiagaraStackGraphUtilities::RemoveNodesForStackFunctionInputOverridePin
(non-exported — replicated here).

Input parameters:

- `emitter_name` (string, required)
- `input_name` (string, required)
- `module_name` (string, required)
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `list_niagara_input_source_menu` (~250 tokens)

Reproduce the stack-UI source dropdown for a specific input.

Returns the exact options the editor offers when you click the dropdown
on a stack input (screenshot reference: "Change Source" menu with
Dynamic Inputs / Link Inputs / Make sections). Output:
  \- input_type: the Niagara type of the target input (so you can filter)
  \- dynamic_inputs: every UNiagaraScript with Usage=DynamicInput,
                    with script_path ready to pass to set_niagara_dynamic_input
  \- link_parameters: well-known engine/particle parameters + this system's
                     user parameters, grouped by namespace

Discovery is via:
  \- FNiagaraEditorUtilities::GetFilteredScriptAssets (exported) for dynamic inputs
  \- FNiagaraConstants::GetEngineConstants / GetCommonParticleAttributes for
    engine-side parameters
  \- UNiagaraSystem::GetExposedParameters for the system's own user params

Input parameters:

- `emitter_name` (string, required)
- `input_name` (string, required)
- `module_name` (string, required)
- `name_filter`
- `script_usage` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `find_niagara_scratch_pad_usage` (~132 tokens)

Reverse lookup: find where a scratch pad script is referenced in the stack.

Scans every emitter/system script graph (system_spawn, system_update,
emitter_spawn, emitter_update, particle_spawn, particle_update) for
UNiagaraNodeFunctionCall nodes whose FunctionScript matches the named
scratch pad. Returns each site as {emitter, script_usage, function_name,
node_id, is_dynamic_input}.

Use this to answer "what uses GetDataInterfaceLength?" without walking
every emitter manually.

Input parameters:

- `module_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `resolve_niagara_built_in_dynamic_input` (~156 tokens)

Discover built-in dynamic-input script asset paths via AssetRegistry.

Replaces guessed paths like "/Niagara/Modules/DynamicInputs/UniformRangedFloat"
(which vary across UE versions) with a live scan. Returns all UNiagaraScript
assets with Usage=DynamicInput matching the filter.

Args:
    name_filter: Case-insensitive substring on asset name (e.g. "Random",
                 "UniformRanged", "Mask", "MultiplyVector")
    exact_name: If set, return only the asset whose name equals this
    max_results: Cap on returned entries (default 20)

Input parameters:

- `exact_name`
- `max_results` (integer)
- `name_filter`

Output parameters:

- `result` (string)

### `create_niagara_module_asset` (~120 tokens)

Create a standalone Niagara script asset (module / dynamic input / function).

Duplicates the editor's default template when available so the produced asset
has the same initial graph as one created via the Niagara asset wizard.

Args:
    asset_path: Full content path including name (e.g. "/Game/FX/Modules/MyModule")
    module_type: "module", "dynamic_input", or "function"
    description: Optional description text

Input parameters:

- `asset_path` (string, required)
- `description`
- `module_type` (string)

Output parameters:

- `result` (string)

### `set_niagara_scratch_pad_hlsl` (~280 tokens)

Set HLSL source on a scratch pad module's Custom HLSL node, creating pins as needed.

Pin creation uses exported schema APIs (UEdGraphSchema_Niagara::TypeDefinitionToPinType)
plus reflection on the CustomHlsl UPROPERTY (SetCustomHlsl is not NIAGARAEDITOR_API
exported). After changes the node's FNiagaraFunctionSignature is rebuilt from the
pin list, mirroring UNiagaraNodeCustomHlsl::RebuildSignatureFromPins exactly.

Args:
    system_path: Niagara System asset path
    module_name: Scratch pad module name containing the Custom HLSL node
    hlsl_code: Raw HLSL source. Reference pins by name (e.g. Result = Value * Scale;)
    inputs: Optional list of {"name": str, "type": str} — input pins to create
    outputs: Optional list of {"name": str, "type": str} — output pins to create
    clear_existing_pins: If true, remove all current non-Add pins before adding new ones

Input parameters:

- `clear_existing_pins` (boolean)
- `hlsl_code` (string, required)
- `inputs`
- `module_name` (string, required)
- `outputs`
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_custom_hlsl_input` (~108 tokens)

Add a typed input pin to a scratch pad module's Custom HLSL node.

Types: float, int, bool, vec2/3/4, color, quat, matrix, position, ParameterMap,
or any registered Niagara type. The pin's name is usable inside the HLSL source.

Input parameters:

- `module_name` (string, required)
- `pin_name` (string, required)
- `pin_type` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_custom_hlsl_output` (~63 tokens)

Add a typed output pin to a scratch pad module's Custom HLSL node.

Input parameters:

- `module_name` (string, required)
- `pin_name` (string, required)
- `pin_type` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `rename_niagara_custom_hlsl_pin` (~95 tokens)

Rename a Custom HLSL pin and update references inside the HLSL source.

Braced references ("{OldName}") inside the HLSL code are rewritten to "{NewName}"
via a whole-word replacement after the pin is renamed.

Input parameters:

- `module_name` (string, required)
- `new_name` (string, required)
- `old_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `remove_niagara_custom_hlsl_pin` (~53 tokens)

Remove a pin from a Custom HLSL node and rebuild its signature.

Input parameters:

- `module_name` (string, required)
- `pin_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `list_niagara_node_types` (~257 tokens)

Enumerate every Niagara node type that can be added to a graph.

Combines three sources, mirroring what the right-click menu shows in the editor:
  \* Node classes (UNiagaraNode subclasses) — Map Get, Map Set, Custom HLSL, If, etc.
  \* Script assets — module / dynamic_input / function scripts from the Asset Registry
  \* Data Interface classes (UNiagaraDataInterface subclasses)

Filter-first to keep output compact. Each entry includes kind, display_name,
category, tooltip/keywords, and a class_path or script_path for use with
add_niagara_module / add_niagara_node_pin.

Args:
    filter: Case-insensitive substring applied to name/display/category/keywords/tooltip
    kind: "all" (default), "node_class", "module_script", "dynamic_input_script",
          "function_script", "data_interface"
    include_engine: When false, script asset scan is restricted to /Game and /Niagara
    max_results: Cap on total entries returned (default 500)

Input parameters:

- `filter`
- `include_engine` (boolean)
- `kind` (string)
- `max_results` (integer)

Output parameters:

- `result` (string)

### `get_niagara_node_type_info` (~161 tokens)

Get pin/property schema for a Niagara node type or script asset.

For a node class (e.g. "CustomHlsl", "ParameterMapGet"), returns the editable
UPROPERTY list via reflection. For CustomHlsl specifically, returns the full
HLSL schema (like Material's get_expression_type_info does for the Custom node)
with an example payload.

For a script_path, loads the asset and returns its input/output parameters.

Args:
    type: Node short name (e.g. "CustomHlsl", "ParameterMapGet") or full class name
    script_path: Optional script asset path — when set, returns script input/output info instead

Input parameters:

- `script_path`
- `type` (string, required)

Output parameters:

- `result` (string)

### `search_niagara_functions` (~133 tokens)

Search Niagara script assets by usage + name filter.

Dedicated shortcut for finding module / dynamic_input / function script assets
so you can pass the result directly to add_niagara_module or set_niagara_dynamic_input.

Args:
    filter: Optional name/path substring
    usage: "module", "dynamic_input", or "function" (default)
    include_engine: When false, restricts scan to /Game
    max_results: Cap on returned entries

Input parameters:

- `filter`
- `include_engine` (boolean)
- `max_results` (integer)
- `usage` (string)

Output parameters:

- `result` (string)

### `describe_niagara_type` (~206 tokens)

Return the full schema of any Niagara type — primitive, enum, struct, or data interface.

Built on a generic FProperty introspector, so the output handles every
Unreal property kind recursively (bool / int{8,16,32,64} / uint{16,32,64} /
float / double / string / name / text / enum / struct / array / map / set /
object / class / soft_object / soft_class / interface / delegate). For
enums, returns every entry with name + display_name + value + tooltip. For
structs, walks every editable field. For data interfaces, returns the full
CDO schema.

Args:
    type: Type identifier — built-in name ("float", "vec3", "Color"),
          registered Niagara type, UEnum / UScriptStruct path, or
          UNiagaraDataInterface subclass name (with or without the U prefix).

Input parameters:

- `type` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_data_interface_schema` (~216 tokens)

Return the full editable-property schema of a UNiagaraDataInterface subclass.

Walks the CDO via the modular FProperty introspector. Covers every DI:
Array{Float,Float2,Float3,Float4,Color,Quat,Position,Matrix},
SkeletalMesh, StaticMesh, Spline, Curve, RenderTarget2D, VolumeTexture,
CameraQuery, NeighborGrid3D, Grid2D, Texture, etc.

Each field returns: name, kind, sub-type, display_name, tooltip, category,
clamp/UI min/max where present, recursive nested struct schema, enum entries
for enum-typed fields, etc. Use to discover what fields a DI supports
before configuring or instantiating one.

Args:
    class_: Class name with or without the "UNiagaraDataInterface" prefix.
            Examples: "ArrayFloat", "UNiagaraDataInterfaceSkeletalMesh",
            "Spline", "RenderTarget2D".

Input parameters:

- `class_` (string, required)

Output parameters:

- `result` (string)

### `get_niagara_schema_actions` (~160 tokens)

Return the full graph context-menu actions for a scratch pad module.

Wraps UEdGraphSchema_Niagara::GetGraphActions — the same call the editor uses to
populate the right-click "add node" menu for a Niagara script graph. Each entry
has display_name, category, tooltip, keywords, and template_class.

Args:
    system_path: Niagara System asset path
    module_name: Scratch pad module name (the actions are specific to its graph)
    filter: Optional substring applied to display_name/category/tooltip/keywords
    max_results: Cap on returned entries

Input parameters:

- `filter`
- `max_results` (integer)
- `module_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `list_niagara_available_parameters` (~222 tokens)

List parameters that can be bound to a Map Get / Map Set pin.

Returns well-known Engine.* parameters and Particles.* attributes unconditionally.
When system_path + module_name are supplied, also adds:
  \* User.* parameters from the system's exposed parameter collection
  \* Rapid-iteration parameters from every emitter script
  \* The target scratch pad module's own script graph variables (Module.* / Input.* / Transient.*)

Args:
    filter: Optional case-insensitive substring filter on parameter name
    namespace: "all" (default), "engine", "particles", "user", "module", "input", "transient", "rapid_iteration"
    max_results: Cap on returned entries (default 500)
    system_path: Optional system path to pull per-emitter + user params
    module_name: Optional scratch pad module to pull script-local params

Input parameters:

- `filter`
- `max_results` (integer)
- `module_name`
- `namespace` (string)
- `system_path`

Output parameters:

- `result` (string)

### `add_niagara_map_get_pin` (~175 tokens)

Add a typed output pin to the first ParameterMapGet node in a scratch pad graph.

Mirrors clicking "+" on a Map Get node in the editor and picking a variable.
The pin name becomes the parameter handle (e.g. "Engine.DeltaTime", "User.MyParam",
"Particles.Velocity").

Args:
    system_path: Niagara System asset path
    module_name: Scratch pad module name
    parameter_name: Variable name including namespace (e.g. "Engine.DeltaTime")
    parameter_type: Niagara type (float, int, bool, vec2/3/4, color, quat, matrix, position, ...)

Input parameters:

- `module_name` (string, required)
- `parameter_name` (string, required)
- `parameter_type` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_map_set_pin` (~121 tokens)

Add a typed input pin to the first ParameterMapSet node in a scratch pad graph.

Mirrors clicking "+" on a Map Set node in the editor.

Args:
    system_path: Niagara System asset path
    module_name: Scratch pad module name
    parameter_name: Variable name including namespace
    parameter_type: Niagara type (see add_niagara_map_get_pin)

Input parameters:

- `module_name` (string, required)
- `parameter_name` (string, required)
- `parameter_type` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `add_niagara_node_pin` (~233 tokens)

Generic: add a typed dynamic pin to any node in a scratch pad graph.

Works with Custom HLSL, Map Get, Map Set, or any node inheriting from
UNiagaraNodeWithDynamicPins. Identify the target node via exactly one of
node_class / node_index / node_id.

Args:
    system_path: Niagara System asset path
    module_name: Scratch pad module name
    pin_name: New pin name
    pin_type: Niagara type string (float, vec3, color, etc.)
    direction: "input" or "output"
    node_class: Class short name (e.g. "NiagaraNodeParameterMapGet", "ParameterMapGet")
    node_index: Raw Graph->Nodes index
    node_id: UEdGraphNode::NodeGuid string

Input parameters:

- `direction` (string)
- `module_name` (string, required)
- `node_class`
- `node_id`
- `node_index`
- `pin_name` (string, required)
- `pin_type` (string)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `rename_niagara_node_pin` (~102 tokens)

Rename a dynamic pin on any node in a scratch pad graph.

For Custom HLSL nodes, braced references inside the HLSL source ("{OldName}") are
rewritten automatically.

Input parameters:

- `module_name` (string, required)
- `new_name` (string, required)
- `node_class`
- `node_id`
- `node_index`
- `old_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `remove_niagara_node_pin` (~67 tokens)

Remove a dynamic pin from any node in a scratch pad graph.

Input parameters:

- `module_name` (string, required)
- `node_class`
- `node_id`
- `node_index`
- `pin_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `connect_niagara_pins` (~144 tokens)

Wire one node's output pin to another node's input pin inside a scratch pad graph.

Connection is validated via UEdGraphSchema_Niagara::TryCreateConnection so type
mismatches are rejected cleanly. Identify each side via the (class | index | id) trio.

Input parameters:

- `from_node_class`
- `from_node_id`
- `from_node_index`
- `from_pin` (string, required)
- `module_name` (string, required)
- `system_path` (string, required)
- `to_node_class`
- `to_node_id`
- `to_node_index`
- `to_pin` (string, required)

Output parameters:

- `result` (string)

### `disconnect_niagara_pins` (~70 tokens)

Break all connections on a specific pin of a node in a scratch pad graph.

Input parameters:

- `module_name` (string, required)
- `node_class`
- `node_id`
- `node_index`
- `pin_name` (string, required)
- `system_path` (string, required)

Output parameters:

- `result` (string)

### `get_statetree_info` (~51 tokens)

Get compact overview of a StateTree: schema, state count, evaluator count, etc.

Args:
    asset_path: Content path to the StateTree asset

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `get_statetree_states` (~133 tokens)

Get state hierarchy as a JSON tree. Each state shows name, type, ID, task/transition counts.

Use max_depth to limit recursion (0=roots only, 1=roots+children, -1=unlimited).
Use name_filter for case-insensitive substring match on state names.

Args:
    asset_path: Content path to the StateTree asset
    max_depth: Maximum depth to recurse (-1 for unlimited)
    name_filter: Only include states whose name contains this substring

Input parameters:

- `asset_path` (string, required)
- `max_depth` (integer)
- `name_filter`

Output parameters:

- `result` (string)

### `get_statetree_state` (~133 tokens)

Get detailed info for a single state: properties, tasks, conditions, transitions.

Identify by index path (e.g. "0/1/2"), name, or GUID.

Args:
    asset_path: Content path to the StateTree asset
    state: Index path (e.g. "0" for first root, "0/1" for second child of first root)
    state_name: State name (case-insensitive)
    state_guid: State GUID string

Input parameters:

- `asset_path` (string, required)
- `state`
- `state_guid`
- `state_name`

Output parameters:

- `result` (string)

### `get_statetree_evaluators` (~63 tokens)

Get all global evaluators with their properties and instance data.

Args:
    asset_path: Content path to the StateTree asset
    filter: Optional substring filter on evaluator class name

Input parameters:

- `asset_path` (string, required)
- `filter`

Output parameters:

- `result` (string)

### `get_statetree_global_tasks` (~58 tokens)

Get all global tasks with their properties.

Args:
    asset_path: Content path to the StateTree asset
    filter: Optional substring filter on task class name

Input parameters:

- `asset_path` (string, required)
- `filter`

Output parameters:

- `result` (string)

### `get_statetree_parameters` (~44 tokens)

Get tree-level parameters (name, type, value).

Args:
    asset_path: Content path to the StateTree asset

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `get_statetree_node` (~113 tokens)

Get detailed info for a single node (task/evaluator/condition) by GUID.

Returns the node's class, all properties, instance data, and where it lives
in the tree (which state, evaluator list, or global tasks).

Args:
    asset_path: Content path to the StateTree asset
    node_guid: GUID of the node (from get_statetree_state or get_statetree_evaluators)

Input parameters:

- `asset_path` (string, required)
- `node_guid` (string, required)

Output parameters:

- `result` (string)

### `get_statetree_bindings` (~96 tokens)

Get property bindings with full path details. Each binding shows source/target
node names, struct IDs, and property paths (e.g. "TargetLocation.X").

Optionally filter to bindings involving a specific node.

Args:
    asset_path: Content path to the StateTree asset
    node_guid: Only show bindings involving this node (optional)

Input parameters:

- `asset_path` (string, required)
- `node_guid`

Output parameters:

- `result` (string)

### `get_statetree_full_info` (~222 tokens)

Get complete StateTree data in one call with verbosity control.

Three verbosity levels:
\- "summary": Counts only (state_count, evaluator_count, etc.) — minimal tokens
\- "standard": All states (recursively detailed), evaluators, global tasks, parameters
\- "full": Everything from standard + property bindings inlined on every node

Use 'sections' to request only specific parts and save context:
\- "states" — state hierarchy with tasks, conditions, transitions
\- "evaluators" — global evaluators
\- "global_tasks" — global tasks
\- "parameters" — tree-level parameters
\- "bindings" — all property bindings as a flat list

Comma-separate multiple sections: "states,bindings"

Args:
    asset_path: Content path to the StateTree asset
    verbosity: "summary", "standard", or "full"
    sections: Comma-separated section filter (empty = all sections)

Input parameters:

- `asset_path` (string, required)
- `sections`
- `verbosity` (string)

Output parameters:

- `result` (string)

### `search_statetree_nodes` (~150 tokens)

Search for nodes across the entire StateTree by class name or category.

Answers questions like: "Is MassEnemyAttackTask used?" or "Which states have conditions?"
Returns each match with its location (which state, evaluator list, transition, etc.).

Args:
    asset_path: Content path to the StateTree asset
    class_filter: Substring filter on node class name (e.g. "Attack", "CompareInt")
    category: Filter by node category: "task", "evaluator", "condition", "consideration",
        "global_task" (empty = search all categories)

Input parameters:

- `asset_path` (string, required)
- `category`
- `class_filter`

Output parameters:

- `result` (string)

### `create_statetree` (~93 tokens)

Create a new StateTree asset with the specified schema.

Args:
    asset_path: Content path for the new asset (e.g. "/Game/AI/ST_MyTree")
    schema_class: Schema class name (e.g. "MassStateTreeSchema",
        "StateTreeComponentSchema", "StateTreeAIComponentSchema")

Input parameters:

- `asset_path` (string, required)
- `schema_class` (string, required)

Output parameters:

- `result` (string)

### `add_statetree_state` (~209 tokens)

Add a state to the tree. Omit parent params for a root-level state.

Args:
    asset_path: Content path to the StateTree asset
    name: Name for the new state
    parent: Parent state index path (e.g. "0/1")
    parent_name: Parent state name
    parent_guid: Parent state GUID
    state_type: "State", "Group", "Linked", "LinkedAsset", or "Subtree"
    selection_behavior: "None", "TryEnterState", "TrySelectChildrenInOrder",
        "TrySelectChildrenAtRandom", "TrySelectChildrenWithHighestUtility",
        "TryFollowTransitions"
    position: Insert position (-1 = append)

Input parameters:

- `asset_path` (string, required)
- `name` (string, required)
- `parent`
- `parent_guid`
- `parent_name`
- `position` (integer)
- `selection_behavior`
- `state_type` (string)

Output parameters:

- `result` (string)

### `add_statetree_task` (~149 tokens)

Add a task to a state.

Args:
    asset_path: Content path to the StateTree asset
    task_class: Task struct name (e.g. "MassEnemyAttackTask",
        "MassNavMeshPathFollowTask") or full path
    state: State index path
    state_name: State name
    state_guid: State GUID
    properties: JSON object for task node properties
    instance_properties: JSON object for task instance data properties

Input parameters:

- `asset_path` (string, required)
- `instance_properties`
- `properties`
- `state`
- `state_guid`
- `state_name`
- `task_class` (string, required)

Output parameters:

- `result` (string)

### `add_statetree_evaluator` (~103 tokens)

Add a global evaluator to the StateTree.

Args:
    asset_path: Content path to the StateTree asset
    evaluator_class: Evaluator struct name (e.g. "MassEnemyHasTargetEvaluator")
    properties: JSON object for evaluator node properties
    instance_properties: JSON object for evaluator instance data properties

Input parameters:

- `asset_path` (string, required)
- `evaluator_class` (string, required)
- `instance_properties`
- `properties`

Output parameters:

- `result` (string)

### `add_statetree_global_task` (~92 tokens)

Add a global task to the StateTree.

Args:
    asset_path: Content path to the StateTree asset
    task_class: Task struct name
    properties: JSON object for task node properties
    instance_properties: JSON object for task instance data properties

Input parameters:

- `asset_path` (string, required)
- `instance_properties`
- `properties`
- `task_class` (string, required)

Output parameters:

- `result` (string)

### `add_statetree_condition` (~201 tokens)

Add a condition to a state's enter conditions or a transition's conditions.

Args:
    asset_path: Content path to the StateTree asset
    condition_class: Condition struct name (e.g. "StateTreeCompareIntCondition")
    state: State index path
    state_name: State name
    state_guid: State GUID
    target: "enter_conditions" or "transition"
    transition_index: Required when target="transition"
    operand: "And" or "Or" (how to combine with previous conditions)
    properties: JSON object for condition properties
    instance_properties: JSON object for condition instance data

Input parameters:

- `asset_path` (string, required)
- `condition_class` (string, required)
- `instance_properties`
- `operand` (string)
- `properties`
- `state`
- `state_guid`
- `state_name`
- `target` (string)
- `transition_index`

Output parameters:

- `result` (string)

### `add_statetree_transition` (~256 tokens)

Add a transition to a state.

Args:
    asset_path: Content path to the StateTree asset
    trigger: "OnStateCompleted", "OnStateFailed", "OnStateSucceeded", "OnTick", "OnEvent"
    state: Source state index path
    state_name: Source state name
    state_guid: Source state GUID
    target_state: Target state index path, or special: "TreeSucceeded", "TreeFailed", "TreeStopped", "NextSibling"
    target_state_name: Target state name
    target_state_guid: Target state GUID
    priority: "Low", "Normal", "Medium", "High", "Critical"
    delay: Delay in seconds before transitioning
    delay_variance: Random variance (+/-) on delay
    event_tag: Gameplay tag for OnEvent trigger

Input parameters:

- `asset_path` (string, required)
- `delay`
- `delay_variance`
- `event_tag`
- `priority` (string)
- `state`
- `state_guid`
- `state_name`
- `target_state`
- `target_state_guid`
- `target_state_name`
- `trigger` (string, required)

Output parameters:

- `result` (string)

### `add_statetree_parameter` (~88 tokens)

Add a tree-level parameter.

Args:
    asset_path: Content path to the StateTree asset
    name: Parameter name
    type: Property type ("bool", "int32", "float", "FVector", "FName", "FString", etc.)

Input parameters:

- `asset_path` (string, required)
- `name` (string, required)
- `type` (string, required)

Output parameters:

- `result` (string)

### `set_statetree_state_property` (~121 tokens)

Set a property on a state (Name, Type, SelectionBehavior, Enabled, Tag, Weight, etc.).

Args:
    asset_path: Content path to the StateTree asset
    property_name: Property to set
    value: New value
    state: State index path
    state_name: State name
    state_guid: State GUID

Input parameters:

- `asset_path` (string, required)
- `property_name` (string, required)
- `state`
- `state_guid`
- `state_name`
- `value` (required)

Output parameters:

- `result` (string)

### `set_statetree_node_property` (~133 tokens)

Set a property on a task, evaluator, or condition by GUID.

Args:
    asset_path: Content path to the StateTree asset
    node_guid: GUID of the node
    property_name: Property to set
    property_value: New value (structs as dict, arrays as list, enums as string)
    target: "node" for the node struct itself, "instance" for instance data

Input parameters:

- `asset_path` (string, required)
- `node_guid` (string, required)
- `property_name` (string, required)
- `property_value` (required)
- `target` (string)

Output parameters:

- `result` (string)

### `set_statetree_transition_property` (~142 tokens)

Set a property on a transition (Trigger, Priority, TargetState, Delay, Enabled, etc.).

Args:
    asset_path: Content path to the StateTree asset
    transition_index: Index of the transition in the state's Transitions array
    property_name: Property to set
    value: New value
    state: State index path
    state_name: State name
    state_guid: State GUID

Input parameters:

- `asset_path` (string, required)
- `property_name` (string, required)
- `state`
- `state_guid`
- `state_name`
- `transition_index` (integer, required)
- `value` (required)

Output parameters:

- `result` (string)

### `set_statetree_schema` (~74 tokens)

Change the schema of a StateTree. Warning: existing nodes may become invalid.

Args:
    asset_path: Content path to the StateTree asset
    schema_class: Schema class name (e.g. "MassStateTreeSchema")

Input parameters:

- `asset_path` (string, required)
- `schema_class` (string, required)

Output parameters:

- `result` (string)

### `add_statetree_binding` (~138 tokens)

Add a property binding connecting a source node's output to a target node's input.

Args:
    asset_path: Content path to the StateTree asset
    source_node_guid: GUID of the source node
    source_property: Property path on source (e.g. "TargetLocation")
    target_node_guid: GUID of the target node
    target_property: Property path on target (e.g. "TargetLocation")

Input parameters:

- `asset_path` (string, required)
- `source_node_guid` (string, required)
- `source_property` (string, required)
- `target_node_guid` (string, required)
- `target_property` (string, required)

Output parameters:

- `result` (string)

### `set_statetree_color` (~108 tokens)

Add or update a color in the StateTree theme.

Args:
    asset_path: Content path to the StateTree asset
    name: Display name for the color
    color: Color as hex "#RRGGBB" or "R,G,B,A" floats (e.g. "0.5,0.2,0.8,1.0")

Input parameters:

- `asset_path` (string, required)
- `color` (string, required)
- `name` (string, required)

Output parameters:

- `result` (string)

### `remove_statetree_state` (~82 tokens)

Remove a state and all its children from the tree.

Args:
    asset_path: Content path to the StateTree asset
    state: State index path
    state_name: State name
    state_guid: State GUID

Input parameters:

- `asset_path` (string, required)
- `state`
- `state_guid`
- `state_name`

Output parameters:

- `result` (string)

### `remove_statetree_node` (~63 tokens)

Remove a task, evaluator, or condition by GUID.

Args:
    asset_path: Content path to the StateTree asset
    node_guid: GUID of the node to remove

Input parameters:

- `asset_path` (string, required)
- `node_guid` (string, required)

Output parameters:

- `result` (string)

### `remove_statetree_transition` (~97 tokens)

Remove a transition from a state.

Args:
    asset_path: Content path to the StateTree asset
    transition_index: Index of the transition to remove
    state: State index path
    state_name: State name
    state_guid: State GUID

Input parameters:

- `asset_path` (string, required)
- `state`
- `state_guid`
- `state_name`
- `transition_index` (integer, required)

Output parameters:

- `result` (string)

### `remove_statetree_binding` (~59 tokens)

Remove a property binding by index.

Args:
    asset_path: Content path to the StateTree asset
    binding_index: Index of the binding to remove

Input parameters:

- `asset_path` (string, required)
- `binding_index` (integer, required)

Output parameters:

- `result` (string)

### `remove_statetree_parameter` (~56 tokens)

Remove a tree-level parameter by name.

Args:
    asset_path: Content path to the StateTree asset
    name: Parameter name to remove

Input parameters:

- `asset_path` (string, required)
- `name` (string, required)

Output parameters:

- `result` (string)

### `compile_statetree` (~42 tokens)

Compile a StateTree and return errors/warnings.

Args:
    asset_path: Content path to the StateTree asset

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `list_statetree_node_types` (~89 tokens)

List available task/evaluator/condition types for the StateTree's schema.

Args:
    asset_path: Content path to the StateTree asset (determines schema)
    category: "task", "evaluator", or "condition"
    filter: Optional substring filter on class name

Input parameters:

- `asset_path` (string, required)
- `category` (string, required)
- `filter`

Output parameters:

- `result` (string)

### `get_statetree_transition_targets` (~125 tokens)

Get all valid transition targets for a StateTree.

Returns two lists:
\- 'states': All states with name, GUID, index_path, and type (for GotoState transitions)
\- 'meta_targets': Built-in targets (None, TreeSucceeded, TreeFailed, TreeStopped,
  NextSibling, NextState, NextSelectableState)

Use this before add_statetree_transition or set_statetree_transition_property
to discover valid target_state values.

Args:
    asset_path: Content path to the StateTree asset

Input parameters:

- `asset_path` (string, required)

Output parameters:

- `result` (string)

### `list_statetree_enum_values` (~162 tokens)

List valid enum values for StateTree properties.

Use this to discover valid values BEFORE creating states, transitions, or conditions.
Does not require an asset_path — these are engine-level constants.

Categories:
\- "trigger": OnStateCompleted, OnStateSucceeded, OnStateFailed, OnTick, OnEvent
\- "priority": Low, Normal, Medium, High, Critical
\- "state_type": State, Group, Linked, LinkedAsset, Subtree
\- "selection_behavior": None, TryEnterState, TrySelectChildrenInOrder, etc.
\- "operand": And, Or (for condition expressions)

Args:
    category: One of: trigger, priority, state_type, selection_behavior, operand

Input parameters:

- `category` (string, required)

Output parameters:

- `result` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/aadeshrao123-unreal-mcp/unrealmcp#diagnostics

## Score history

- 2026-08-07: 0
- 2026-08-06: 0

## Links

- PyPI project: https://pypi.org/project/unrealmcp/
- Socket report: https://socket.dev/pypi/package/unrealmcp
- Repository: https://github.com/aadeshrao123/Unreal-MCP
- Website: https://codefizz.dev/
- Changelog RSS feed: https://verifymcp.io/servers/aadeshrao123-unreal-mcp/unrealmcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/aadeshrao123-unreal-mcp/unrealmcp.json
- HTML version of this page: https://verifymcp.io/servers/aadeshrao123-unreal-mcp/unrealmcp
