Tool Reference
Tool Reference documentation.
This page lists ue-mcp's own category tools and actions. For the official Unreal 5.8 tools that ue-mcp wraps (surfaced inside these same categories), see Native Tools.
UE-MCP exposes 24 category tools covering 783+ actions, plus a flow tool for running multi-step YAML workflows. Every category tool takes an action parameter that selects the operation, plus action-specific parameters.
First call in any session
Start with project(action="get_status") to check the connection, then level(action="get_outliner") or asset(action="list") to explore.
How to read this page
Each row lists a single action and its key parameters. Optional params are marked with ?. For full schemas (types, descriptions, defaults), every action also surfaces its description through the MCP schema - your AI client can introspect them at runtime.
project
Project status and editor connection: get_status (is the editor connected?), set_project (switch/redirect the bridge to another .uproject), get_info. Also config INI files, module load state, and C++ source inspection. Call project(get_status) first in any session.
| Action | Description |
|---|---|
get_status | Check server mode and editor connection. Also reports pluginBuildStale when the compiled bridge is older than its source, which is the real cause of 'Unknown method' on handlers that do exist (#785) |
set_project | Switch project: moves both path resolution and the editor connection to the new .uproject. Params: projectPath |
list_editors | List every editor session this server drives: name, project, bridge port, whether the socket is connected, whether anything is answering on that port, and which session untargeted calls fall through to (#817) |
use_editor | Make one editor session the default target for untargeted calls. Does not change the session set and never touches any editor process. Params: editorTarget (session name, project name, or .uproject path) (#817) |
add_editor | Register another project as an addressable editor session, with its own bridge connection and port. Optionally launch its editor. Every category then accepts editor="<name>" to run a call there. Params: projectPath, editorName? (defaults to the project name), start? (launch the editor and wait for it to be ready), timeout? (seconds, default 300) (#817) |
drop_editor | Forget an editor session and close its bridge socket. The editor process is LEFT RUNNING and untouched - this detaches, it does not stop anything (use editor(stop_editor) for that). Params: editorTarget (#817) |
get_info | Read .uproject file details |
read_config | Read INI config. Params: configName (e.g. 'Engine', 'Game') |
search_config | Search INI files. Params: query |
list_config_tags | Extract gameplay tags from config |
read_cpp_header | Parse a .h file. Params: headerPath |
read_module | Read module source. Params: moduleName |
list_modules | List C++ modules |
search_cpp | Search .h/.cpp files. Params: query, directory? |
read_engine_header | Parse a .h file from the engine source tree. Params: headerPath (relative to Engine/Source, or absolute) |
find_engine_symbol | Grep engine headers for a symbol. Params: symbol, maxResults? |
list_engine_modules | List modules in Engine/Source/Runtime |
search_engine_cpp | Search engine .h/.cpp/.inl files across Runtime/Editor/Developer/Plugins. Params: query, tree? (Runtime|Editor|Developer|Plugins|all - default Runtime), subdirectory?, maxResults? (default 500) |
search_tools | Search every ue-mcp tool + action by keyword or task INTENT (a synonym layer maps 'screenshot'->capture_scene_png, 'tile a texture'->the texture-bomb flow, etc.) and return ranked matches (tool, action, description, score). The first step before editor(execute_python); most tasks already have a dedicated action. Params: query (space-separated keywords/intent), limit? (default 20) (#704) |
execute_python_report | Measurement for #704: reads this session's execute_python calls and, for each, runs its taskSummary back through search_tools to flag calls that OVERLAPPED an existing dedicated action ('you used Python for X, but tool Y does X'). Returns totalCalls, overlapping[] and an overlapRate. Params: none (#704) |
list_files | List files on disk under a directory, optionally filtered by extension(s). Runs in the MCP server process (no editor round-trip). Params: directory (absolute, or relative to the project dir), extensions? (e.g. ['png','exr'] or 'png'), recursive? (default false), maxResults? (default 1000) (#608) |
set_config | Write to INI. Params: configName, section, key, value |
build | Build C++ project. Params: configuration?, platform?, clean? |
generate_project_files | Generate IDE project files (Visual Studio, Xcode, etc.) |
create_cpp_class | Create a new native UCLASS in a project module. Uses the same engine template path as File → New C++ Class. Writes .h + .cpp; returns both paths plus needsEditorRestart (true unless Live Coding successfully hot-reloaded). Params: className (no prefix), parentClass? (default UObject; accepts short names like 'Actor' or /Script/[Module].[Class] paths), moduleName? (default: first project module, use list_project_modules to pick), classDomain? ('public'|'private'|'classes', default public), subPath? |
list_project_modules | List native modules in the current project (name, host type, source path). Feed moduleName from here into create_cpp_class |
list_loaded_modules | Enumerate ALL engine+project modules with runtime load state (loaded/gameModule), not just uproject-declared ones. Params: filter? (case-insensitive substring), loadedOnly? (default false) (#689) |
is_module_loaded | Report whether a named module is currently loaded in the editor. Params: moduleName (#689) |
live_coding_compile | Trigger a Live Coding compile (Windows only). Hot-patches method bodies of existing UCLASSes without editor restart - the fast inner loop for UFUNCTION implementations. Does NOT reliably register brand-new UCLASSes; use build_project + editor restart for those. Params: wait? (default false - fire and return 'in_progress') |
live_coding_status | Report Live Coding availability/state (available, started, enabledForSession, compiling). Helps choose between live_coding_compile and build_project |
write_cpp_file | Write a .h / .cpp / .inl file under the project's Source/ tree. Used to append UPROPERTYs/UFUNCTIONs or method bodies after create_cpp_class. Writes are scoped to Source/ for safety. Params: path (relative to Source/ or absolute within Source/), content (full file contents) |
read_cpp_source | Read a .cpp file from the project Source/ tree. Companion to read_cpp_header for round-trip edits. Params: sourcePath (relative to Source/ or absolute) |
write_source_file | Write a .h/.cpp/.inl into a named module's Public/Private folder (resolves the module dir for you, including plugin modules under Plugins/*/Source/ that write_cpp_file refuses). After a new file, build_project + restart; after a body edit, live_coding_compile. Params: module (module name, default the project's primary module), visibility (Public|Private, default Private), fileName, content |
read_source_file | Read a .h/.cpp/.inl from a named module's folder (companion to write_source_file; resolves plugin modules too). With no visibility it tries Public then Private then the module root. Params: module, visibility?, fileName |
add_module_dependency | Add a module to a target module's Build.cs dependency array. Params: moduleName (the Build.cs to edit - must exist in the project), dependency (module name to add, e.g. 'UMG'), access? ('public'|'private', default 'private') |
add_cpp_member | Append a UPROPERTY/UFUNCTION declaration to an existing UCLASS header inside the access specifier you choose. Idempotent: if a declaration containing the same memberName is already present, returns existed:true. Params: headerPath (relative to Source/ or absolute), declaration (full multi-line UPROPERTY(...) / UFUNCTION(...) block plus its single-line member or function signature), memberName (the identifier the declaration introduces - used for idempotency), access? ('public'|'protected'|'private', default 'public') |
asset
Asset management: list, search, read, CRUD, import meshes/textures, datatables, stringtables.
| Action | Description |
|---|---|
list | List assets via the AssetRegistry (sees /Game and every mounted plugin root). Paginated: returns totalMatched, offset, hasMore and nextOffset so a large folder can be walked deterministically instead of dropping the bridge on one oversized response (#790). Params: directory? (default /Game), classFilter?, recursive? (default true), maxResults? (default 500, max 5000), offset? (default 0) |
search | Search by name/class/path. Params: query, directory?, maxResults?, searchAll? |
read | Read asset via reflection. Params: assetPath |
read_properties | Read asset properties with values. Blueprint paths resolve to the generated-class CDO (#568). propertyName accepts dotted/indexed paths into nested structs, array elements, and instanced subobjects (e.g. Config.Traits[1].Params.Field); landing on an array of subobjects also lists each element's index+class (#527). expandDepth inlines the properties of subobjects OWNED by this asset, so a data asset's nested payload comes back in ONE call instead of a reference you have to chase (#755); references to OTHER assets are marked expandable rather than followed, unless expandExternal=true. Capped by maxExpandedObjects with expansionTruncated reported. Params: assetPath, propertyName?, includeValues?, valueFormat?, expandDepth? (0-5, default 0), expandExternal?, maxExpandedObjects? (default 64) |
list_properties | List reflected properties on any asset. Params: assetPath, includeValues?, valueFormat? ('text'|'json') |
get_properties | Read property values on any asset. propertyName accepts dotted/indexed paths into nested structs, array elements, and instanced subobjects. valueFormat='json' returns structured values. Params: assetPath, propertyName?, includeValues?, valueFormat? |
duplicate | Duplicate asset. Params: sourcePath, destinationPath |
rename | Rename asset. Params: assetPath, newName (or sourcePath, destinationPath), force? |
bulk_rename | Batched rename using IAssetTools::RenameAssets - single transaction with one redirector-fixup pass (matches Content Browser drag). Use this over looped rename for scene-referenced assets. World assets are rejected (status=rejected_world); use rename_asset which handles WP externals atomically (#409). Params: renames[] where each entry is (sourcePath, destinationPath) OR (assetPath, newName) |
move | Move asset. Params: sourcePath, destinationPath |
delete | Delete asset. On failure returns reason (open_in_editor / has_referencers / in_memory_referenced / package_read_only / package_dirty / unknown) plus referencers, inMemoryReferencers, packageReadOnly, packageDirty diagnostics (#601). Pass force=true to auto-close any open asset editors before deleting (#278). Params: assetPath, force? |
delete_batch | Batch-delete assets. Per-path status (deleted/absent/failed) plus reason+referencers on failed entries (#278). Params: assetPaths[], force? |
create_data_asset | Create UDataAsset instance of custom class. className accepts the C++ spelling with or without the A/U/F/E prefix (UMyConfig and MyConfig both resolve), a /Script/Module.ClassName path, or a loaded class name; a failed lookup lists the spellings tried and the closest matches (#823). Params: name, className, packagePath?, properties? (key/value map) |
create_asset_by_class | Create an asset of ANY concrete UObject class (not just UDataAsset) - physical-material subclasses, curves, settings objects. className accepts the C++ spelling with or without the A/U/F/E prefix, a /Script/Module.ClassName path, or a loaded class name (#823). Params: name, className, packagePath?, properties? (key/value map), onConflict? (skip|replace|rename) |
bulk_upsert_data_assets | Create or update up to 500 UDataAsset instances in ONE call. Every descriptor is first applied to a transient copy, so a bad class, property path, or value rejects the whole batch before a package is touched; nothing is half-written by a typo. Per-item status is created | updated | unchanged | skipped | failed (dryRun reports wouldCreate | wouldUpdate | wouldRemainUnchanged | wouldSkip), each with its own error when it failed. Replaying the same request returns unchanged, and only changed packages are saved. Emits a rollback descriptor that restores prior values and deletes what it created. Params: items[]: [(name, packagePath, className, properties?)], onConflict? (update (default) | skip | error), dryRun? (default false), save? (default true) |
save | Save one asset, or every dirty asset under /Game when assetPath is omitted. force=true saves regardless of the dirty flag - several edits (OFPA level actors, some subsystem property writes) never mark their package dirty, so a dirty-only save skipped them and still reported success. Returns the package name plus on-disk file path, size and mtime so the write can be verified rather than trusted (#768). Params: assetPath?, force? |
save_all_dirty | Flush every dirty package to disk in one call. Reports the packages it attempted, which ones reached disk (with file path, size and mtime) and which are still dirty afterwards, because a bare savedAll boolean has come back true while packages were never written (#768). Params: saveMapPackages? (default true), saveContentPackages? (default true) |
set_mesh_material | Assign material to static mesh slot. Params: assetPath, materialPath, slotIndex? |
set_mesh_materials_batch | Assign materials across many meshes and slots in one call, so an N mesh x M slot kit costs one round trip instead of N*M. StaticMesh and SkeletalMesh both work. Address a slot by slotName (survives a reimport reordering slot indices) or by slotIndex (default 0); passing both is rejected when they disagree. Every submitted assignment returns its own index/ok/status/error, status being ok|updated|unchanged|invalid|protected|duplicate|not_found|slot_not_found|failed|skipped. Default is all-or-nothing: any preflight rejection aborts before a mesh is touched. Pass continueOnError to apply the assignments that did pass and keep the rejects reported alongside them. Each mesh is written and saved once no matter how many of its slots the batch names, and the rollback payload restores only the writes that landed. Params: assignments ([(assetPath, materialPath, slotName? | slotIndex?)], max 500), save? (default true), dryRun? (default false), continueOnError? (default false) (#822) |
recenter_pivot | Move static mesh pivot to geometry center. Params: assetPath OR assetPaths |
import_static_mesh | Import from FBX, OBJ, or GLB/glTF (glTF routes through Interchange) (#549). importUniformScale=100 fixes metre-authored FBX (#687). Params: filePath, name?, packagePath?, combineMeshes?, importMaterials?, importTextures?, generateLightmapUVs?, importUniformScale? |
import_skeletal_mesh | Import skeletal mesh from FBX. importUniformScale=100 fixes metre-authored FBX (Blender FBX_SCALE_ALL) that lands 100x too small on a cm skeleton (#687). Returns post-import readback: boxExtent, morphTargets[], numLODs, skeleton (#678). Params: filePath, name?, packagePath?, skeletonPath?, importMaterials?, importTextures?, importUniformScale? (default 1.0), importMorphTargets? (default true), createPhysicsAsset? (default false), replaceExisting? (default true) |
import_animation | Import anim from FBX. Params: filePath, name?, packagePath?, skeletonPath |
import_texture | Import image. sRGB/compressionSettings/lodGroup/neverStream are applied at import time (folded in, no second call needed) (#661). Params: filePath, name?, packagePath?, sRGB?, compressionSettings? (Default|Normalmap|Grayscale|HDR|BC7|...), lodGroup?, neverStream? |
create_render_target_2d | Create and persist a TextureRenderTarget2D asset. Render format is applied before resource initialization. Params: name, packagePath? (default /Game), width? (1-8192, default 512), height? (1-8192, default 512), format? (R8|RG8|RGBA8|RGBA8_SRGB|R16F|RG16F|RGBA16F|R32F|RG32F|RGBA32F|RGB10A2, default RGBA8_SRGB), clearColor? ((r,g,b,a), default transparent), generateMips? (default false), targetGamma? (default 0), onConflict? (skip|error) |
read_cloth_data | Read Chaos cloth data on a skeletal mesh: per clothing asset, its configs (reflected properties), LOD count, and per-LOD point-weight-map summary (name, target, vertex count, min/max - including the MaxDistances mask). Params: skeletalMeshPath (#595) |
set_cloth_config | Set properties on a clothing asset's Chaos cloth config via reflection. Params: skeletalMeshPath, properties (object), clothingAsset? (name filter), configType? (config class/key filter) (#595) |
export_texture | Export a Texture2D to a PNG on disk (for inspection or external diffing). Params: assetPath, outputPath (.png) (#697) |
compare_textures | Compare two Texture2D assets by dimensions, pixel format, and source-content identity (FTextureSource id) - tells you whether an authored texture actually changed without offline pixel-diffing. Params: assetPathA, assetPathB (#697) |
import_texture_batch | Import many textures in one call - the loop stays inside the editor (no per-file bridge round-trip), so this finishes far faster than N import_texture calls. Per-item result records mirror import_texture. Params: items[]: [(filePath, packagePath?, name?, replaceExisting?)], packagePath? (default for items that don't set it), save? (default true), automated? (default true) |
reimport | Reimport asset from source file. Params: assetPath, filePath? |
read_datatable | Read DataTable rows. Params: assetPath, rowFilter? |
create_datatable | Create DataTable. Params: name, packagePath?, rowStruct |
reimport_datatable | Reimport DataTable from JSON. Params: assetPath, jsonPath?, jsonString? |
set_datatable_row | Append or overwrite a single DataTable row. Params: assetPath, rowName, row (object with row-struct fields - partial updates merge with the existing row) |
add_datatable_row | Alias for set_datatable_row (#437) |
update_datatable_row | Alias for set_datatable_row; partial update merges with existing row (#437) |
remove_datatable_row | Remove a single DataTable row. Idempotent (alreadyDeleted=true if missing). Params: assetPath, rowName (#437) |
get_datatable_row | Read one DataTable row's fields without dumping the whole table. Params: assetPath, rowName (#535) |
set_datatable_cell | Write a single field on a single existing row (merges, leaves other cells untouched). Errors if the row doesn't exist. Params: assetPath, rowName, fieldName, value (#535) |
rename_datatable_row | Rename a row key, preserving its values. Params: assetPath, oldName, newName (#535) |
fill_datatable_from_json | Bulk-upsert rows from a {rowName: {field: value}} object without touching unrelated rows (non-destructive, unlike reimport_datatable). Params: assetPath, rows (object) or jsonString (#535) |
create_curvetable | Create CurveTable asset. Params: name, packagePath?, onConflict? |
read_curvetable | Read CurveTable rows and keys. Params: assetPath, rowFilter? |
list_curvetable_rows | Alias for read_curvetable. Params: assetPath, rowFilter? |
import_curvetable | Import CurveTable from JSON/CSV string or file. Params: assetPath, jsonString?, csvString?, filePath?, format?, interpMode? |
add_curvetable_row | Add CurveTable row. Params: assetPath, rowName, curveType? ('simple'|'rich'), interpMode? |
remove_curvetable_row | Remove CurveTable row. Idempotent if missing. Params: assetPath, rowName |
rename_curvetable_row | Rename CurveTable row. Params: assetPath, oldName, newName |
get_curvetable_keys | Read keys from one CurveTable row. Params: assetPath, rowName |
set_curvetable_keys | Replace keys on one CurveTable row. Params: assetPath, rowName, keys:[(time,value,interpMode?,arriveTangent?,leaveTangent?)] |
add_curvetable_key | Add or update one key on a CurveTable row. Params: assetPath, rowName, time, value, interpMode?, keyTimeTolerance? |
list_textures | List textures. Params: directory?, recursive? |
get_texture_info | Get texture details. Params: assetPath |
set_texture_settings | Set texture settings. Params: assetPath, settings (object with compressionSettings?, lodGroup?, sRGB?, neverStream?) |
create_stringtable | Create a StringTable asset. Params: name, packagePath?, namespace?, onConflict? |
read_stringtable | Read StringTable entries and keys. Params: assetPath, keyFilter? |
list_stringtable_keys | List StringTable keys. Params: assetPath, keyFilter? |
get_stringtable_entry | Read one StringTable entry. Params: assetPath, key |
set_stringtable_entry | Create or update one StringTable entry. Params: assetPath, key, sourceString (or value) |
remove_stringtable_entry | Remove one StringTable entry. Idempotent (alreadyDeleted=true if missing). Params: assetPath, key |
import_stringtable | Import StringTable entries from CSV. Params: assetPath, filePath (or csvPath) |
add_input_mapping | Append an Enhanced Input key mapping to an InputMappingContext (InputAction + key by name string e.g. 'Mouse2D','LeftMouseButton'). Idempotent on (action,key). For modifiers/triggers use gameplay(set_mapping_modifiers). Same as gameplay(add_imc_mapping) (#525). Params: mappingContext (IMC path), inputAction (IA path), key |
remove_input_mapping | Remove an IMC key mapping. Same as gameplay(remove_imc_mapping) (#525). Params: mappingContext (IMC path), mappingIndex? | (inputAction? + key?) |
list_input_mappings | List an IMC's key->action bindings with triggers/modifiers. Same as gameplay(read_imc) (#525). Params: mappingContext (IMC path) |
add_socket | Add socket to StaticMesh or SkeletalMesh. SkeletalMesh writes mesh-local sockets by default; pass a Skeleton asset path to edit skeleton-level sockets. Idempotent on socket name; pass onConflict='update' to overwrite an existing socket's transform with the supplied relativeLocation/relativeRotation/relativeScale (#412). Params: `assetPath, socketName, boneName? (SkeletalMesh only, default 'root'), relativeLocation?, relativeRotation?, relativeScale?, onConflict? (skip\ |
remove_socket | Remove socket by name. Params: assetPath, socketName |
list_sockets | List sockets on a mesh (StaticMesh or SkeletalMesh). SkeletalMesh results include mesh-local sockets plus assigned Skeleton sockets, each with source='mesh' or source='skeleton'. Params: assetPath |
set_socket_transform | Update an existing socket's relative transform on StaticMesh or SkeletalMesh. Pass any subset of relativeLocation/relativeRotation/relativeScale; omitted fields stay at their current values. Errors if the socket does not exist (use add_socket to create). Common after FBX import when SOCKET_* empties land with scale=(100,100,100) (#412). Params: assetPath, socketName, relativeLocation?, relativeRotation?, relativeScale? |
set_property | Set a UPROPERTY on any loaded asset (Material, DataAsset, DataTable, SubsurfaceProfile, etc.) using a dotted path. Blueprint paths resolve to the generated-class CDO so you can author its defaults + Instanced sub-object arrays (#568). Walks nested structs, array elements by index, and instanced subobjects internally - no more read-modify-write copies (e.g. settings.mean_free_path_distance on a UMaterial, or Config.Traits[1].Params.Field on a config asset #527). Value goes through MCPJsonProperty::SetJsonOnProperty so JSON null clears object refs, structs accept {x,y,z}, arrays/maps round-trip. TMap values take { "Key": value } or, for struct keys, [{ key: {...}, value: ... }]; a write that cannot store every entry fails and leaves the old value untouched (#820). Params: assetPath, propertyName (dotted path), value (#420) |
append_array_elements | Append one or more JSON values to a reflected TArray without replacing existing entries. Supports dotted property paths plus native and user-defined USTRUCT elements. All elements are validated before mutation; returns appended indices and rollback data, and leaves the package dirty without saving. Params: assetPath, propertyName, elements |
bulk_set_properties | Set dotted UPROPERTY paths on as many as 500 assets in one preflighted batch. Every asset, path, and value is validated before anything is mutated, and every submitted item comes back with its own ok/status/error, so a bad path in item 300 never hides the other 499 verdicts. Default is all-or-nothing: any preflight rejection aborts before a single UObject is touched. Pass continueOnError to apply the items that did pass and keep the rejects reported alongside them. Returns per-property readback, aggregate counts, targeted save results, and a replayable rollback payload covering only the writes that landed. Params: items ([(assetPath, properties)]), save? (default true), dryRun? (default false), continueOnError? (default false) |
set_texture_settings_by_type | Apply the canonical (compressionSettings, sRGB, LOD group) combo to every texture in each group: normal -> Normalmap, grayscale -> Grayscale, baseColor -> Default sRGB, hdr -> HDR. Params: groups (object: (normal?:[paths], grayscale?:[paths], baseColor?:[paths], hdr?:[paths])) (#421) |
create_interchange_pipeline | One-call factory for a UInterchangeGenericAssetsPipeline asset with the 15-property mesh-import boilerplate already applied (RecomputeNormals=false, MikkTSpace=true, HighPrecisionTangents=true, BuildNanite=false, CreatePhysicsAsset=false, etc.). Params: assetPath OR (name + packagePath?), meshType? (skeletal default | static), options? (dotted-path overrides on the resulting pipeline e.g. ('MeshPipeline.bBuildNanite': true)), onConflict? (#421) |
reload_package | Force reload an asset package from disk. Params: assetPath |
health_check | Diagnose stuck-unloadable asset. Returns onDisk/inRegistry/isLoaded/canLoad/isStuck flags so an agent can detect the half-shutdown state where load returns null but the file exists (#279). Params: assetPath |
force_reload | Aggressive reload from disk: closes open editors, reloads the package (rebuilding a Blueprint's class and CDO so container properties come back fresh, not just scalars), and reports objectReplaced. Refuses a dirty package unless discardUnsaved=true, and fails loudly when the editor would not release the old object rather than serving stale values (#279/#820). Params: assetPath, discardUnsaved? (default false) |
export | Export asset to disk file (Texture2D → PNG, StaticMesh → FBX, etc.). Params: assetPath, outputPath |
search_fts | Ranked asset search (token-scored over name/class/path). Params: query, maxResults?, classFilter? |
reindex_fts | Rebuild the SQLite FTS5 asset index. Params: directory? |
get_referencers | Reverse dependency lookup (what references this). Params: packages[] OR packagePath (#150) |
get_dependencies | Forward dependency lookup (what packages this asset references). Params: packages[] OR packagePath, hard? (default true), soft? (default true) (#588) |
list_skeleton_bones | List bones (names + rest-pose local and component-space transforms) from a SkeletalMesh or Skeleton asset, no live actor needed. Params: assetPath, includeTransforms? (default true) (#593) |
get_primary_asset_ids | Enumerate AssetManager-registered FPrimaryAssetIds (verify a primary-asset registration). Params: type? (FPrimaryAssetType; omit for all types), maxResults? (default 1000) (#579) |
set_sk_material_slots | Set materials on a USkeletalMesh by slot name or slotIndex (bypasses the blueprint override-materials path that UE's ICH silently reverts). Params: assetPath, slots[(slotName?|slotIndex?, materialPath)] |
diagnose_registry | Scan a content path and compare disk vs AssetRegistry (including in-memory pending-kill entries). Returns onDiskCount, inMemoryIncludedCount, ghostCount and paths. Params: path, recursive? (default true), reconcile? (forceRescan=true) |
get_mesh_bounds | Get StaticMesh OR SkeletalMesh bounding box. Params: assetPath |
get_mesh_info | One-call mesh QA: bounds + material slots + skeleton + LOD/vertex counts. Works for both UStaticMesh and USkeletalMesh. Params: assetPath |
read_import_sources | Read AssetImportData source filenames on an imported asset (StaticMesh, SkeletalMesh, Texture, Animation, etc.). Returns sources[] of {relativeFilename, absolutePath, timestamp, fileHash, displayLabelName}. Params: assetPath (#270) |
get_mesh_collision | Inspect StaticMesh collision setup. Params: assetPath |
migrate | Copy assets and their dependencies into ANOTHER project's Content directory - the scripted form of the content browser's Migrate (#760). destinationContentDir is the TARGET project's Content folder. While this server drives more than one editor, a 'toEditor' parameter is offered as well: name the destination editor and its Content folder is resolved for you and its asset registry rescanned afterwards, so the assets are visible there without a manual rescan (#817). The call runs in the editor holding the SOURCE assets, so it pushes assets out of the project it is attached to. Unsaved or never-saved assets are refused, because migrate copies files and would otherwise silently omit your edits. Every asset is resolved before anything is copied, and the destination is checked for the packages afterwards rather than reporting success on the call returning. Params: assetPaths (string[]) or assetPath, toEditor OR destinationContentDir, includeDependencies? (default true), onConflict? (skip|overwrite, default skip), allowDirty?, dryRun? |
move_folder | Move/rename entire content folder with redirector fixup in one transaction. Params: sourcePath, destinationPath (#192) |
create_folder | Create empty content browser folder(s). Params: path OR paths[] (e.g. /Game/Foo, /Game/Bar/Baz) |
delete_folder | Delete content browser folder(s) - counterpart to delete_asset, which leaves the parent directory entry behind as an orphan. Empty folders only by default; pass force=true to also delete any assets still inside (Content Browser 'Delete folder' equivalent). Per-path status (deleted/absent/failed) with reason (invalid_path/protected_path/not_empty/delete_failed) and a sample of contained assets on not_empty entries. Params: path OR paths[], force? |
set_mesh_nav | Set StaticMesh nav contribution. Params: assetPath, bHasNavigationData?, clearNavCollision? (#167) |
create_user_defined_enum | Create a UserDefinedEnum content asset, optionally pre-populated with values. Params: name, packagePath? (default /Game), values? ([display-name strings]), onConflict? (#686) |
list_enum_values | List a UEnum's enumerators (index, authored short name, display name, value). Works on native and UserDefinedEnum assets. Params: assetPath (#686) |
edit_user_defined_enum | Author a UserDefinedEnum content asset. op=add_value appends an enumerator (authored name is auto-assigned; pass displayName - or name - to set the editable display text). op=rename_value sets a new displayName on the enumerator resolved by index or name (matches short or display name). op=remove_value deletes it. Recompiles dependents automatically. Native UEnums are not editable. Params: assetPath, op (add_value|rename_value|remove_value), displayName?, name?, index? (#686) |
create_user_defined_struct | Create a UserDefinedStruct content asset, optionally pre-populated with fields. Each field is {name, type} where type is a MakePinType string (bool|int|int64|float|string|name|text|byte, a struct like Vector, an enum, or an object ref like Actor). Params: name, packagePath? (default /Game), structFields? ([(name, type)]), onConflict? (#735) |
list_struct_fields | List a UserDefinedStruct's members (index, internal name, friendly/display name, GUID, type label). Use this to find the GUID for a stable rename/retype. Native structs are not editable. Params: assetPath (#735) |
edit_user_defined_struct | Author a UserDefinedStruct content asset. op=add_field appends a member (type via MakePinType string; pass fieldName for its display name). op=rename_field sets a new newDisplayName on the member resolved by fieldGuid or fieldName - the member GUID is preserved so existing Blueprint pins and DataTable rows survive. op=set_field_type changes a member's type. op=remove_field deletes it. Recompiles dependents automatically. Native structs are not editable. Params: assetPath, op (add_field|rename_field|set_field_type|remove_field), fieldName?, fieldGuid?, newDisplayName?, type? (#735) |
rename_struct_field | Rename a UserDefinedStruct field's display name while preserving its member GUID, so Blueprint pins and DataTable rows keyed off it survive. Convenience wrapper over edit_user_defined_struct(op=rename_field). Resolve the field by fieldGuid or fieldName (matches friendly or internal name). Params: assetPath, fieldName | fieldGuid, newDisplayName (#735) |
lock | Acquire an exclusive lock on an asset for this editor. Returns acquired=true, or acquired=false with holder{sessionId,ttlSecondsRemaining} when another session holds it. Params: assetPath, ttlSeconds? (default 300), sessionId? |
unlock | Release an asset lock held by this editor (or force=true to break any holder's lock). Params: assetPath, force?, sessionId? |
list_locks | List all currently-held asset locks with holder session id, acquiredAt, and ttlSecondsRemaining |
unlock_all | Release every lock held by one session in a single call, returning the number released. Defaults to the addressed editor's own session; pass sessionId to clear a different one (for example after a crashed session left assets wedged). Params: sessionId? |
diff | Semantic structural diff between two assets of any type, dispatching on the asset's class. Blueprints are diffed structurally (parent class, variables, functions, components, per-graph node and connection deltas); other asset types report that diffing is not supported yet rather than failing opaquely. Params: assetPath, otherPath |
blueprint
Blueprint reading, authoring, and compilation, including AnimGraph/EventGraph node scripting: add_node, connect_pins, search_node_types, plus variables, functions, graphs, components, interfaces, and event dispatchers.
| Action | Description |
|---|---|
read | Read BP structure incl. SCS components AND inherited native components from the CDO (CharacterMesh0, CharMoveComp, etc.). Params: assetPath, includeComponentProperties? (dump UPROPERTY name/type/value per component template; off by default) (#353/#370) |
list_variables | List variables with name, type, guid, category, tooltip, exposeOnSpawn, blueprintReadOnly, private, and editFlag ('EditAnywhere'|'EditDefaultsOnly'|'EditInstanceOnly'|'none'). instanceEditable is true only for EditAnywhere and EditInstanceOnly - EditDefaultsOnly is class-defaults-only and reports false (#744). private is reported separately because it is a Blueprint-graph access flag, not a details-panel one. Params: assetPath |
list_functions | List the whole graph surface of a Blueprint, matching what list_graphs reports. Every entry carries kind ('function' own declaration | 'override' of a parent function | 'interface' implementation | 'event_graph' | 'event' entry point on an event graph | 'macro' | 'delegate_signature' | 'subgraph' collapsed graph | 'inherited'), source ('own'|'parent'|'interface'), graphName, and declaringClass/declaringClassPath where one applies. name and nodeCount are unchanged; nodeCount is 0 for entries that are not graphs. Params: assetPath, includeInherited? (append overridable parent/interface functions this Blueprint has not implemented, default false) (#809) |
read_graph | Read graph nodes. Supports pagination, file dumps, and title/class node filters. With includeDefaults, literal FText pin values are returned inline (defaultValue falls back to the pin's text literal, plus an explicit defaultTextValue) and object-ref pins report defaultObject (#743). Params: assetPath, graphName, offset?, limit?, includePins?, includeDefaults?, includeComments?, dumpToFile?, outputPath?, titleFilter?, classFilter? (#560) |
read_graph_summary | Lightweight graph summary (nodes+edges only, ~10KB). Filterable node list. Params: assetPath, graphName?, titleFilter?, classFilter? (#560) |
get_execution_flow | Trace exec pins from an entry point. Params: assetPath, graphName?, entryPoint? |
get_dependencies | Forward (classes/functions/assets) or reverse (referencers) deps. Params: assetPath, reverse? |
diff | Semantic structural diff between two Blueprints (binary uassets are unreviewable in git). Compares parent class, variables (type/default), functions/macros, components, and per-graph node + connection deltas keyed on stable node GUIDs so edits are matched rather than shown as remove+add. Returns a structured delta plus a human summary and changeCount. Params: assetPath (base/A), otherPath (compare/B) |
create | Create Blueprint. assetPath is the full destination, e.g. /Game/Blueprints/BP_Example; a name plus packagePath pair is accepted as the same thing. A .uasset suffix, an object suffix, and backslashes are normalized away rather than reaching the editor as an invalid asset name. Params: assetPath, name?, packagePath?, parentClass? |
add_variable | Add variable. varType accepts bool/int/float/string/name/text/byte/vector/rotator/transform/gameplaytag, object:/Script/Module.Class, struct:/Game/Path/To/Struct, or a full class/struct path. Unrecognized types are rejected rather than silently defaulting. Params: assetPath, name, varType (alias: type), onConflict? (skip|error, default skip) (#745) |
set_variable_properties | Edit variable properties. Note: replication is set with networking(set_property_replicated), and blueprintReadOnly is not writable here - list_variables reports it. Params: assetPath, name, editFlag? (EditAnywhere|EditDefaultsOnly|EditInstanceOnly|none - the exact value list_variables reports, and the only form that round-trips every state), instanceEditable? (two-state shorthand; mutually exclusive with editFlag), private?, category?, tooltip?, exposeOnSpawn? |
create_function | Create function. Params: assetPath, functionName |
delete_function | Delete function. Params: assetPath, functionName |
rename_function | Rename function. Params: assetPath, oldName, newName |
add_node | Add graph node. For a CallFunction node bound to a custom C++ UFUNCTION, pass nodeParams {functionName, className (or targetClass) = /Script/Module.Class}; the function also resolves against the BP's own component classes and an unambiguous loaded BlueprintCallable function, producing a bound node with pins instead of a stub (#546). nodeClass='CallParent' places a 'Parent: <Function>' call bound to the parent implementation (functionName resolves against ParentClass) so an override graph can chain to the base (#688). Params: assetPath, graphName?, nodeClass, nodeParams? |
delete_node | Delete node. Params: assetPath, graphName, nodeName |
set_node_property | Set node pin default or struct property. Params: assetPath, graphName, nodeName, propertyName, value |
connect_pins | Wire nodes. Params: sourceNode, sourcePin, targetNode, targetPin, assetPath, graphName?, breakExistingSource?, breakExistingTarget? |
add_component | Add BP component. componentClass accepts short names (e.g. 'ChildActorComponent') or full paths. For a ChildActorComponent, pass childActorClass to set its ChildActorClass in the same call (a Blueprint path with or without _C, or a C++ class) (#526). Params: assetPath, componentClass, componentName?, parentComponent? (SCS parent for hierarchy - #115), childActorClass? |
remove_component | Remove SCS component. Params: assetPath, componentName |
set_component_property | Set property on SCS or inherited component. Inherited components go through the child BP's InheritableComponentHandler override template so the parent stays untouched. Pass value=null to clear a TObjectPtr/SoftObject/WeakObject/UClass/Interface reference (e.g. clear AnimClass on CharacterMesh0) (#420). Params: assetPath, componentName, propertyName, value |
set_component_override_materials | Write OverrideMaterials on a mesh-component template (StaticMeshComponent / SkeletalMeshComponent / any UMeshComponent). Pass materialPaths as a string[] of material asset paths (empty array clears). Avoids any TArray<UObject*> coercion on the generic set_component_property path (#442). Params: assetPath, componentName, materialPaths |
add_timeline_track | Add a track to a Blueprint timeline. Creates the UTimelineTemplate if missing, builds the matching curve asset (float/vector/color/event), applies keyframes, bumps TimelineLength to cover the last key, then recompiles so K2Node_Timeline regenerates its output pins. Params: assetPath, timelineName, trackName, trackType ('float'|'vector'|'color'|'event'), keyframes ([(time, value)]) |
set_capsule_size | Call UCapsuleComponent::SetCapsuleSize on a CapsuleComponent template (CharacterMovement-friendly path; raw property writes leave the visualizer stale). Pass either or both of halfHeight/radius. Returns the new + previous values. Params: assetPath, componentName, halfHeight?, radius? (#419) |
get_component_property | Read a single property value from an SCS or inherited component template. Returns the ICH override value for child BPs if one exists. Params: assetPath, componentName, propertyName |
set_class_default | Set UPROPERTY on Blueprint CDO. Pass value=null to clear an object/class/interface reference (#420). Params: assetPath, propertyName, value |
delete_variable | Delete a member variable. Params: assetPath, name |
add_function_parameter | Add input or output parameter to a function. Params: assetPath, functionName, parameterName, parameterType?, isOutput? |
set_variable_default | Set default value on a BP variable. Params: assetPath, name, value |
compile | Compile Blueprint. Params: assetPath |
list_node_types | List node types. Params: category?, includeFunctions? |
search_node_types | Search placeable nodes across every loaded Blueprint function library (KismetMathLibrary, GameplayStatics, custom libraries) plus UEdGraphNode classes. Matches the C++ name, the palette label from DisplayName metadata, and Keywords metadata, ignoring case/spaces/underscores, so 'is point in box' finds IsPointInBox and 'vector length' finds VSize. Results are ranked and each carries an addNode block (nodeClass + nodeParams incl. targetClass) that add_node accepts verbatim. Params: query, limit? (default 50), className? (narrow to one owning class), includeGraphNodes? (#808) |
create_interface | Create BP Interface. Params: assetPath |
add_interface | Implement interface. Params: blueprintPath, interfacePath |
override_function | Override an inherited interface implementation (inherited via the parent class) or an overridable parent virtual function, with the matching signature so it actually binds as the override (create_function makes a blank, non-binding graph). Returns kind ('function' with a graphName, or 'event' with a nodeId in EventGraph). Event-shaped functions become override events unless preferFunction=true. Pass interfacePath to also implement the interface first if it is not present. Then wire the body with add_node (use nodeClass='CallParent' to chain to the base implementation). Params: assetPath, functionName, source? ('auto'|'interface'|'parent', advisory), preferFunction?, interfacePath? (#688) |
list_overridable_functions | List functions this Blueprint can override: inherited interface implementations and overridable parent virtuals. Each entry has name, source ('interface'|'parent'), declaringClass, canBeEvent. Params: assetPath (#688) |
list_graphs | List all graphs in a blueprint. Returns selector/objectPath plus duplicateIndex/duplicateCount; pass selector back as graphName for unambiguous nested graph edits. Params: assetPath |
resolve_graph | Resolve a Blueprint graph name to selectors accepted by read_graph/add_node/connect_pins and other graph actions. Duplicate nested AnimBP names such as Locomotion return every match with selectors like Locomotion[3], object paths, and ambiguity metadata. Params: assetPath, graphName |
add_event_dispatcher | Add event dispatcher (multicast delegate variable + signature graph + UFunction). Without parameters, broadcasters fire void(). With parameters, the signature graph gets typed user pins so K2Node_CallDelegate compiles cleanly (#276). Params: blueprintPath, name, parameters?: [(name, type)] where type is bool/int/float/string/name/text/vector/rotator/transform/object:/Script/Module.Class/struct:/Script/Module.Struct |
duplicate | Duplicate blueprint asset. Params: sourcePath, destinationPath |
add_local_variable | Add function-scope local variable. Params: assetPath, functionName, name, varType? (alias: type, default bool) |
list_local_variables | List local variables in a function. Params: assetPath, functionName |
validate | Validate blueprint without saving (compile + collect diagnostics). Params: assetPath |
read_component_properties | Dump ALL UPROPERTYs on a BP component template incl. array contents (#105). Params: assetPath, componentName |
read_node_property | Read a node pin default OR a reflected node property for verification (#102). Params: assetPath, graphName?, nodeName, propertyName |
reparent_component | Reparent an SCS component under a new parent (#115). Params: assetPath, componentName, newParent |
reparent | Change a Blueprint's ParentClass and recompile (#138). Params: assetPath, parentClass (short name or full path) |
flush_ich | Flush orphaned InheritableComponentHandler override records (invalid component-override entries invisible to read/remove_component). Recompiles + saves. Params: assetPath |
set_actor_tick_settings | Set actor CDO tick settings (#116). Params: assetPath, bCanEverTick?, bStartWithTickEnabled?, TickInterval? |
export_nodes_t3d | Export graph nodes as T3D text (Ctrl+C equivalent) for bulk round-trip (#130). Params: assetPath, graphName?, nodeIds? (omit = whole graph) |
import_nodes_t3d | Paste a T3D node blob into a graph (Ctrl+V equivalent) for bulk authoring (#130). Params: assetPath, graphName?, t3d, posX?, posY? |
set_cdo_property | Set UPROPERTY on any C++ class CDO (not just Blueprints). Params: className, propertyName, value (#182/#183) |
get_cdo_properties | Read UPROPERTY values from any C++ class CDO. Params: className, propertyNames? (#183) |
run_construction_script | Spawn temp actor, run construction script, return generated components and transforms. Params: assetPath, location? (#195) |
compile_all | Batch compile + save Blueprints. Params: assetPaths[], save? (default true) |
author | Author a whole Blueprint in one call: optionally create it (parentClass), then add components, variables and function stubs, then compile - one agent-facing action instead of a dozen add_* round-trips. Params: assetPath, parentClass? (create/ensure the BP if given), components? [(componentClass, componentName?, parentComponent?, childActorClass?)], variables? [(name, varType)], functions? [(functionName)], compile? (default true) |
cleanup_graph | Remove orphan/corrupted nodes (no class, blank title+no pins, missing target UFunction). Params: assetPath, graphName? (default: every graph) (#285) |
connect_pins_batch | Apply many pin connections in one call (single compile + save). Params: assetPath, graphName?, connections[]: [(sourceNode, sourcePin, targetNode, targetPin)] (#267) |
set_node_position | Move a graph node to (posX, posY). Params: assetPath, graphName?, nodeId, posX, posY (#277) |
auto_layout | Topological layered layout for a graph. Eliminates the (0,0) stack from programmatic add_node. Params: assetPath, graphName?, columnGap? (default 360), rowGap? (default 200) (#277) |
level
Level actors, selection, components, level management, volumes, lights, and splines.
| Action | Description |
|---|---|
get_outliner | List actors (each row includes editorHidden - hidden in the viewport but still rendering in game). Params: classFilter?, nameFilter?, editorHidden? (filter to only hidden/only visible), world? (editor|pie|auto), limit?, includeStreaming? (#717) |
set_editor_visibility | Bulk set editor-only visibility (temporarily-hidden-in-editor) on actors. Targets actorLabels[] or all=true. Params: hidden (required; true=hide, false=show), actorLabels?, all? (#717) |
place_actor | Spawn actor. Pass world:pie to spawn into the running PIE world (#585). Params: actorClass, label?, location?, rotation?, scale?, staticMesh?, material?, world? (editor|pie) |
delete_actor | Remove actor. Params: actorLabel |
get_actor_details | Inspect actor. Params: actorLabel OR actorPath, includeProperties?, propertyName?, world? (editor|pie) |
move_actor | Transform actor. Pass world:pie to move a live PIE actor (resolves labels/names from get_outliner {world:pie}) (#586). Params: actorLabel, location?, rotation?, scale?, world? (editor|pie) |
aim_actor_at | Rotate an actor so its forward (+X) points at a target. Params: actorLabel, targetPoint (Vec3) OR targetActor (label), roll? (default 0), world? (editor|pie) (#566) |
nav_project_point | Project a world point onto the navmesh. Returns onNavMesh + projectedLocation. Params: point (Vec3), extent? (Vec3, default 100), world? (editor|pie) (#585) |
select | Select actors. Params: actorLabels[] |
get_selected | Get selection |
add_component | Add component to actor. Params: actorLabel, componentClass, componentName? |
remove_component | Remove instance component from a level actor by name. Idempotent: returns alreadyDeleted=true if no matching component exists. Params: actorLabel, componentName (#426) |
set_component_property | Set component prop. Pass value=null to clear a TObjectPtr/SoftObject/WeakObject/UClass/Interface reference (#420). Resolves inherited/SCS components on placed Blueprint instances case-insensitively, and refreshes the scene transform after RelativeLocation/RelativeRotation/RelativeScale3D writes (#539). Pass world='pie' (with optional pieInstance) to write to a LIVE PIE component rather than the editor one (#763). Params: actorLabel, componentName, propertyName, value, world?, pieInstance? |
get_component_details | Read a placed actor's component transforms. With componentName returns that component's relative+world location/rotation/scale, class, and attach parent; without it lists every component. With includeValues=true also dumps arbitrary UPROPERTY values (custom fields, CharacterMovement MaxWalkSpeed, etc.); world='pie' reads the live PIE instance (#539/#584). Params: actorLabel, componentName?, includeValues?, propertyNames? (filter), world? (editor|pie) |
get_current | Get current level name and path |
load | Load level. Params: levelPath |
save | Save current level |
list | List levels. Params: directory?, recursive? |
create | Create new level. Params: levelPath?, templateLevel? |
spawn_volume | Place volume. Params: volumeType, location?, extent?, label? |
list_volumes | List volumes. Params: volumeType? |
set_volume_properties | Edit volume. Params: actorLabel, properties |
spawn_light | Place light. Params: lightType (point|spot|directional|rect|sky), location?, rotation?, intensity?, color? ((r,g,b) 0-255), attenuationRadius? (point/spot/rect only; #723), mobility? (static|stationary|movable; default movable so the light renders without a build), label? (#331/#310) |
set_light_properties | Edit a light OR SkyLight (intensity/color now work on SkyLight too, #608). Params: actorLabel, intensity?, color?, rotation? (DirectionalLight sun angle), mobility? (static|stationary|movable), recaptureSky?, volumetricScatteringIntensity?, sourceRadius? (point/spot), innerConeAngle?/outerConeAngle? (spot) |
set_fog_properties | Edit ExponentialHeightFog incl. volumetric fog (#608). Params: actorLabel?, fogDensity?, fogHeightFalloff?, startDistance?, fogInscatteringColor?, enableVolumetricFog?, volumetricFogScatteringDistribution?, volumetricFogExtinctionScale?, volumetricFogDistance?, volumetricFogAlbedo? |
get_actors_by_class | List actors by class. Matches Blueprint subclasses of a native base via IsChildOf when className resolves to a UClass (short name, /Script path, or BP class path), else falls back to name-substring. Each actor includes location/rotation/scale. Params: className, world? (editor|pie), matchSubclasses? (default true), includeTransforms? (default true) (#675) |
get_actors_by_component_class | List actors that own a component of a given class (exact or substring match). Returns each actor plus its matchedComponents. Params: componentClass, world? (editor|pie) (#582) |
count_actors_by_class | Histogram of actor classes in the level (sorted desc). Params: world? (editor|pie), topN? (#146) |
get_runtime_virtual_texture_summary | List RuntimeVirtualTextureVolume actors + their bound VirtualTexture assets (#150) |
set_water_body_property | Set a property on an actor's WaterBodyComponent (ShapeDilation, WaterLevel, etc.). Params: actorLabel, propertyName, value |
build_lighting | Build lights. Params: quality? |
get_spline_info | Read a spline component's points, closedLoop, length, and per-point tangents/types. Works in editor or PIE (#553). Optional componentName picks a specific (custom) spline; projectPoint (Vec3) returns the closest location, inputKey, distanceAlongSpline, distanceToSpline, and tangent (#555). Params: actorLabel, componentName?, world? (editor|pie), projectPoint? |
set_spline_points | Set spline points. Params: actorLabel, points[], closedLoop? |
set_actor_material | Set material on actor. Params: actorLabel, materialPath, slotIndex? |
get_world_settings | Read world settings (GameMode, KillZ, gravity, etc.) |
set_world_settings | Set world settings. Params: defaultGameMode?, killZ?, globalGravityZ?, enableWorldBoundsChecks? |
get_actor_bounds | Get actor AABB. Params: actorLabel |
get_component_tree | Deep component-tree dump for an actor. Returns per-component: name, class, attachParent, attachSocket, mobility, visibility, relative+world transforms, tags. For PrimitiveComponents adds collisionProfile/collisionEnabled/bounds/castShadow. For StaticMeshComponent adds staticMesh + materials[]. For SkeletalMeshComponent adds skeletalMesh + skeleton + materials[]. For NiagaraComponent adds niagara{asset,active,visible} and for AudioComponent audio{sound,playing} - runtime FX state in PIE (#581). Params: actorLabel | actorPath, world? (editor|pie), componentClass? (substring filter), includeProperties? (dump UPROPERTY name/type/value per component) (#240/#241/#302/#320/#370/#353/#581) |
get_relative_transform | Compute target's transform in reference's local space (location/rotation/scale). Common dungeon/calibration workflow. Params: target (actor label), reference (actor label), world? (#386/#387) |
resolve_actor | Resolve internal/runtime actor name to editor label. Params: internalName (e.g. StaticMeshActor_141) |
set_actor_property | Set per-instance UPROPERTY on a level actor. Params: actorLabel ('WorldSettings' targets the world settings actor), propertyName (dotted paths like 'Foo.Bar' supported), value (string/number/bool/object/array; a label string resolves to an AActor* ref, and a JSON array of labels populates a TArray of actor refs #538), force? (bypass EditDefaultsOnly), world? (editor|pie) (#202/#230) |
read_actor_motion | Snapshot motion telemetry for one or many actors: location, rotation, velocity, scale, angularVelocity (when simulating physics), grounded + distanceToGround (downward 200u trace). Defaults to the PIE world with editor fallback. Loop at your sample interval for long telemetry probes. Params: actorLabel? OR actorLabels (string[]), world? ('pie'|'editor'), pieInstance? (#453) |
add_hismc_instances | Bulk-add transforms to a HISMC / ISMC component on an actor (Python add_instance crashes on UE 5.7; this is the C++ path). Params: actorLabel, componentName? (default: first ISMC/HISMC found), transforms ([(location: (x,y,z), rotation?: (pitch,yaw,roll), scale?: (x,y,z))]), worldSpace? (default true) (#434) |
get_instance_transforms | Read every instance transform on an actor's ISMC/HISMC. Params: actorLabel, componentName? (default first), worldSpace? (default true) |
update_instance_transform | Update a single ISMC/HISMC instance by index; unspecified location/rotation/scale are preserved. Params: actorLabel, componentName?, index, location?, rotation?, scale?, worldSpace? (default true) (#697) |
remove_instance | Remove a single ISMC/HISMC instance by index. Params: actorLabel, componentName?, index (#697) |
set_nanite_settings | Enable/disable + force-build Nanite on a UStaticMesh asset (rebuilds render data immediately, not on next cook). Params: assetPath, enabled? (default true), positionPrecision? (#696) |
get_nanite_info | Read a UStaticMesh's Nanite state (naniteEnabled, positionPrecision, numLODs). Params: assetPath (#696) |
add_post_process_blendable | Add a material blendable (post-process material or MID, e.g. a toon/outline pass) to a PostProcessVolume's WeightedBlendables. Params: actorLabel (the PPV), materialPath, weight? (default 1) (#666) |
export_actor_fbx | Export an actor's skeletal/static mesh to FBX and write a metadata sidecar JSON (actor transform, mesh, materials, skeleton) for a downstream bridge (e.g. MetaTailor). Params: actorLabel, outputPath (.fbx) |
spawn_skeletal_mesh_actor | Spawn a SkeletalMeshActor for visual/deform verification. Optional per-slot materials and single-node animation preview (animSequence + loop). Returns actorLabel + boxExtent. The animSequence is written to the component's editable AnimationData, so it persists across a level save/reload instead of only driving the runtime preview and coming back in A-pose (#790). Params: skeletalMesh, label?, location?, rotation?, scale?, materials? (path[]), animSequence?, loop? (#679/#677) |
delete_actors | Bulk-delete actors. Params: at least one of labelPrefix, className, tag; dryRun? to preview |
delete_exact_labeled_actors_in_levels | Delete actors by EXACT label across several map packages in one call, without leaving the maps open or dirty. Previews by default (dryRun defaults to TRUE, the opposite of delete_actors), and every level is loaded and preflighted before anything is deleted, so a bad label in the last map cannot half-commit the first. Refuses the whole request on duplicate labels, a class that does not match expectedClassPath, actors living in a streaming sublevel, WorldSettings/default brush/level blueprint, World Partition maps, a read-only .umap, or an editor that is already dirty. Saves only the maps it actually changed, then returns to the map that was open. Limits: 16 levels, 256 labels per level. Params: levels[] ((levelPath, actorLabels[], expectedClassPath?)), dryRun? (default true), onMissing? (error|ignore, default error), restoreOriginalLevel? (default true) |
list_actor_descs | World Partition ONLY: list on-disk actor descriptors, including actors whose cell is not loaded and which every other actor query therefore reports as absent. Returns guid/label/class/bounds/runtimeGrid/dataLayers plus a loaded flag, and separate loadedMatches/unloadedMatches counts so 'not streamed in' is distinguishable from 'does not exist'. Needs UE 5.5 or newer. Params: filter? (case-insensitive over label/name/class/path), className?, guids?, bounds? ((min:(x,y,z),max:(x,y,z)) intersection test), loadedOnly?, unloadedOnly?, limit? (default 500) (#746) |
load_actor_descs | World Partition ONLY: pin matched actors so they become resident and the normal actor actions can reach them, or unpin to release. Pinning is used rather than transient streaming because a transient load is dropped again by the streaming system mid-measurement. Takes the same filters as list_actor_descs and refuses to act on more than maxActors (default 256) so an unfiltered call cannot pin a whole map by accident. Reports residentAfter, read back from the world rather than assumed. Needs UE 5.5 or newer. Params: mode? (pin|unpin, default pin), filter?, className?, guids?, bounds?, maxActors?, dryRun? (#746) |
set_actor_folder_path | Assign World Outliner folder paths in bulk. Filter with actorLabels (exact), labelPrefix, className or tag; pass an empty folderPath to move actors back to the root. Runs in one transaction so the whole move is a single undo, reads each write back (verified), and reports missingLabels for names that matched no actor. Editor-only organisation: the level is left dirty and is NOT saved. Params: folderPath, actorLabels?, labelPrefix?, className?, tag?, dryRun?, transactionLabel? (#767) |
add_actor_tag | Append a tag to an actor's Tags array. Params: actorLabel, tag (#219) |
remove_actor_tag | Remove a tag from an actor's Tags array. Params: actorLabel, tag (#219) |
set_actor_tags | Replace an actor's Tags array. Params: actorLabel, tags[] (#219) |
list_actor_tags | List an actor's Tags. Params: actorLabel (#219) |
attach_actor | Attach actor as child. Params: childLabel, parentLabel, attachRule? (KeepWorld|KeepRelative|SnapToTarget; default KeepWorld), socketName? (#205) |
detach_actor | Detach actor from parent. Params: childLabel (#205) |
attach_component | Attach an actor root or exact named child SceneComponent to an actor root or exact named parent SceneComponent. A non-root child changes only component hierarchy, not actor parentage. An already-matching attachment is a no-op and does not reapply transform rules. Returns verified resolved component and socket details; native attachment failure is an error. Params: childLabel, parentLabel, childComponentName? (default child root), parentComponentName? (default parent root), socketName?, attachRule? (KeepWorld|KeepRelative|SnapToTarget; default KeepWorld), weldSimulatedBodies? (default false) |
detach_component | Detach an actor root or exact named child SceneComponent while preserving world transform. Omitted childComponentName selects the actor root. An already-detached component is a verified no-op. Returns previous parent component/socket details plus alreadyDetached and detachmentChanged. Params: childLabel, childComponentName? |
set_actor_mobility | Set actor root component Mobility. Params: actorLabel, mobility (static|stationary|movable) (#205) |
get_current_edit_level | Read the active edit-target sub-level (#204) |
set_current_edit_level | Set the active edit-target sub-level so subsequent spawns land in it. Params: levelName (e.g. SubLevel_A) (#204) |
list_streaming_sublevels | List streaming sub-levels with transform + initially-loaded/visible flags (#206) |
add_streaming_sublevel | Add a streaming sub-level. Params: levelPath, streamingClass? (LevelStreamingDynamic|LevelStreamingAlwaysLoaded), location?, initiallyLoaded?, initiallyVisible? (#206) |
remove_streaming_sublevel | Remove a streaming sub-level. Params: levelName | levelPath (#206) |
set_streaming_sublevel_properties | Update sub-level transform/visibility flags. Params: levelName | levelPath, location?, initiallyLoaded?, initiallyVisible?, editorVisible? (#206) |
spawn_grid | Batch-spawn StaticMeshActors on a grid. Params: staticMesh, min, max (Vec3 bounds), countX?, countY?, countZ?, jitter?, labelPrefix? (#203) |
batch_translate | Translate a set of actors by an offset. Params: offset (Vec3), actorLabels[] OR tag (#203) |
place_actors_batch | Bulk-spawn StaticMeshActors with per-instance mesh + transform. Params: actors[]: [(staticMesh, location?, rotation?, scale?, label?)] |
line_trace | Line trace in the editor world. Traces simple collision by default, the same as a gameplay trace, so the result matches what the running game hits; pass traceComplex to trace per-triangle instead. channel picks the collision channel, including channels this project renamed in its collision settings. The response echoes traceComplex and channel, and faceIndex is only present on a complex hit. Returns hit + actorLabel/actorClass/componentName/componentClass/location/impactPoint/normal/distance/faceIndex/boneName/physicalMaterial. Params: start (Vec3), end? (Vec3) OR direction? (Vec3) + distance? (default 200000), traceComplex? (default false), channel? (default Visibility), ignoreActors? (array of labels) (#420, #807) |
snap_actor_to_floor | Snap an actor's bounds-bottom to the first downward line-trace hit. Equivalent of the End-key shortcut, works on arbitrary geometry (not just Landscape). Params: actorLabel, floorOffset? (added to impact Z, default 0), maxDistance? (default 100000) (#419) |
material
Materials: create, read, parameters, shading, textures, and graph authoring (expression nodes, connections).
| Action | Description |
|---|---|
read | Read material structure. Params: assetPath |
list_parameters | List overridable parameters. Params: assetPath |
set_parameter | Set parameter on MaterialInstance. Params: assetPath, parameterName, parameterType, value |
read_instance | Read a MaterialInstanceConstant parent and override summary. Params: assetPath |
set_instance_parent | Set a MaterialInstanceConstant parent. Params: assetPath, newParentPath (or parentPath) |
batch_set_instances | Batch reparent + reassign parameters across many Material Instances in one call. Params: instances[] = [(assetPath, parentPath?, parameters?:[(name, type (scalar|vector|texture), value)])] |
clear_instance_parameters | Clear all MaterialInstanceConstant parameter overrides. Params: assetPath |
list_static_switches | List static switch parameters on a Material or MaterialInstance. Params: assetPath |
set_static_switch | Set a MaterialInstanceConstant static switch parameter. Params: assetPath, parameterName, value, association?, parameterIndex? |
set_expression_value | Set a value on an expression node. Common typed knobs: value (constant/param default), texturePath (TextureSample/TextureSampleParameter2D default texture). For any OTHER UPROPERTY on the expression (e.g. SamplerType, SamplerSource, Group), pass propertyName + value to hit the generic reflection setter. Params: materialPath, expressionIndex, value?, texturePath?, propertyName? (#663) |
set_custom_expression | Read/write a MaterialExpressionCustom (HLSL) node: code, named inputs[] (rebuilds input pins; wire them with connect_expressions targetInput=<name>), outputType (float1|float2|float3|float4|materialAttributes), description. Omit code/inputs to read. Add the node first via add_expression expressionType=Custom. Params: materialPath, expressionIndex, code?, inputs?, outputType?, description? (#617) |
disconnect_property | Disconnect a material property input. Params: materialPath, property |
create_instance | Create material instance. Params: parentPath, name?, packagePath? |
create | Create material. Params: name, packagePath? |
create_function | Create a MaterialFunction asset. Params: name, packagePath? (default /Game/Materials/Functions), description? (#463) |
add_function_expression | Add an expression node to a MaterialFunction graph. Params: functionPath, expressionType (e.g. Constant3Vector, FunctionInput, FunctionOutput, If), positionX?, positionY?, inputName? (for FunctionInput), inputType? (Scalar|Vector2|Vector3|Vector4|Texture2D|TextureCube|StaticBool|MaterialAttributes), outputName? (for FunctionOutput) (#463) |
connect_function_expressions | Wire two expressions inside a MaterialFunction. Params: functionPath, sourceExpression (name or index), sourceOutput?, targetExpression (name or index), targetInput? (#463) |
list_function_expressions | List expression nodes inside a MaterialFunction. Params: functionPath (#463) |
create_simple | Single-call simple material. Params: name, packagePath?, baseColor? ((r,g,b)), metallic?, specular?, roughness?, emissive?, usages?[] (e.g. InstancedStaticMeshes, Nanite, NiagaraSprites) |
set_usage | Set EMaterialUsage flag(s) on a material. Params: assetPath, usage OR usages[], enabled? (default true) |
set_shading_model | Set shading model. Params: assetPath, shadingModel |
set_blend_mode | Set blend mode. Params: assetPath, blendMode |
set_domain | Set material domain. Params: assetPath, materialDomain (Surface | DeferredDecal | LightFunction | Volume | PostProcess | UI | RuntimeVirtualTexture) |
set_base_color | Set base color. Params: assetPath, color |
connect_texture | Connect texture to property. Params: materialPath, texturePath, property |
add_expression | Add expression node. Params: materialPath, expressionType, name?, parameterName?, group?, sortPriority?, defaultValue? (scalar number or (r,g,b,a) for vector params), value? (number for Constant, (r,g,b) for Constant3Vector, (x,y) for Constant2Vector), channels? ((r,g,b,a) bools for ComponentMask), positionX?, positionY? (#318) |
connect_expressions | Wire two expressions. Params: materialPath, sourceExpression, sourceOutput?, targetExpression, targetInput? |
connect_to_property | Wire expression to material output. Params: materialPath, expressionName, outputName?, property |
list_expressions | List expression nodes. Params: materialPath |
delete_expression | Remove expression. Params: materialPath, expressionName |
list_expression_types | List available expression types |
recompile | Recompile material. Pass recompileChildren=true to cascade to every MaterialInstanceConstant whose parent chain reaches this material (#421). Params: materialPath, recompileChildren? |
duplicate | Duplicate material asset. Params: sourcePath, destinationPath |
validate | Validate material graph - find orphans, broken refs. Params: assetPath |
get_shader_stats | Shader compile stats, sampler+param counts. Params: assetPath |
export_graph | Export material graph as JSON. Params: assetPath |
import_graph | Rebuild graph from JSON. Params: assetPath, nodes, propertyConnections? |
build_graph | Build graph from spec. Params: assetPath, nodes, propertyConnections? |
render_preview | Render preview PNG. Params: assetPath, outputPath, width?, height? |
begin_transaction | Begin undo transaction. Params: label? |
end_transaction | End undo transaction |
animation
Animation assets, skeletons, montages, blendspaces, anim blueprints, physics assets.
| Action | Description |
|---|---|
read_anim_blueprint | Read AnimBP structure. Params: assetPath |
read_montage | Read montage. Params: assetPath |
read_sequence | Read anim sequence. Params: assetPath |
scan_animation_tracks | Scan AnimSequence bone-track counts. Params: directory?, recursive?, assetPaths?, skeletonPath?, targetTrackCount?, includeTrackNames? |
read_blendspace | Read blendspace. Params: assetPath |
add_blend_sample | Append a sample to a BlendSpace. Params: assetPath, animation (AnimSequence path), position (x,y) (or flat x,y) (#248) |
set_blend_sample | Move an existing BlendSpace sample or swap its animation. Params: assetPath, sampleIndex, position? (x,y) (or flat x,y), animation? (#272) |
list | List anim assets. Params: directory?, recursive? |
create_montage | Create montage. Params: animSequencePath, name?, packagePath? |
author_montages_batch | Batch-author montages in one call: idempotent create, slot name, blend/rate/length properties, sections and notifies, then save. Every item reports success plus the failing stage (validate|create|slot|properties|sections|notifies|save) and error, so one bad item does not hide the rest. Newly created montages come back as a delete_asset_batch rollback. Each montage still holds the single segment create_montage builds. Params: items[] (each: name, animSequencePath, packagePath?, onConflict?, slotName?, trackIndex?, rateScale?, blendIn?, blendOut?, sequenceLength?, sections? [(sectionName, startTime?, linkedSection?)], notifies? [(notifyName, triggerTime, notifyClass?, properties?)]) |
create_anim_blueprint | Create AnimBP. Params: skeletonPath, name?, packagePath?, parentClass? |
create_blendspace | Create blendspace (2D). Params: skeletonPath, name?, packagePath?, axisHorizontal?, axisVertical? |
create_blendspace_1d | Create BlendSpace1D. Params: skeletonPath, name?, packagePath?, axisName? (default Speed), axisMin?, axisMax?, gridNum? (#459) |
populate_blendspace | One-call axis params + samples authoring for BlendSpace 1D/2D. Params: assetPath, axis? ((name?, min?, max?, gridNum?)) for axis 0, blendspaceAxes? (per-axis array), axisHorizontal?/axisVertical? + horizontalMin/horizontalMax/verticalMin/verticalMax/gridNumHorizontal/gridNumVertical (back-compat), samples ([(animationPath, x, y?)]), clearExisting? (default true) (#459) |
add_notify | Add notify. For PlayMontageNotify the notifyName is also written onto the spawned notify object so OnPlayMontageNotifyBegin broadcasts it (not 'None'), and montage branching-point markers refresh (#528). notifyProperties writes EditAnywhere fields onto the spawned notify object and therefore requires a notifyClass that resolves. Params: assetPath, notifyName, triggerTime, notifyClass?, notifyProperties? |
remove_notify | Remove notify(s) by name and/or class. Pass at least one of notifyName/notifyClass; both filters AND. Idempotent: alreadyDeleted=true if no match. Params: assetPath, notifyName?, notifyClass? (#471) |
get_skeleton_info | Read skeleton. Params: assetPath |
list_sockets | List sockets. Params: assetPath |
list_skeletal_meshes | List skeletal meshes. Params: directory?, recursive? |
get_physics_asset | Read physics asset. Params: assetPath |
create_sequence | Create blank AnimSequence. Params: name, skeletonPath, packagePath?, numFrames?, frameRate? |
set_bone_keyframes | Set bone transform keyframes. Params: assetPath, boneName, keyframes |
bake_keyframes_batch | Bake per-bone keyframe arrays for many bones into an AnimSequence in one call. Auto-creates each bone track first (set_bone_keyframes silently leaves a T-pose if the track is missing), wraps the batch in one transaction, and raises if any bone fails instead of reporting hollow success (#540). Params: assetPath, tracks ([(bone, keyframes:[(location,rotation(x,y,z,w),scale?)])]), save? (default true) |
get_bone_transforms | Read reference pose transforms for one, many, or ALL bones. Omit boneNames to return every bone with index/parentIndex/location/rotation/scale. With boneNames, returns only the named bones. Params: skeletonPath, boneNames? (omit = all bones), space? ('local' default, or 'component' for composed parent-chain transforms - retarget-chain / anatomical-scale work) (#245) |
inspect_anim_nodes | Deep-dump the FAnimNode_* struct of anim graph nodes (PoseDriver PoseTargets/PoseAsset/RBF params/source bones, etc.) that read_anim_graph omits because it skips the 'Node' property. Params: assetPath, graphName? (default AnimGraph), nodeClass? (substring filter, e.g. 'PoseDriver') (#657) |
compare_curves_to_morph_targets | Compare an AnimSequence/PoseAsset's curve names against a SkeletalMesh's morph target names. Returns curves[], morphTargets[], matched[], curvesWithoutMorph[], morphsWithoutCurve[] - verify authored curves drive morphs without Python. Params: animPath (AnimSequence or PoseAsset), skeletalMeshPath (#656) |
set_montage_sequence | Replace the animation sequence in a montage slot. With segmentIndex, replaces only that one segment; without it, replaces every segment in the slot. Params: assetPath, animSequencePath, slotIndex? (default 0), segmentIndex? (#626) |
set_montage_properties | Set montage properties. Params: assetPath, sequenceLength?, rateScale?, blendIn?, blendOut? |
create_state_machine | Create state machine in AnimBP. Params: assetPath, name?, graphName? |
add_state | Add state to a state machine. Params: assetPath, stateMachineName, stateName |
add_transition | Add directed transition between states. Params: assetPath, stateMachineName, fromState, toState |
set_state_animation | Assign anim asset to state. Params: assetPath, stateMachineName, stateName, animAssetPath |
set_transition_blend | Set blend type/duration on transition. Params: assetPath, stateMachineName, fromState, toState, blendDuration?, blendLogic? |
set_transition_condition | Set a transition's 'can enter transition' condition from a bool variable, keyed by transition (not graph name - every rule graph is named 'Transition' so blueprint graph tools can only reach the first). Wires VariableGet(bool) -> bCanEnterTransition, replacing any prior condition. Identify the transition by transitionGuid (from add_transition/read_state_machine) OR fromState+toState. Params: assetPath, stateMachineName, variableName (existing bool var), transitionGuid? OR fromState?+toState?, negate? (default false) (#707) |
read_state_machine | Read state machine topology. Params: assetPath, stateMachineName |
read_anim_graph | Read AnimBP AnimGraph nodes with properties & pins. Params: assetPath, graphName? |
add_curve | Add float curve to AnimSequence. Params: assetPath, curveName, curveType? |
set_anim_curve_keys | Set float-curve key VALUES on an AnimSequence (add_curve only creates an empty named curve - it cannot set keyframe values). Adds the curve if missing, then replaces its keys. Use for authoring Distance/Speed/any float curve directly. Params: assetPath, curveName, keys ([(time, value, interp?('linear'|'constant'|'cubic'))]), interpolation? (default 'linear', applied to keys without their own interp) (#712) |
apply_animation_modifier | Instantiate a UAnimationModifier subclass and run it on an AnimSequence. Headline use: modifierClass='DistanceCurveModifier' bakes a Distance curve from the clip's root motion for distance matching (needs root motion baked first - see bake_root_motion_from_bone). Registers the modifier on the sequence so it re-applies on reimport. props sets the modifier's EditAnywhere fields (e.g. DistanceCurveModifier: {CurveName, Axis:'XY'|'X'|..., bStopAtEnd, StopSpeedThreshold, SampleRate}). Note: DistanceCurveModifier ships in the 'Animation Locomotion Library' plugin (off by default) - enable it first. Params: assetPath, modifierClass (short name or /Script path), props? (#712) |
set_montage_slot | Set slot name on a montage track. Params: assetPath, slotName, trackIndex? |
add_montage_section | Add composite section to montage. Pass segmentIndex (with slotName or slotIndex) to anchor the section to a specific segment: its startTime is taken from that segment and it stays linked, so inserting a segment ahead of it moves the marker with its animation. Without segmentIndex the section is a bare absolute-time marker. Params: assetPath, sectionName, startTime?, linkedSection?, segmentIndex?, slotName?, slotIndex? (#826) |
add_montage_segment | Append (or insert) an animation segment into a montage slot's anim track. This is the only way to get more than one animation into a montage: create_montage builds exactly one segment, set_montage_sequence replaces rather than appends, and add_montage_section only writes a time marker with no animation behind it. Creates the named slot when it does not exist. Validates that the source shares the montage's skeleton and matches the track's additive type, then relays out the segments, refreshes linked sections and notifies, and rewrites the montage length. Params: assetPath, animSequencePath, slotName? (created if absent), slotIndex? (default 0, used when slotName is omitted), startPos? (trim into the source, default 0), endPos? (default source play length), playRate? (default 1, negative reverses), loopCount? (default 1), insertIndex? (default appends) (#826) |
remove_montage_segment | Remove a segment from a montage slot by index, then relay out the remaining segments and rewrite the montage length. Idempotent: alreadyDeleted=true when the slot already holds no segments. Params: assetPath, segmentIndex, slotName?, slotIndex? (default 0) (#826) |
list_montage_segments | List every slot's segments on a montage so a caller can address them by index: animation path, startPos/endPos trim, playRate, loopCount, track position and length per segment, plus the sections with the slot and segment each one links to. Params: assetPath, slotName? (filter to one slot) (#826) |
create_ik_rig | Create IKRigDefinition asset, optionally with retargetRoot + chains[]. Params: name, skeletalMeshPath, packagePath?, retargetRoot?, chains?: [(name, startBone, endBone, goal?)] |
read_ik_rig | Read IK Rig chains, solvers, skeleton. Params: assetPath |
list_control_rig_variables | List ControlRig variables and hierarchy. Params: assetPath |
read_control_rig_graph | Read a Control Rig's RigVM models: every graph with its nodes (name, node path, class), each node's pins (name, pin path, cppType, direction, execute flag, default value, nested sub-pins) and the links between them, plus full member-variable metadata (type, subtype, array-ness, default, public/read-only). list_control_rig_variables only ever reported a node COUNT, which is not enough to verify solver wiring (#774). Params: assetPath, graphName? (substring filter), includePins? (default true), includeDefaults? (default true), includeLinks? (default true), limit? (nodes per graph, default 200) |
read_control_rig_hierarchy | Read a Control Rig's per-element hierarchy metadata: each element's name, type (Bone|Control|Null|Curve...), index, and parent. Params: assetPath (#619) |
set_root_motion | Set root motion settings on AnimSequence. Params: assetPath, enableRootMotion?, forceRootLock?, useNormalizedRootMotionScale?, rootMotionRootLock? |
add_virtual_bone | Add virtual bone. Params: skeletonPath, sourceBone, targetBone |
remove_virtual_bone | Remove virtual bone. Params: skeletonPath, virtualBoneName |
create_composite | Create AnimComposite. Params: name, skeletonPath, packagePath? |
list_modifiers | List applied animation modifiers. Params: assetPath |
create_ik_retargeter | Create IKRetargeter asset and (default) initialize the UE 5.7 ops stack: assigns sourceRig+targetRig to all ops, runs AutoMapChains. Returns chainsMapped count. Params: name, packagePath?, sourceRig?, targetRig?, autoMapChains? (default true) (#246) |
read_ik_retargeter | Read IKRetargeter: source/target rigs and chain mappings. Params: assetPath (#246) |
set_ik_rig_mesh | Set the preview/source skeletal mesh on an EXISTING IK Rig. Params: rigPath, meshPath (#701) |
set_ik_retargeter_rig | Set the source or target IK Rig on an EXISTING IK Retargeter. Params: retargeterPath, rigPath, side? (source|target, default target) (#703) |
auto_align_retarget_pose | Auto-align all bones of the source/target retarget pose (chain-to-chain) - fixes a retargeter that outputs a static reference pose. Params: retargeterPath, side? (source|target, default target) (#701) |
reset_retarget_pose | Reset the current retarget pose (all bones) to the reference pose. Params: retargeterPath, side? (source|target, default target) (#701) |
batch_retarget_animations | Bake a set of source AnimSequences onto the target skeleton through an IK Retargeter (RunBatchRetarget). Params: retargeterPath, sourceMesh, targetMesh, animPaths[], outputPath? (default: alongside source), prefix?, suffix? (default _Retargeted), overwrite? (#701) |
set_anim_blueprint_skeleton | Set target skeleton on AnimBP. Params: assetPath, skeletonPath |
read_bone_track | Read bone transform samples from AnimSequence. Params: assetPath, boneName, frames?: [int] |
create_pose_search_database | Create a PoseSearchDatabase asset (motion matching). Params: name, packagePath?, schemaPath? |
set_pose_search_schema | Set the Schema on an existing PoseSearchDatabase. Params: assetPath, schemaPath |
add_pose_search_sequence | Append an AnimSequence/AnimComposite/AnimMontage/BlendSpace to a PoseSearchDatabase, with optional per-clip flags. Params: assetPath, sequencePath, mirror? ('original'|'mirrored'|'both'), disableReselection?, sampleStart?, sampleEnd?, enabled? (#684) |
set_pose_search_clips | Author the whole clip list of a PoseSearchDatabase in one call (the 'duplicate a stock PSD, swap its clips' pipeline step). Replaces the list by default. Each clip carries per-entry flags. Params: assetPath, clips ([(sequencePath, mirror? ('original'|'mirrored'|'both'), disableReselection?, sampleStart?, sampleEnd?, enabled?)] - a bare string path also works), clearExisting? (default true) |
build_pose_search_index | Build (or rebuild) the search index. Params: assetPath, wait? (default true) |
read_pose_search_database | Inspect a PoseSearchDatabase: schema, animation entries, cost biases, tags. Params: assetPath |
set_pose_search_database_settings | Tune a PoseSearchDatabase: cost biases, KD-tree neighbours, search mode, PCA components, normalization set. Params: assetPath, continuingPoseCostBias?, baseCostBias?, loopingCostBias?, kdTreeQueryNumNeighbors?, numberOfPrincipalComponents?, poseSearchMode? ('bruteforce'|'pcakdtree'|'vptree'|'eventonly'), normalizationSetPath? (motion matching) |
create_pose_search_schema | Create a PoseSearchSchema (the feature definition a database indexes against). Binds a skeleton (and optional mirror table) and, by default, adds Trajectory+Pose default channels so the schema is immediately buildable. Refine with add_pose_search_schema_*_channel. Params: name, skeletonPath, packagePath?, mirrorDataTablePath?, sampleRate?, addDefaultChannels? (default true) (motion matching) |
add_pose_search_schema_pose_channel | Add a Pose feature channel to a schema (samples named bones for velocity/position/rotation/phase). Params: schemaPath, bones ([(bone, flags?:['velocity','position','rotation','phase'], weight?)] - a bare bone-name string defaults to position), weight? (motion matching) |
add_pose_search_schema_trajectory_channel | Add a Trajectory feature channel to a schema (past/future motion samples). Params: schemaPath, samples ([(offset (seconds; negative=history, positive=prediction), flags?:['position','velocity','facingDirection','velocityDirection', ...XY variants], weight?)]), weight? (motion matching) |
read_pose_search_schema | Inspect a PoseSearchSchema: skeleton(s), mirror table, sample rate, feature channels. Params: schemaPath (motion matching) |
create_mirror_data_table | Create a MirrorDataTable for a skeleton (needed for mirrored poses in motion matching / mirror nodes). Auto-derives bone-pair rows from find/replace expressions (defaults to UE mannequin _l/_r suffix swap). Params: name, skeletonPath, packagePath?, expressions? ([(find, replace, method?:'suffix'|'prefix'|'regex')]), mirrorAxis? (X|Y|Z, default X), mirrorRootMotion? (default true) |
read_mirror_data_table | Inspect a MirrorDataTable: skeleton and bone-pair rows (name -> mirroredName). Params: assetPath (motion matching) |
create_pose_search_normalization_set | Create a PoseSearchNormalizationSet grouping databases so they normalize their cost space together (consistent blending across a locomotion set). Assign it via set_pose_search_database_settings(normalizationSetPath). Params: name, packagePath?, databases? ([PoseSearchDatabase paths]) (motion matching) |
add_motion_matching_node | Add a Motion Matching node to an AnimBP AnimGraph and point it at a PoseSearchDatabase (the runtime node that searches the database each frame). Connects its output to the Output Pose by default. For chooser-driven database selection, bind an anim-node function that calls SetDatabasesToSearch. Params: assetPath (AnimBP), databasePath, graphName? (default AnimGraph), connectToOutput? (default true), blendTime? (motion matching) |
add_pose_history_node | Add a Pose History (PoseSearchHistoryCollector) node to an AnimBP AnimGraph - the Motion Matching node needs it in the graph to query pose/trajectory history. Defaults to self-generated trajectory (no external trajectory pin needed) and inserts itself into the pose chain feeding the Output Pose. Params: assetPath (AnimBP), graphName? (default AnimGraph), poseCount?, samplingInterval?, generateTrajectory? (default true), trajectoryHistoryCount?, trajectoryPredictionCount?, insertBeforeOutput? (default true) (motion matching) |
set_motion_matching_chooser | Drive the Motion Matching node's Database from a ChooserTable so the database is selected at runtime by character state. Wires a thread-safe EvaluateChooser (result typed to PoseSearchDatabase) into the MM node's Database pin. contextSource selects what the chooser reads its columns from: 'self' (default, the anim instance - choosers branching on AnimBP variables) or 'pawn' (the owning pawn via TryGetPawnOwner - choosers branching on character/pawn state). Params: assetPath (AnimBP), chooserPath (ChooserTable), graphName? (default AnimGraph), contextSource? ('self'|'pawn') (motion matching) |
add_sequence_evaluator | Add a Sequence Evaluator node (explicit-time player) to an AnimBP graph - the node distance matching drives by setting its ExplicitTime each frame. graphName can be the top-level AnimGraph or a state's inner graph (pass the state name). Defaults bTeleportToExplicitTime=false so time advances and root motion extracts. Connects to the Output Pose by default. Returns nodeGuid for bind_anim_node_function. Params: assetPath (AnimBP), sequencePath? (AnimSequence to evaluate), graphName? (default AnimGraph), explicitTime?, shouldLoop?, teleportToExplicitTime? (default false), connectToOutput? (default true) (#713) |
bind_anim_node_function | Bind a thread-safe anim-node function to an anim graph node's update slot - the mechanism distance matching uses to advance a Sequence Evaluator's explicit time each frame (function calls AnimDistanceMatchingLibrary::DistanceMatchToTarget / AdvanceTimeByDistanceMatching). The function must already exist on the AnimBP (create it as a BlueprintThreadSafe function first). Identify the node by nodeGuid (from add_sequence_evaluator / add_*_node). Params: assetPath (AnimBP), nodeGuid, functionName, graphName? (default AnimGraph), binding? ('update' (default)|'becomeRelevant'|'initialUpdate') (#713) |
set_sequence_properties | Batch-set properties on AnimSequence assets. If a path is a Montage and resolveFromMontages is true (default), resolves to its first AnimSequence. Params: assetPaths[], properties(enableRootMotion?, forceRootLock?, useNormalizedRootMotionScale?, rootMotionRootLock?), resolveFromMontages? |
bake_root_motion_from_bone | Bake delta translation from a source bone (e.g. pelvis) onto the root bone across the whole sequence; compensates the source bone so world-space position is unchanged. Params: assetPath, sourceBone, rootBone? (default 'root'), axes? (default ['x','y']), interpolation? ('linear'|'per_frame', default 'linear') |
get_bone_transform | Read a bone or socket transform on a live actor's SkeletalMeshComponent. Wraps GetBoneTransform / GetSocketTransform. Params: actorLabel, boneName (or socket name), componentName? (default: CharacterMesh0 / Mesh / first SK component), world? (auto|pie|game|editor, default auto), space? (world|component|local, default world) |
list_bones | List bones in a live actor's SkeletalMeshComponent ref skeleton (name, index, parent). Params: actorLabel, componentName?, world? (auto|pie|game|editor, default auto) (#420) |
rebind_leader_pose | Re-bind every secondary SkeletalMeshComponent on an actor to a body component (default CharacterMesh0 / Mesh). One-call fix for the 'character explodes after rotating the actor' failure mode. Params: actorLabel, bodyComponent? (#419) |
preview_animation | Toggle bUpdateAnimationInEditor + VisibilityBasedAnimTickOption=AlwaysTickPoseAndRefreshBones on every SkeletalMeshComponent of an actor. Bypasses the 'cannot be edited on templates' guard for level instances. Params: actorLabel, enabled (#419/#420) |
landscape
Landscape terrain: info, layers, sculpting, weight painting, materials, splines, proxies.
| Action | Description |
|---|---|
get_info | Get landscape setup |
list_layers | List paint layers |
sample | Sample height/layers. Params: x, y |
sculpt | Raise, lower or flatten terrain with a circular brush. mode=raise|lower|flatten; amount is world centimetres at full strength (raise/lower), and flatten pulls toward the height under the brush centre. falloff (0..1) is the smoothstepped soft edge. Runs in one transaction and leaves the level dirty and unsaved. Writes into an edit layer (editLayer by name, else editLayerIndex, default 0) - required on UE 5.8, where a write without one is regenerated away by the layer system. Params: center ((x,y) world space), radius (default 500), mode? (default raise), amount? (default 100), falloff? (default 0.5), actorLabel?, editLayer?, editLayerIndex?, maxVertices? (#742) |
paint_layer | Paint a weight layer with a circular brush. The layer must already have a LayerInfo on this landscape (see add_layer_info) - an unregistered name errors and lists the layers that ARE registered instead of silently painting nothing. Weights are written as given - the engine no longer renormalises other layers for you, so set them explicitly if they must sum to 1. Writes into an edit layer (editLayer by name, else editLayerIndex, default 0). Params: layerName, center ((x,y) world space), radius (default 500), strength? (0..1, default 1), falloff? (default 0.5), actorLabel?, editLayer?, editLayerIndex?, maxVertices? (#742) |
list_splines | Read landscape splines |
get_component | Inspect component. Params: componentIndex |
set_material | Set landscape material. Params: materialPath |
add_layer_info | Register paint layer (creates LayerInfo asset + binds to active landscape). Params: layerName, packagePath? |
create_layer_info | Standalone LayerInfo asset creation - no landscape required. Params: layerName, name? (default LI_[layerName]), packagePath? (default /Game/Landscape/LayerInfos), physMaterial? (asset path), hardness? (#251) |
create | Spawn a new ALandscape with a flat heightmap. Defaults match the Editor's Landscape Mode 'create new' (8x8 components, 63 quads/subsection, 2 subsections/component = 1016x1016 quads). Params: location? (Vec3), scale? (Vec3, default 100,100,100), componentCountX? (default 8), componentCountY? (default 8), subsectionSizeQuads? (one of 7|15|31|63|127|255, default 63), numSubsections? (1|2, default 2), heightOffset? (uint16, default 32768 = mid-elevation), label? (#303) |
get_material_usage_summary | Per-proxy summary: landscape/hole material paths + component/grass/nanite counts (#150) |
list_proxies | Enumerate loaded World Partition LandscapeStreamingProxy actors with per-proxy worldBounds (origin/extent), plus loadedProxies + parentLandscapes counts. Unloaded proxies are not spawned as actors, so only loaded ones appear - use this to confirm a proxy is streamed in before trusting a layer/height readback (#733) |
find_proxy_at | Resolve which loaded LandscapeStreamingProxy covers a world X/Y. Returns found/loaded + label, or loaded:false when the covering proxy is streamed out (so a 0-weight readback there is ambiguous, not real). Params: worldX, worldY (#733) |
pcg
Procedural Content Generation: graphs, nodes, connections, execution, volumes.
| Action | Description |
|---|---|
list_graphs | List PCG graphs. Params: directory?, recursive? |
read_graph | Read graph structure. Params: assetPath |
read_node_settings | Read node settings. Params: assetPath, nodeName |
get_components | List PCG components in level |
get_component_details | Inspect PCG component. Params: actorLabel |
create_graph | Create graph. Params: name, packagePath? |
add_node | Add node. Params: assetPath, nodeType, nodeName? |
connect_nodes | Wire nodes. Params: assetPath, sourceNode, sourcePin, targetNode, targetPin |
disconnect_nodes | Remove a wired edge between two PCG nodes. Params: assetPath, sourceNode, targetNode, sourcePin? (default: any), targetPin? (default: any) |
set_node_settings | Set node params. Params: assetPath, nodeName, settings |
set_static_mesh_spawner_meshes | Populate weighted MeshEntries on a PCGStaticMeshSpawner node (#145). Params: assetPath, nodeName, entries=[(mesh, weight?)], replace? (default true) |
remove_node | Remove node. Params: assetPath, nodeName |
execute | Regenerate PCG. Params: actorLabel |
force_regenerate | Force a stuck PCG component to regenerate (clears graph ref, re-sets, cleanup+generate). Params: actorLabel (#146) |
cleanup | Cleanup a PCG component (remove spawned content). Params: actorLabel, removeComponents? (default true) (#146) |
toggle_graph | Toggle a PCG component's graph assignment to force reinit (no generate). Params: actorLabel, graphPath? (#146) |
add_volume | Place PCG volume. Params: graphPath, location?, extent? |
import_graph | Bulk-author a PCG graph from JSON. Params: assetPath, nodes=[(name,class,posX?,posY?,settings?)], connections=[(from,fromPin?,to,toPin?)], replace? (default false) |
export_graph | Export a PCG graph as JSON. Params: assetPath, includeSettings? (default true) |
foliage
Foliage painting, types, sampling, and settings.
| Action | Description |
|---|---|
list_types | List foliage types in level |
get_settings | Read foliage type settings. Params: foliageTypeName |
sample | Query instances in region. Params: center, radius, foliageType? |
create_type | Create foliage type from mesh. Params: meshPath, name?, packagePath? |
set_settings | Modify type settings. Params: foliageTypeName, settings |
niagara
Niagara VFX: systems, emitters, spawning, parameters, and graph authoring.
| Action | Description |
|---|---|
list | List Niagara assets. Params: directory?, recursive? |
get_info | Inspect system. Params: assetPath |
validate | Verify gate: does this system actually emit? Reports per emitter whether it is enabled and has a spawn module + an enabled renderer. valid=false means empty shell. Params: systemPath |
spawn | Spawn VFX as a transient component (GC's before offscreen capture). For a findable preview use spawn_actor. Params: systemPath, location, rotation?, label? |
spawn_actor | Spawn a PERSISTENT, labeled NiagaraActor in the editor world (findable, re-activatable, survives capture - unlike spawn). Assigns the system and activates. Params: systemPath, location?, rotation?, label?, activate? (default true) (#537) |
reactivate | Reset + reactivate the NiagaraComponent on a placed actor (replay a burst before capturing). Params: actorLabel (#537) |
set_parameter | Set parameter. Params: actorLabel, parameterName, value, parameterType? |
create | Create system. Params: name, packagePath? |
create_emitter | Create a Niagara emitter asset. templatePath copies an existing emitter as the starting point (the content browser's create-from-template path); omit it for the default empty emitter with the standard modules and a sprite renderer. inherit=true makes it a child that tracks the template instead, which then refuses local edits to inherited modules. Params: name, packagePath?, templatePath?, inherit? (default false), onConflict? |
add_emitter | Add emitter to system. Params: systemPath, emitterPath |
remove_emitter | Remove an emitter from a system (CRUD delete). Params: systemPath, emitterName? or emitterIndex? |
list_emitters | List emitters in system. Params: systemPath |
set_emitter_property | Set emitter property. Params: systemPath, emitterName?, propertyName, value |
list_modules | List Niagara modules. Params: directory? |
get_emitter_info | Inspect emitter. Params: assetPath |
list_renderers | List renderers on an emitter. Params: systemPath, emitterName?, emitterIndex? |
add_renderer | Add renderer (sprite/mesh/ribbon or full class). Params: systemPath, rendererType, emitterName?, emitterIndex? |
remove_renderer | Remove renderer by index. Params: systemPath, rendererIndex, emitterName?, emitterIndex? |
set_renderer_property | Set any renderer property. Bools, numbers and strings are taken directly; object properties (a sprite/mesh renderer's Material, the mesh on a mesh renderer) take an asset path and are class-checked; structs, enums, names and arrays go through the shared JSON property setter, so there is no longer a type whitelist to fall off (#783). Params: systemPath, rendererIndex, propertyName, value, emitterName?, emitterIndex? |
inspect_data_interfaces | List user-scope data interfaces. Params: systemPath |
create_system_from_spec | Declaratively create a system + emitters. Params: name, packagePath?, emitters?:[(path)] |
get_compiled_hlsl | Read GPU compute script info for an emitter. Params: systemPath, emitterName?, emitterIndex? |
list_system_parameters | List user-exposed system parameters. Params: systemPath |
list_module_inputs | List an emitter's modules with the inputs you can actually SET - Spawn Rate, Lifetime, Colour, Sprite Size - each with its name, qualifiedName, type and a settable flag. Current values are NOT returned: the binder's value reader is not exported from NiagaraEditor, so the names and types are readable but the live value is not. Compile-time switches and enums are reported separately under switchPins; note that 'inputs' now means override-map inputs, NOT the function-call node pins it meant before (those are switchPins) (#784). Params: systemPath, emitterName?, emitterIndex?, stackContext? (ParticleSpawn|ParticleUpdate|EmitterSpawn|EmitterUpdate|all - default all), moduleName? |
set_module_input | Set a module input value. Override-map-bound inputs (the numeric/colour values that matter) are written through the stack override map, the same path the Niagara stack editor uses; others fall back to the pin default. Reports writePath ('overrideMap'|'pinDefault'). On the overrideMap path previousValue cannot be read back (NiagaraEditor does not export the binder's reader), so it reports '(unread: override map)' and NO rollback is offered - re-set the value explicitly instead. The pinDefault path reports a real previousValue and is rollback-safe (#769). value accepts a scalar, [x,y,z], {x,y,z[,w]} or {r,g,b[,a]} (alpha defaults to 1); anything the input's type cannot parse is REJECTED rather than written, including gapped component objects and non-finite numbers. Params: systemPath, moduleName, inputName, value, emitterName?, emitterIndex?, stackContext? |
add_module | Add a stock /Niagara/Modules script to an emitter stack (the modules that make an emitter actually do anything). Params: systemPath, moduleScript (e.g. /Niagara/Modules/Emitter/SpawnRate), stackContext (ParticleSpawn|ParticleUpdate|EmitterSpawn|EmitterUpdate), emitterName?, emitterIndex?, targetIndex? (-1 appends) |
list_static_switches | List static switch inputs on a module. Params: systemPath, moduleName, emitterName?, emitterIndex?, stackContext? |
set_static_switch | Set static switch value on a module's function call node. Params: systemPath, moduleName, switchName, value, emitterName?, emitterIndex?, stackContext? |
create_module_from_hlsl | Create a NiagaraScript module backed by a custom HLSL node. Params: name, hlsl, packagePath?, inputs?:[(name,type)], outputs?:[(name,type)] |
create_scratch_module | Create empty Niagara scratch module. Params: name, packagePath?, inputs?:[(name,type)], outputs?:[(name,type)] (#185) |
batch | Run a sequence of niagara operations against the bridge in order. Fails fast on the first error (returns results up to that point + error). Params: ops:[(action, params)] where action is any niagara subaction listed above |
audio
Audio: sound assets, playback, MetaSound + SoundCue graph authoring, submixes/effects, sound classes/mixes, attenuation, concurrency, spatialization.
| Action | Description |
|---|---|
list | List sound assets (SoundWave, SoundCue, MetaSoundSource) under a directory, paginated. Params: directory? (default /Game), recursive? (default true), maxResults? (default 1000), offset? (default 0) |
extract_pcm | Decode a USoundWave's imported audio to in-memory PCM (no intermediate file, no reliance on the original source path) for semantic sound search / analysis. Returns sampleRate, numChannels, numFrames, durationSeconds, and 16-bit PCM samples base64-encoded (interleaved). Params: soundPath (required), maxSeconds? (cap the decoded window; default full asset), downmixMono? (default false) (#729) |
import_audio | Import a WAV/OGG/FLAC file as a USoundWave. Returns durationSeconds, numChannels, looping. Params: filePath, name?, packagePath? (default /Game/Audio), looping?, replaceExisting? (default true) |
play_at_location | Play a sound in the editor world. Params: soundPath, location, volumeMultiplier?, pitchMultiplier? |
spawn_ambient | Place an AmbientSound actor. Params: soundPath, location, label? |
metasound_author | PREFERRED: stamp a whole MetaSound graph in ONE call from a declarative spec (avoids dozens of add_node/connect round-trips). Params: name, packagePath?, format? ('mono'|'stereo'), oneShot?, onConflict?, inputs? [(name,dataType,default?)], outputs? [(name,dataType)], nodes? [(id,class,namespace?,variant?,majorVersion?,inputs?:(vertex:value))], connections? [(from,to)] |
create_metasound | Create an empty MetaSoundSource and open a builder session for INCREMENTAL authoring (add_node/connect/...). For a whole graph at once prefer metasound_author. Params: name, packagePath? (default /Game/Audio/MetaSounds), format? ('mono'|'stereo'), oneShot? |
metasound_list_node_classes | List common MetaSound node classes to add (name, namespace, variant, notes). Params: filter? (substring) |
metasound_get_graph | Report a MetaSound's builder-session state (active builder, audio outputs, oneShot). Params: assetPath |
metasound_add_node | Add a node to a MetaSound graph by registered class name. Returns nodeId (+ input/output counts). Params: assetPath, nodeClassName (e.g. 'Sine'), nodeNamespace? (default 'UE'), nodeVariant? (e.g. 'Audio'), majorVersion? (default 1) |
metasound_add_input | Add a graph input to a MetaSound. Params: assetPath, name, dataType ('Float'|'Int32'|'Bool'|'String'|'Trigger'|'Audio'|'Time'|...), defaultValue? |
metasound_add_output | Add a graph output to a MetaSound. Params: assetPath, name, dataType |
metasound_connect | Connect one node's output vertex to another node's input vertex. Params: assetPath, fromNodeId, fromOutput (vertex name), toNodeId, toInput (vertex name) |
metasound_connect_input | Connect a graph input to a node input vertex. Params: assetPath, graphInput (name), toNodeId, toInput (vertex name) |
metasound_connect_output | Connect a node output vertex to a graph output. Params: assetPath, fromNodeId, fromOutput (vertex name), graphOutput (name) |
metasound_connect_audio_out | Connect a node output vertex to the source's audio output. Params: assetPath, fromNodeId, fromOutput (vertex name, must be Audio type), channel? (0=left/mono, 1=right; default 0) |
metasound_set_default | Set a default value on a node input vertex, or on a graph input. Params: assetPath, value (required), dataType? (Float|Int32|Bool|String hint), then EITHER (nodeId + inputName) OR graphInput |
metasound_build | Write the builder document to the MetaSound asset and save. Call after authoring. Params: assetPath |
cue_author | PREFERRED: create a SoundCue and stamp its whole node tree in ONE call. Params: name, packagePath?, onConflict?, nodes [(id,type,soundWavePath?,properties?)], connections [(parent,child,index?)] (omit parent => root), root? (nodeId) |
create_cue | Create a SoundCue, optionally seeded from a wave. For a whole graph prefer cue_author. Params: name, packagePath?, soundWavePath? |
cue_add_node | Add a node to a SoundCue graph. Returns nodeId. Params: cuePath, nodeType ('wave_player'|'mixer'|'random'|'modulator'|'attenuation'|'looping'|'concatenator'|'delay'|'switch'), soundWavePath? (wave_player), properties? (node-specific fields) |
cue_connect | Connect a SoundCue node as a child of another (or as the cue root). Params: cuePath, parentNodeId (omit for root), childNodeId, childIndex? (default append) |
cue_get_graph | Read a SoundCue node graph: nodes (id, type, children) and root. Params: cuePath |
create_submix | Create a USoundSubmix, optionally parented. Params: name, packagePath? (default /Game/Audio/Submixes), parentPath?, outputVolume?, wetLevel?, dryLevel? |
set_submix_parent | Reparent a submix (sets ParentSubmix, updating both ends). Params: submixPath, parentPath (empty detaches to root) |
add_submix_effect | Append a submix effect preset to a submix's effect chain (creates the preset asset). Params: submixPath, effectType ('reverb'|'eq'|'dynamics'|'filter'|'delay'), name?, packagePath?, settings? (effect Settings struct as JSON) |
create_sound_class | Create a USoundClass, optionally parented, with properties. Params: name, packagePath? (default /Game/Audio/SoundClasses), parentPath?, properties? (FSoundClassProperties JSON: Volume, Pitch, bIsUISound, ...) |
create_sound_mix | Create a USoundMix with sound-class adjusters. Params: name, packagePath? (default /Game/Audio/SoundMixes), adjusters? ([(soundClassPath, volumeAdjuster?, pitchAdjuster?, applyToChildren?)]), fadeInTime?, fadeOutTime? |
create_concurrency | Create a USoundConcurrency asset. Params: name, packagePath? (default /Game/Audio/Concurrency), maxCount?, limitToOwner?, resolutionRule? (e.g. 'StopFarthestThenOldest'), volumeScale? |
create_attenuation | Create a USoundAttenuation asset. Params: name, packagePath? (default /Game/Audio/Attenuation), settings? (FSoundAttenuationSettings JSON), plus shortcuts: falloffDistance?, spatialize?, enableOcclusion? |
set_sound_submix | Set a sound's base submix (routing target). Params: soundPath, submixPath (empty detaches) |
add_sound_submix_send | Add a submix send to a sound. Params: soundPath, submixPath, sendLevel? (default 1.0) |
set_sound_class | Assign a sound class to a sound. Params: soundPath, soundClassPath |
set_sound_attenuation | Attach an attenuation asset to a sound. Params: soundPath, attenuationPath (empty clears) |
set_sound_concurrency | Attach a concurrency asset to a sound. Params: soundPath, concurrencyPath (empty clears) |
set_property | Set any UPROPERTY on an audio asset by (dotted) name, value as JSON. Handles nested structs, arrays, object refs. Params: assetPath, propertyName, value |
widget
UMG Widget Blueprints, Editor Utility Widgets, and Editor Utility Blueprints. One parameter contract across every action (#798): the asset is always assetPath, an Unreal package path such as /Game/UI/WBP_Example; a widget inside the tree is always widgetName; its parent panel is always parentWidgetName; arguments for the epic_* actions always go in input, and a top-level assetPath is folded into the asset reference of the wrapped tool for you. A .uasset suffix, an object suffix (.WBP_Example), backslashes, and the legacy path / widgetBlueprintPath / widgetBlueprint spellings are accepted and normalized. Create actions take assetPath too; name plus packagePath remains valid and is composed into it. See Widget parameter contract.
| Action | Description |
|---|---|
read_tree | Read widget hierarchy. Params: assetPath |
get_details | Inspect widget (curated subset). Params: assetPath, widgetName |
get_properties | Full reflected property dump for a widget - every UPROPERTY (RenderOpacity, Visibility, ColorAndOpacity, Border padding/colors, Image brush TintColor/ImageSize, fonts, etc.) plus the slot block, for diagnosing visual bugs get_details omits. Pass includeSubtree to also dump children (#547). Params: assetPath, widgetName, includeSubtree? |
list_bindings | List designer property bindings on a WidgetBlueprint (the UE 5.7 Python API keeps them protected). Returns {widgetName, propertyName, functionName, bindingType}. Optional filterWidgetName/filterProperty (#530). Params: assetPath, filterWidgetName?, filterProperty? |
clear_binding | Remove designer binding(s) matching widgetName (and optional propertyName) from a WidgetBlueprint without opening the editor. Idempotent (#530). Params: assetPath, widgetName, propertyName? |
set_property | Set widget property. Slot struct props take UE struct text that persists every field - Slot.Size=(Value=1.0,SizeRule=Fill), Slot.Padding=(Left=8,Top=8,Right=8,Bottom=8) - or a nested field path like Slot.Size.Value / Slot.Padding.Left; an invalid value errors instead of silently writing 0 (#532). Params: assetPath, widgetName, propertyName, value |
set_style | Set a full/nested style struct on a widget from JSON (FButtonStyle, FEditableTextBoxStyle, FSlateFontInfo, FSlateColor and their nested brushes) - what set_property's scalar path can't express. value is a JSON object mirroring the struct. Params: assetPath, widgetName, propertyName (e.g. WidgetStyle), value (#563) |
reorder_child | Reorder a widget among its parent panel's children (move to a sibling index) - e.g. insert a new row BETWEEN two existing children. move_widget only reparents. Params: assetPath, widgetName, index (#635) |
bulk_set_properties | Apply many {widgetName, propertyName, value} style/property writes to a WidgetBlueprint in one call (single compile+save) - font/color/style stylesheet across many widgets. Params: assetPath, properties[] (#563) |
list | List Widget BPs. Params: directory?, recursive? |
read_animations | Read UMG animations. Params: assetPath |
create | Create Widget BP. assetPath is the full destination, e.g. /Game/UI/WBP_Example; name + packagePath is the older spelling of the same thing and is composed into it. Params: assetPath, name?, packagePath?, parentClass? |
create_utility_widget | Create editor utility widget. Params: assetPath, name?, packagePath? |
run_utility_widget | Open editor utility widget. Params: assetPath |
create_utility_blueprint | Create editor utility blueprint. Params: assetPath, name?, packagePath? |
run_utility_blueprint | Run editor utility blueprint. Params: assetPath |
add_widget | Add widget to widget tree. Idempotent by assetPath + widgetName: passing widgetName makes a retry safe, and the result carries requestedWidgetName/persistedWidgetName/renamed plus compileStatus. Params: assetPath, widgetClass, widgetName?, parentWidgetName? |
remove_widget | Remove widget from tree. Idempotent, and clears the widget's Widget Blueprint GUID metadata so later compiles stop reporting a deleted variable (#799). Params: assetPath, widgetName |
move_widget | Reparent widget. Params: assetPath, widgetName, newParentWidgetName |
set_root | Replace WBP root with an existing widget by name (#365). Params: assetPath, widgetName |
wrap_root | Wrap the current root in a new panel widget (UMG 'Wrap With'). Params: assetPath, wrapperClass (must be a UPanelWidget subclass), wrapperName? (#365) |
list_classes | List available widget classes |
extract_subtree | Lift an authored designer subtree out of one WidgetBlueprint into a standalone one, using UMG's own clipboard serializer so hierarchy, child order, editable properties, panel slot data and named-slot content survive. The selected widget becomes the destination root. dryRun defaults to true and only returns the name mapping - pass dryRun=false to actually write the asset. The destination must be absent or empty; an exact-shape replay returns existed. The source is never compiled or saved. Params: sourceAssetPath, sourceWidgetName, destinationAssetPath, destinationParentClass?, destinationRootName?, dryRun? |
list_runtime | (#160) List live UUserWidget instances in the PIE world. Params: classFilter?, namePrefix?, viewportOnly? |
get_runtime | (#160) Inspect a live PIE widget tree with text/visibility/brush/percent plus style values: renderOpacity (all), colorAndOpacity (TextBlock/Image), Border brushColor/contentColorAndOpacity (#592). includeLayout adds read-only layout diagnostics to every node - geometry (desired/local/absolute size, layout and render bounds), render transform, effective opacity, reflected slot properties including structured Canvas anchors/offsets/alignment, derived clipping, parent and viewport overlap, and a diagnostics array - plus the host UserWidget node under host, a layoutCapture summary, and per-node deltaSincePreviousCapture against the previous includeLayout call on that instance, so capture / reproduce / capture again isolates position-dependent sizing. Off by default: it is a much larger payload. Params: widgetName? | className?, childName?, maxDepth?, includeLayout? |
inspect_runtime_instances | Inspect every matching live widget instance (never an implicit first match), with stable identity/owning-player metadata and selected reflected properties on the widget or subtree. Requires a running PIE/Game world and errors instead of falling back to the editor world. Passing childName or childClassFilter implies includeSubtree. Provide widgetName or classFilter. Params: widgetName?, classFilter?, propertyNames[]?, includeSubtree?, childName?, childClassFilter?, viewportOnly?, world?, pieInstance?, maxInstances?, maxNodesPerInstance? |
get_runtime_delegates | (#161) Read delegate binding state on a live PIE widget. Params: widgetName, className? |
add_to_viewport | (#602) Instantiate a WidgetBlueprint and add it to the live PIE viewport for visual verification. Requires PIE running. Params: assetPath (WidgetBlueprint path), zOrder? |
invoke_runtime_function | (#559/#812) Fire a UI interaction on a live PIE widget: a parameterless UFUNCTION (functionName) on the located UserWidget, OR drive an interactive child via childName - Button (click), CheckBox (value true/false/toggle), Slider and SpinBox (numeric value), EditableText/EditableTextBox/MultiLineEditableText/MultiLineEditableTextBox (string value), ComboBoxString (option string or index). The matching delegate is broadcast so bound Blueprint logic runs. functionName alongside childName picks the delegate (e.g. OnPressed, OnTextChanged). Locate the widget with widgetName or className. Params: widgetName?|className?, functionName?, childName?, value?, commitMethod? |
editor
Editor commands, Python execution, PIE, undo/redo, hot reload, viewport, performance, sequencer, build pipeline, logs, editor control.
| Action | Description |
|---|---|
start_editor | Launch Unreal Editor and BLOCK until it is fully ready (not merely until the socket answers), rendering a startup progress bar in the terminal. Returns the phase timeline it waited through. Do NOT poll get_engine_state or get_status afterwards: this call already waited, and a ready editor is the only way it returns success. Params: timeout? (seconds, default 300) |
get_engine_state | What the engine is REALLY doing, read from outside the game thread: startup phase from the editor's own log, process table (PID, command line, responding), the plugin's status snapshot (slow-task name and percent, active modal dialog, game-thread stall), and native dialog windows. Call this ONCE when something is already wrong (handlers timing out, an editor that will not come up). Never call it in a wait loop: start_editor blocks until ready on its own, and polling this during startup burns tokens re-reading state that is already tracked. Params: probeWindows? (default true; scans native windows, costs ~2s) |
stop_editor | Close Unreal Editor gracefully (asks the editor to quit itself via the bridge; never an OS kill). Acts only on the editor for the loaded project, resolved from the port lockfile that editor published at <project>/Saved/UE_MCP_Bridge/port.json. With no lockfile there is no port to aim at and the call refuses, naming the file it checked, rather than probing a default port that another project's editor could answer on (#819) |
restart_editor | Stop then start the editor for the loaded project. Editors for other projects are left alone: the stop is aimed by this project's port lockfile, and the decision to start is made from the process holding this project's .uproject open, never from whether some editor is running (#819) |
build_project | Build the project's C++ code using Unreal Build Tool. Editor should be stopped first |
execute_command | Run console command. Params: command |
execute_python | GATED LAST RESORT. execute_python is unreachable until a semantic tool search over your taskSummary has been run AND every candidate it returns is EXPLICITLY ruled out with a stated reason. Flow: (1) call with taskSummary (+code) - it returns the candidate actions; (2) re-call with the same taskSummary/code PLUS ruledOut=[{action, reason}] giving a specific reason each candidate does not fit. Python runs only once every candidate is ruled out. Params: code, taskSummary (required), ruledOut?, resultVariable? (name of a top-level variable to return as result, separate from print()/log; #732) (#704) |
run_python_file | Run a Python file from disk with file/name populated (#142). Params: filePath, args?, resultVariable? (name of a top-level variable to return as result, separate from logs; #732) |
purge_python_modules | Purge cached embedded-Python modules whose name starts with a prefix, so the editor drops stale code after you edit a Python tool on disk. Returns the purged module names + count. Params: prefix (required, non-empty) (#719) |
close_sequence | Close the currently open Level Sequence editor (Sequencer). Do this before bulk-deleting actors a sequence may possess - open sequences re-resolve possessables by name during destruction and can mis-bind. Returns wasOpen + closedSequence (#718) |
open_tab | Open a registered editor tab by ID so its UI can be screenshotted as evidence (e.g. 'ProjectSettings', 'OutputLog', 'ContentBrowserTab1'). Params: tabId (#727) |
open_settings | Open (and navigate) a settings viewer for visual settings evidence. Params: container? (Project|Editor; default Project), category? (e.g. 'Engine'), section? (e.g. 'Physics', or a combined 'Engine.Physics') (#727) |
set_property | Set UObject property. Saves the package to disk by default; pass save=false to leave it dirty in-memory (batch many writes, then editor(save_dirty)/asset(save)) (#674). TMap values take either { "Key": value } or, for struct keys, [{ key: {...}, value: ... }] - exactly what get_property/describe_object return under value. A write that cannot store every entry it was given fails and leaves the old value in place; containers report elementCount on success (#820). Params: objectPath, propertyName, value, save? (default true) |
get_property | Read UObject property. value is structured JSON and is always safe to write straight back with set_property; valueText is UE export text and for a struct-keyed TMap does not read back, so valueTextRoundTrips reports whether it can be reused (#820). Params: objectPath, propertyName |
describe_object | Describe a UObject and optionally list/read properties. Per property, value is the round-trippable structured form and valueTextRoundTrips flags export text that is not (#820). Params: objectPath, includeProperties?, includeValues?, propertyNames? |
play_in_editor | PIE control. Params: pieAction (start|stop|status), waitForAssetRegistry? (start only; default true - block until the AssetRegistry initial scan completes before requesting PIE, otherwise PIE silently no-ops on cold editor starts), assetRegistryTimeoutSeconds? (default 180) (#406) |
play_in_editor_ignore_blueprint_errors | Start PIE for one launch with the editor's unresolved-Blueprint-error prompt suppressed. PIE then runs whatever bytecode those Blueprints last compiled to, so the launch is authorized per call: set ue-mcp.pie.allowIgnoreBlueprintErrors to true in your ue-mcp config to pre-authorize it, otherwise the user answers an MCP approval prompt. The bridge refuses the launch when a Blueprint would have to be recompiled first (dirty non-data Blueprints, errored Level Blueprints) and lists every errored Blueprint it suppressed in loadedErroredBlueprints. Params: waitForAssetRegistry? (default true), assetRegistryTimeoutSeconds? (default 180) |
get_runtime_value | Read PIE actor property. Params: actorLabel, propertyName (supports dotted paths: component.field or component.struct.field for nested reads on component subobjects, #344/#381) |
get_pie_pawn | Resolve the controlled pawn in the active PIE world. Params: playerIndex? (default 0) |
list_pie_instances | List the running PIE worlds with their instance id, net mode (standalone|listenServer|dedicatedServer|client), player count and whether they own a game viewport. In a multiplayer PIE session every other runtime action resolves the primary world (the server) unless you pass pieInstance, so this is how you discover that a client exists and what id addresses it. Params: none (#778) |
invoke_object_function | Call a UFUNCTION on any UObject, not just a placed actor. Target it with objectPath, or target=gameinstance|gamemode|gamestate|playercontroller|playerpawn|subsystem (subsystem also needs subsystemClass; playercontroller/playerpawn accept playerIndex). The GameInstance, GameMode and subsystems have no actor label, so invoke_function could never reach them. Returns output and return params under returnValues; an unknown function name lists the available ones. Params: functionName, objectPath? | target?, subsystemClass?, playerIndex?, args?, world? (editor|pie|auto), pieInstance? (#739) |
invoke_object_functions | Call 1-64 UFUNCTIONs in order without yielding to the editor tick loop. Each call independently targets a UObject using the same fields as invoke_object_function, so one sequence can span an actor and its components. Calls stop at the first failure; earlier calls are not rolled back. Returns results[] in call order plus completedCalls/requestedCalls, and failedIndex when it stops early, so a retry can resume instead of replaying mutations. Params: calls[] ((functionName, objectPath? | target?, subsystemClass?, playerIndex?, args?)), world? (editor|pie|auto), pieInstance? |
read_bone_transforms | Read live skeletal bone and socket transforms off an actor, once. This is a point-in-time read, NOT a time series - for per-frame capture over a window use the pie category's observe actions. Pass bones (bone OR socket names) or omit for every bone up to limit. space=world (default) or component; component space is independent of where the actor is standing. Pass relativeTo (bone OR socket name) to express every sample in that live reference frame; relativeTo supersedes space and is calculated in component space. Also reports the AnimInstance class/path. Params: actorLabel, componentName?, bones?, relativeTo?, space?, limit?, world? (editor|pie|auto), pieInstance? (#756/#757/#761/#764) |
get_object_properties | Read reflected properties off any UObject, with the same targeting as invoke_object_function. Blueprint-declared variables are reflected properties, so they read the same way as native ones. Pass propertyNames to filter; entries may use the Details-panel spelling ('World Context Object' finds WorldContextObject, 'Is Active' finds bIsActive). Names that do not exist come back under missingProperties instead of silently returning nothing. Properties holding a TMap are also reported under values in the structured form set_property accepts, because export text cannot carry a struct-keyed map back (#820). Params: objectPath? | target?, subsystemClass?, playerIndex?, propertyNames?, world? (editor|pie|auto), pieInstance? (#739/#802) |
set_movement_mode | Set a live PIE character's movement mode and/or velocity on its CharacterMovementComponent. Modes are named (none|walking|navwalking|falling|swimming|flying|custom) rather than raw enum numbers, because a wrong number reads as success and then behaves as None. Reports previousMode/previousVelocity and reads the mode back afterwards, since SetMovementMode can refuse a mode the character cannot enter (flying with bCanFly off, swimming outside a volume). Params: actorLabel, mode?, customMode? (only with mode='custom'), velocity? (x,y,z), world? (default pie), pieInstance? (#757) |
set_object_property | Write a reflected property on a live UObject instance, with the same targeting as invoke_object_function. Use this for a PIE actor, a spawned widget or any runtime instance: editor(set_property) is the asset path and marks the package dirty and saves it, which a live instance has no business doing. propertyName accepts dotted/indexed paths and the Details-panel spelling. Reports previousValue plus the value read back after the write, so a coerced or clamped write is visible. Nothing is saved; pass postEditChange=true to fire PostEditChangeProperty. Params: propertyName, value, objectPath? | target?, subsystemClass?, playerIndex?, postEditChange?, world? (editor|pie|auto), pieInstance? (#802) |
find_object | Resolve or search for a live UObject instance and report the objectPath that addresses it, which is what invoke_object_function / get_object_properties / set_object_property need. Pass objectPath to check one path (returns found/isValid rather than failing when it is gone), or className and/or nameContains to search every loaded object. className takes a short name (StaticMeshActor), a /Script path, a generated class name (WBP_Hud_C) or a Blueprint asset path. This is how you get the path of something spawned at runtime, an editor utility widget or a UMG widget, which no naming convention predicts. Params: objectPath? | className?, nameContains?, outerPath?, exactClass?, includeDefaults?, world? (any (default)|editor|pie), pieInstance?, limit? (default 50) (#802) |
teleport_runtime_actor | Move a live PIE actor and have it STAY moved. A plain SetActorLocation on a Character is undone by CharacterMovement on the next tick, so this stops the movement component, teleports, and stops it again. Reports actualLocation read back from the actor rather than what was requested. Params: actorLabel, location?, rotation?, stopMovement? (default true), sweep? (default false), world? (default pie), pieInstance? (#770/#777) |
invoke_static_function | Call a static UFUNCTION on a UBlueprintFunctionLibrary (no actor instance). invoke_function needs an actor/component target; this targets the library class CDO instead, so it reaches static *_BlueprintOnly libraries (Voxel sculpt/query/stamp), GeometryScript, Kismet math, any function library. Params: className (short name or /Script/Module.Class path), functionName, args? (name -> JSON value, same marshalling as invoke_function), actorArgs? (name -> actor label for UObject* params that are actors, e.g. the sculpt actor), worldContextParam? (name of a UObject* param to fill with the editor/PIE world; auto-detected for params named WorldContextObject), world? (editor|pie) |
invoke_function | Call a BlueprintCallable / Exec UFUNCTION on a target actor or one of its components. world=editor (the default) runs the function on the actor placed in the level, no PIE session needed, and reports which instance ran it as resolvedActorLabel/resolvedActorPath. actorLabel is matched against placed actors by editor label first, then internal object name, then full object path; a miss is an error naming what was searched (#806). Params: actorLabel, functionName, component? (component subobject name; redirects target from the actor to that component, #382), args? (object; struct values accept a JSON object such as (X,Y,Z) as well as an export-text string), actorArgs? (object mapping UObject* parameter name to actor label, resolved against live actors in the active world; #383), world? (editor|pie) |
list_function_libraries | Enumerate UBlueprintFunctionLibrary subclasses on this build. Filter by name (case-insensitive substring, e.g. 'GeometryScript' / 'Kismet' / 'Animation'). Returns name, module, and (by default) every static BlueprintCallable function on the library with its tooltip. Use to discover what's available for editor.invoke_function (#455). Params: pattern?, includeFunctions? |
set_pie_time_scale | Fast-forward PIE game time. Params: factor (>0) |
hot_reload | Hot reload C++ |
undo | Undo last transaction |
redo | Redo last transaction |
get_perf_stats | Editor performance stats |
run_stat | Run a stat overlay. Params: name (bare stat name, e.g. 'unit','fps','game','gpu') OR command (full console command) |
set_scalability | Set rendering quality via the Scalability system (actually applies + persists, not just sg.* cvars). Params: level (Low|Medium|High|Epic|Cinematic) |
set_cvars | Bulk-set console variables. Params: cvars ((name: value) object OR [(name, value)] array) |
capture_screenshot | Screenshot. target=pie synchronously captures the selected PIE client game viewport with UMG/Slate UI; target=editor captures the level viewport; target=window synchronously captures a whole Slate window via FSlateApplication::TakeScreenshot - pixel-true for ALL Slate/UMG UI, returns after the PNG is written, and works while the window is unfocused or off-screen. Multi-instance PIE automatically prefers a world with a game viewport; pass pieInstance or worldPath to select explicitly, which for target=window is what picks the PIE client window instead of the active editor window. Every mode captures at the source viewport/window size - use capture_scene_png for a chosen output size. Params: filename?, target? (auto|pie|editor|window), pieInstance?, worldPath? |
capture_scene_png | Headless PNG screenshot via SceneCapture2D (works unfocused, guaranteed RGBA8 LDR). focusActorLabel auto-frames the camera on an actor's bounds; world:pie captures the running game world (#599). Params: outputPath, location?, rotation?, focusActorLabel?, focusDirection?, focusMargin?, world? (editor|pie), width? (default 1280), height? (default 720), fov? (default 90) (#148/#599) |
set_realtime | Toggle realtime update on the level editor viewports so the editor-world sim (Niagara, anims) ticks - otherwise capture_scene_png renders an unticked, empty sim. Params: enabled (default true) (#537) |
get_viewport | Get viewport camera |
hit_test_viewport_pixel | Ray-cast from a screen pixel through the active editor viewport and return the first hit. Builds the ray from the live viewport's projection matrix (no FOV/aspect guessing). Returns hit + actorLabel/actorClass/componentName/componentClass/materialPath/location/impactPoint/normal/distance/faceIndex/boneName/physicalMaterial. Params: x, y (pixel coords), width? height? (override viewport size when picking from a different-resolution screenshot), maxDistance? (default 200000), ignoreActors? (array of actor labels) (#418) |
get_runtime_values | Bulk runtime read across the active world. For each actor/component matching classFilter, resolves every path against the (actor|component) root and returns rows of {actorLabel, actorClass, componentName?, componentClass?, values, errors?}. Paths support property hops, sub-object hops, and zero-arg BlueprintCallable getter calls at any segment (e.g. 'PowerConnector.GetRequired' reaches a UFUNCTION on a UObject sub-object). classFilter matches actor class OR component class - omit to match everything. World defaults to PIE if running, else editor. Params: classFilter?, paths[], world? (editor|pie) (#414) |
set_viewport | Set viewport camera. Params: location?, rotation? |
focus_on_actor | Focus on actor. Params: actorLabel |
create_sequence | Create Level Sequence. Params: name, packagePath? |
get_sequence_info | Read sequence: bindings (possessable/spawnable) with their Sequencer tags (#556), tracks, and optional section detail. Params: assetPath, includeSectionDetails? (attach sockets, first transform key values per track) |
add_sequence_track | Add an empty track. Params: assetPath, trackType, actorLabel? |
add_sequence_section | Add a section to a track (creating the track if needed), set its start/end in seconds, and for a CameraCut track bind it to a camera. Returns the section index + channel names to key. Params: sequencePath, trackType (Transform|Float|Fade|CameraCut|Audio|Event|SkeletalAnimation), actorLabel? (binding scope), startSeconds?, endSeconds?, cameraActorLabel? (#548) |
set_sequence_keyframes | Add keyframes to a section channel. Transform channels: Location.X/Y/Z, Rotation.X/Y/Z (or friendly x/y/z, yaw/pitch/roll); Fade/Float: the float channel. Params: sequencePath, trackType, actorLabel?, sectionIndex? (default 0), channel, keyframes ([(seconds, value)]), interpolation? (cubic|linear) (#548) |
set_sequence_playback_range | Set a Level Sequence's playback range in seconds. Params: sequencePath, startSeconds, endSeconds (#548) |
play_sequence | Play/stop/pause a Level Sequence in Sequencer. Pass sequencePath (or assetPath) to target a specific sequence - it is opened first, because the underlying Sequencer commands act on whatever is currently open. Omit it and the call applies to the open sequence and says so. Params: sequencePath? (or assetPath), sequenceAction? (play|pause|stop, default play) |
build_all | Build all (geometry, lighting, paths, HLOD) |
build_geometry | Rebuild BSP geometry |
build_hlod | Build HLODs |
validate_assets | Run data validation. Params: directory? |
get_build_status | Get build/map status |
cook_content | Cook content. Params: platform? |
get_log | Read output log. Params: maxLines?, filter?, category? |
search_log | Search log. Params: query |
get_message_log | Read a Message Log listing (MapCheck, AssetCheck, PIE, LoadErrors, LightingResults...). Call with NO logName to list the registered listings with their error/warning counts, then read one. Counts come from the listing itself; message bodies come from the current page and honour the Message Log tab's severity checkboxes, so when fewer are readable than exist the response says so instead of reading clean. An unknown logName is an error, not an empty log. Blueprint COMPILE results are not here - the compiler makes a listing per Blueprint; use blueprint(compile). Params: logName?, maxLines? (default 200), severity? (severity-name substring) |
list_crashes | List crash reports |
get_crash_info | Get crash details. Params: crashFolder |
check_for_crashes | Check for recent crashes |
set_dialog_policy | Auto-respond to dialogs matching a pattern. Params: pattern, response |
clear_dialog_policy | Clear dialog policies. Params: pattern? |
get_dialog_policy | Get current dialog policies |
list_dialogs | List active modal dialogs, with title, message text and button labels. Runs even while a dialog is blocking the editor, when every other handler times out |
respond_to_dialog | Click a button on the active modal dialog, releasing the game thread. Runs even while the dialog is blocking the editor. Pass action='close' to destroy the dialog window when no button label fits. Params: buttonIndex?, buttonLabel?, action? (escape or close) |
open_asset | Open asset in its editor. Params: assetPath |
reload_bridge | Hot-reload Python bridge handlers from disk |
save_dirty | Flush every dirty package and return a per-package saved/failed map. Use after multi-step CDO/component edits when set_class_default leaves the asset dirty without persisting (#378). Params: includeMaps? (default true), includeContent? (default true) |
configure_pie | Set ULevelEditorPlaySettings - multi-client PIE, net mode, single-process flag, Play-in-New-Window resolution. Params: numClients?, netMode? (standalone|listen|client), runUnderOneProcess?, launchSeparateServer?, newWindowWidth?, newWindowHeight? (#384/#671) |
get_pie_config | Read current ULevelEditorPlaySettings (numClients, netMode, single-process, separate-server) (#384) |
pie_set_player_view | Point the running PIE player's view (control rotation) at a pitch/yaw/roll so a capture frames the intended direction. Requires PIE. Params: pitch?, yaw?, roll? (#671) |
stage_game_input | Stage input for the running game: set input mode (gameOnly|gameAndUI|uiOnly) and mouse cursor so injected/simulated input reaches the pawn. This only sets the mode - the injection itself lives in the pie category (pie(inject_input*)), not here. Requires PIE. Params: inputMode? (default gameOnly), showMouseCursor? (#671) |
run_automation_tests | Run registered Automation tests matching a filter and return per-test pass/fail plus error lines. Runs them synchronously through the test framework rather than the console queue, and suspends the editor's unfocused-CPU throttle for the duration - otherwise an unfocused editor drops to a few FPS and the framework's interactive-frame-rate gate never opens, leaving tests queued forever (#765). Params: filter?, maxTests? (default 50) (#693) |
list_dirty_packages | Enumerate currently-dirty content + map packages, read from the editor's own dirty-package lists (the same ones Save All uses). Includes a never-saved /Temp world, because an unsaved new map is exactly the unsaved work a caller needs to see before closing or reloading (#340) |
request_editor_shutdown | Ask the editor to close itself from inside the engine, after it has checked that closing is safe. Refuses by default when any content or map package is dirty (including an unsaved /Temp world) and reports which ones, so nothing is lost to a silent discard. Ends an active PIE/SIE session first and closes only once play has actually stopped. The response is returned before the process exits. Use editor(stop_editor) for the full stop-and-confirm flow; this action is the in-engine half of it. Params: requireClean? (default true), endPIE? (default true) |
reflection
UE reflection: classes, structs, enums, gameplay tags, and SaveGame instances.
| Action | Description |
|---|---|
reflect_class | Reflect UClass. className accepts the C++ spelling with or without the A/U/F/E prefix (UMyConfig and MyConfig both resolve), a /Script/Module.ClassName path, or a Blueprint class path; a failed lookup lists the spellings tried and the closest matches (#823). Params: className, includeInherited? |
reflect_struct | Reflect UScriptStruct. Params: structName |
reflect_enum | Reflect UEnum by full path, short name, or short name without the E prefix. Resolves native enums in any loaded module and loads unloaded Blueprint (UserDefinedEnum) assets via the asset registry. Returns enumPath, userDefined, and per-value name/value/displayName/tooltip; a failed lookup lists close matches (#762). Params: enumName |
list_classes | List classes. parentFilter resolves with or without the C++ A/U/F/E prefix (#823). Params: parentFilter?, limit? |
list_tags | List gameplay tags. Params: filter? |
create_tag | Create gameplay tag. Params: tag, comment? |
create_enum | Create UUserDefinedEnum asset, optionally seeded with entries. Params: name, packagePath?, entries?: (string|(name, displayName?))[], onConflict? (#274) |
set_enum_entries | Replace entries on an existing UUserDefinedEnum. Params: assetPath, entries[] (#274) |
is_class_loaded | Report whether a UClass is currently loaded in the editor (loaded), whether it exists/is loadable (exists), and its owning module + that module's load state. Distinguishes 'not loaded yet' from 'does not exist'. Params: className (short name, /Script/[Module].[Class], or BP class path) (#689) |
is_module_loaded | Report whether a named module is currently loaded. Params: moduleName (#689) |
list_loaded_modules | Enumerate modules with runtime load state. Params: filter? (case-insensitive substring), loadedOnly? (default false) |
inspect_save_game | Load a SaveGame slot read-only and return its reflected UPROPERTY(SaveGame) values. Non-serializable properties are listed in skippedProperties instead of failing the call. Params: slotName, userIndex? (default 0) |
gameplay
Gameplay systems: physics, collision, navigation, input, behavior trees, AI (EQS, perception, State Trees, Smart Objects), game framework.
| Action | Description |
|---|---|
set_collision_profile | Set collision preset. Params: actorLabel, profileName |
set_simulate_physics | Toggle physics. Params: actorLabel, simulate |
add_impulse | Apply an impulse (or force with mode='force') to a (PIE) actor's simulating physics body so its motion can be observed over time - loop level(read_actor_motion) to sample the response. Params: actorLabel, impulse (x,y,z) (or force/vector), mode? (impulse|force), componentName?, boneName?, location? (apply at world point), velChange?/accelChange?, world? (editor|pie|auto) (#676) |
set_collision_enabled | Set collision mode. Params: actorLabel, collisionEnabled |
set_collision | Unified collision authoring for a placed actor (actorLabel) or a Blueprint component template (assetPath+componentName). Apply any of: collisionProfile, collisionEnabled (NoCollision|QueryOnly|PhysicsOnly|QueryAndPhysics), objectType (channel name), responseToAllChannels (Block|Overlap|Ignore), responses ({channel: Block|Overlap|Ignore}). Profile is applied first, then overrides. componentName optional for actors (defaults to all primitive components), required for Blueprint templates (#545) |
set_physics_properties | Set mass/damping/gravity. Params: actorLabel, mass?, linearDamping?, angularDamping?, enableGravity? |
rebuild_navigation | Rebuild navmesh |
find_nav_path | Synchronous nav-path query between two world points. Returns valid/partial/length plus the polyline. The standard 'why doesn't my AI move?' diagnostic. Params: start (Vec3), end (Vec3), pathfindingContext? (actorLabel - uses its agent + filter) (#424) |
list_nav_invokers | Enumerate actors carrying a NavigationInvokerComponent + their tile generation/removal radii. Diagnoses 'no navmesh in this region' caused by missing or mis-sized invokers (#424) |
get_navmesh_info | Query nav system |
project_to_nav | Project point to navmesh. Params: location, extent? |
spawn_nav_modifier | Place a NavModifierVolume. The brush is built for real (a bare spawn leaves an AVolume with no geometry, which the engine skips entirely - it requires both Brush and AreaClass). extent is a HALF-size in world units, default 100. areaClass defaults to NavArea_Null, which cuts a hole in the navmesh; pass NavArea_Obstacle to make the region costly instead, or any UNavArea subclass. Params: location, extent?, areaClass?, label?, scale?, onConflict? |
create_input_action | Create InputAction. Params: name, packagePath?, valueType? |
create_input_mapping | Create InputMappingContext. Params: name, packagePath? |
list_input_assets | List input assets. Params: directory?, recursive? |
read_imc | Read InputMappingContext mappings. Params: imcPath |
get_applied_imcs | Read applied Input Mapping Contexts (name, path, priority, registrationCount), highest priority first - the order Enhanced Input resolves in. Covers EVERY running PIE world by default, so a multiplayer client can be inspected, not just the primary/server world; narrow with pieInstance and/or playerIndex. Pass mappingContext for a direct hasRequestedContext yes/no. A remote controller with no LocalPlayer says so rather than reporting an empty list. BREAKING in 1.1.36: results are now nested under worlds[].players[] (was a flat appliedContexts[] for one world), the array is mappingContexts (was appliedContexts), each entry uses path (was imc), and a call with PIE stopped returns success with worldCount 0 instead of erroring (#604/#778) |
list_input_mappings | Alias for read_imc. List key→action bindings with triggers/modifiers. Params: imcPath |
add_imc_mapping | Add key mapping to IMC. Params: imcPath, inputActionPath, key |
set_mapping_modifiers | Set modifiers/triggers on an IMC mapping. Each modifier OR trigger is either {type:'<ShortName>', <prop>:<val>} or {class:'/Script/Module.Class', properties:{...}} - the class form resolves any custom UInputModifier/UInputTrigger subclass (e.g. type:'Hold' | class:'/Script/EnhancedInput.InputTriggerHold', with HoldTimeThreshold). Unresolvable trigger specs are reported in failedTriggers and never leave a null entry (#649/#725). Params: imcPath, mappingIndex?, modifiers?, triggers? |
remove_imc_mapping | Remove an IMC mapping. Params: imcPath, mappingIndex? | (inputActionPath? + key?) (#158) |
set_imc_mapping_key | Rebind an IMC mapping to a new key. Params: imcPath, newKey, mappingIndex? | key? | inputActionPath? (#158) |
set_imc_mapping_action | Retarget an IMC mapping to a different InputAction. Params: imcPath, newInputActionPath, mappingIndex? | key? | inputActionPath? (#158) |
list_behavior_trees | List behavior trees. Params: directory?, recursive? |
get_behavior_tree_info | Inspect behavior tree (top-level + blackboard). Params: assetPath |
read_behavior_tree_graph | Walk BT tree: composites, tasks, decorators, services with blackboard keys. Params: assetPath |
create_blackboard | Create Blackboard. Params: name, packagePath? |
add_blackboard_key | Add a typed key to a Blackboard asset. baseClass types an Object/Class key - Behaviour Tree nodes filter on it, so an untyped key silently will not bind. For keyType=Enum pass the enum via enumType (or baseClass). Params: blackboardPath, keyName, keyType (Bool|Int|Float|String|Name|Vector|Rotator|Object|Class|Enum), baseClass? (e.g. /Script/Engine.Actor), enumType? (#250) |
remove_blackboard_key | Remove a key from a Blackboard asset by name. Idempotent. Params: blackboardPath, keyName (#469) |
set_blackboard_parent | Set Parent on a BlackboardData asset (canonical UE child-of-parent pattern). Pass parentPath="None" or omit to clear. autoPruneDuplicateKeys (default true) removes own-keys that the parent chain already defines so the BT compiler accepts the child (#469) |
read_blackboard | Read a Blackboard asset: parent path, ownKeys, inheritedKeys (walks the parent chain). Params: blackboardPath (#469) |
list_bt_node_classes | Enumerate every concrete BehaviorTree node class on this build (composites, tasks, decorators, services). Filter by kind to narrow. Useful for discovering plugin-supplied decorator/task classes without grepping engine + plugin source. Params: kind? ('composite'|'task'|'decorator'|'service') (#494) |
set_behavior_tree_blackboard | Rebind a BehaviorTree asset's BlackboardAsset reference. Params: behaviorTreePath, blackboardPath |
create_behavior_tree | Create behavior tree. Params: name, packagePath?, blackboardPath? |
create_eqs_query | Create EQS query. Params: name, packagePath? |
list_eqs_queries | List EQS queries. Params: directory? |
add_perception | Add an AIPerceptionComponent to a Blueprint and configure its senses. senses takes short names (Sight, Hearing, Damage, Touch, Team, Prediction), AISenseConfig_* names, or class paths - a component with no sense configs perceives nothing. Params: blueprintPath, senses? |
configure_sense | Add + configure an AI perception sense config on the blueprint's AIPerceptionComponent. Params: blueprintPath, senseType (Sight|Hearing|Damage|Touch|Team|Prediction|Blueprint), settings? ((SightRadius: ...)), componentName? |
get_state_tree_runtime | Read a running StateTreeComponent's active state names in PIE (the 'brain' state). Params: actorLabel, world? (default pie), componentName? (#654) |
create_state_tree | Create a StateTree with a proper UStateTreeEditorData (schema + root state), so states/tasks are authorable via statetree(*) and persist across save/load (#653). Params: name, packagePath?, schema? (default /Script/GameplayStateTreeModule.StateTreeComponentSchema), onConflict? |
list_state_trees | List StateTrees. Params: directory? |
add_state_tree_component | Add StateTreeComponent. Params: blueprintPath |
create_smart_object_def | Create SmartObjectDefinition. Params: name, packagePath? |
add_smart_object_component | Add SmartObjectComponent. Params: blueprintPath |
add_smart_object_slot | Append a FSmartObjectSlotDefinition to a SmartObjectDefinition's Slots array. Params: assetPath, name?, offset? ((x,y,z)), rotation? ((pitch,yaw,roll)), tags? (array) |
set_smart_object_slot | Mutate an existing slot's offset/rotation/tags. Params: assetPath, slotIndex, offset? ((x,y,z)), rotation? ((pitch,yaw,roll)), tags? (array) |
remove_smart_object_slot | Remove a slot by index. Idempotent: out-of-range returns alreadyDeleted=true. Params: assetPath, slotIndex (#416) |
list_smart_object_slots | List slots on a SmartObjectDefinition with index, offset, rotation, and raw text. Params: assetPath (#416) |
add_smart_object_slot_behavior | Attach a behavior definition (UBehaviorDefinition asset or class) to a slot's BehaviorDefinitions array. Pass instanceProperties to seed UPROPERTYs on a freshly-spawned class-instance. Params: assetPath, slotIndex, behaviorClass (asset path or class path), instanceProperties? (#416) |
create_game_mode | Create GameMode BP. parentClass must derive from GameModeBase (short name, /Script path, or a Blueprint asset path). Params: name, packagePath?, parentClass? |
create_game_state | Create GameState BP. parentClass must derive from GameStateBase. Params: name, packagePath?, parentClass? |
create_player_controller | Create PlayerController BP. parentClass must derive from PlayerController. Params: name, packagePath?, parentClass? |
create_player_state | Create PlayerState BP. parentClass must derive from PlayerState. Params: name, packagePath?, parentClass? |
create_hud | Create HUD BP. parentClass must derive from HUD. Params: name, packagePath?, parentClass? |
set_world_game_mode | Set level GameMode override. Params: gameModeClass (or legacy gameModePath) |
get_framework_info | Get level framework classes |
get_navmesh_details | Read RecastNavMesh generation params (cellSize, agentHeight, maxStepHeight, etc.) (#163) |
gas
Gameplay Ability System: abilities, effects, attribute sets, cues.
| Action | Description |
|---|---|
add_asc | Add AbilitySystemComponent. Params: blueprintPath, componentName? |
create_attribute_set | Create AttributeSet BP. Params: name, packagePath? |
add_attribute | Add attribute to set. Params: attributeSetPath, attributeName, defaultValue? |
create_ability | Create GameplayAbility BP. Params: name, packagePath?, parentClass? |
set_ability_tags | Set tags on ability. Params: abilityPath, ability_tags?, cancel_abilities_with_tag?, activation_required_tags?, activation_blocked_tags? |
create_effect | Create GameplayEffect BP. Params: name, packagePath?, durationPolicy? |
set_effect_modifier | Add modifier. Params: effectPath, attribute, operation?, magnitude? |
create_cue | Create GameplayCue. Params: name, packagePath?, cueType? |
get_info | Inspect GAS setup. Params: blueprintPath |
set_asc_defaults | Wire an AttributeSet onto a Blueprint's ASC component (DefaultStartingData) so attributes exist at runtime. Params: blueprintPath, attributeSet (content path or class name), componentName?, initDataTable? (starting values) |
apply_effect | Apply a GameplayEffect to a live actor's ASC (agnostic stat/damage stimulus - uses the game's own effect). Params: actorLabel, effectClass (content path or class name), level?, setByCaller? ((tag-or-name: magnitude)), world? (auto|pie|editor, default auto) |
set_attribute | Set a gameplay attribute's base value on a live actor's ASC (recalculates CurrentValue through the aggregator). Params: actorLabel, attribute (Health | SetName.Health), value, world? |
get_attribute | Read gameplay attribute base + current values on a live actor's ASC. Omit attribute to list all. Params: actorLabel, attribute?, world? |
init_asc | Initialize a live actor's ASC (InitAbilityActorInfo) and optionally instantiate an AttributeSet so attributes are live - the runtime setup step for testing a bridge-authored GAS actor. Params: actorLabel, attributeSet? (content path or class name), world? |
get_asc_state | Introspect a live actor's ASC: granted ability specs (class, level, inputID, active, dynamicTags) + owned gameplay tags. Params: actorLabel, world? (auto|pie|editor) (#587) |
networking
Networking and replication: actor replication, property replication, net relevancy, dormancy.
| Action | Description |
|---|---|
set_replicates | Enable actor replication. Params: blueprintPath, replicates? |
set_property_replicated | Mark a Blueprint variable as replicated. replicationType is 'None' | 'Replicated' | 'RepNotify'; repNotify=true is shorthand for RepNotify and replicated=true for Replicated. Params: blueprintPath, variableName (alias: propertyName), replicationType? | replicated? | repNotify? (#768) |
configure_net_frequency | Set update frequency. Params: blueprintPath, netUpdateFrequency?, minNetUpdateFrequency? |
set_dormancy | Set net dormancy. Params: blueprintPath, dormancy |
set_net_load_on_client | Control client loading. Params: blueprintPath, loadOnClient? |
set_always_relevant | Always network relevant. Params: blueprintPath, alwaysRelevant? |
set_only_relevant_to_owner | Only relevant to owner. Params: blueprintPath, onlyRelevantToOwner? |
configure_cull_distance | Net cull distance. Params: blueprintPath, netCullDistanceSquared? |
set_priority | Net priority. Params: blueprintPath, netPriority? |
set_replicate_movement | Replicate movement. Params: blueprintPath, replicateMovement? |
get_info | Get networking info. Params: blueprintPath |
demo
Neon Shrine demo scene builder and cleanup.
| Action | Description |
|---|---|
step | Execute demo step. Params: stepIndex? |
get_steps | List every demo step up front: index, id and description, plus a count. Use this to see what the 19 steps build before running any of them. Params: none |
cleanup | Remove demo assets and actors. Switches editor to /Game/MCP_Home before deleting so the editor is never left on an Untitled map |
go_home | Switch the editor to /Game/MCP_Home (creating it on first use). Use this before any operation that would leave the editor on an Untitled map |
feedback
Submit feedback when a native tool falls short: a missing action, a wrong result, a crash, or a gap you had to work around with execute_python. A python workaround is a common trigger but is not required. Reports are routed to the tracker that owns the surface - ue-mcp core, or the plugin that provides it (PIE Studio, Perforce, Meshy, ...) - by consulting the published plugin registry.
| Action | Description |
|---|---|
submit | Submit feedback about a tool gap (missing action, wrong behavior, crash, or a case you had to work around). Provide a specific title and a summary; pythonWorkaround and idealTool are optional enrichment, not prerequisites. Checks the plugin registry first and files against the owning plugin's repo when one matches, then blocks on an MCP elicitation prompt that asks the USER (not the agent) to approve or decline the exact payload - and to override the tracker - before anything is posted to GitHub |
route | Dry run the tracker routing for a report without posting anything. Returns the repo the issue would be filed against, the matched plugin (if any), and why. Params: title, summary, idealTool?, repo? |
statetree
StateTree asset editing: read, modify states/tasks/conditions/transitions/bindings/evaluators/global tasks/colors/state parameters/root parameters, compile and validate.
| Action | Description |
|---|---|
read | Full dump of a StateTree asset: state hierarchy (with description, tag, customTickRate, color), tasks, conditions, transitions, evaluators, global tasks, root params, bindings. Params: assetPath |
list_states | List all states with IDs and paths. Params: assetPath |
add_state | Add child state. Params: assetPath, stateId? (parent GUID, omit for root), name, stateType? (State|Group|LinkedAsset|Subtree), selectionBehavior?, insertIndex? |
remove_state | Remove a state by ID. Params: assetPath, stateId |
set_state_property | Set a property on a state. Params: assetPath, stateId, propertyName (name|type|selectionBehavior|bEnabled|weight|linkedAsset|description|tag|customTickRate|color), value |
clear_state_nodes | Remove all tasks/conditions/transitions from a state. Params: assetPath, stateId |
add_task | Add a task to a state. Params: assetPath, stateId, structType (C++ struct name e.g. FMyStateTreeTask or an engine-shipped task like FStateTreeRunParallelStateTreesTask), instanceProperties? |
add_enter_condition | Add an enter condition to a state. Params: assetPath, stateId, structType (C++ struct name), instanceProperties?, operand? (And|Or) |
remove_enter_condition | Remove an enter condition by index. Params: assetPath, stateId, conditionIndex |
remove_task | Remove a task by index. Params: assetPath, stateId, taskIndex |
set_task_instance_property | Set a property on a task's instance data. Params: assetPath, stateId, taskIndex, propertyName, value |
set_task_property | Set a property on the task's node struct (FStateTreeTaskBase-level: bConsideredForCompletion, bTaskEnabled, bShouldStateChangeOnReselect). Distinct from set_task_instance_property which targets instance data. Params: assetPath, stateId, taskIndex, propertyName, value (string-encoded e.g. 'true'/'false') |
add_transition | Add a transition to a state. Params: assetPath, stateId, trigger (OnStateCompleted|OnStateSucceeded|OnStateFailed|OnTick|OnEvent; combine with | e.g. OnStateSucceeded|OnStateFailed), transitionType (GotoState|NextState|Succeeded|Failed), eventTag?, targetStateId?, targetStatePath?, priority? (Low|Normal|Medium|High|Critical), delayDuration?, bDelayTransition? |
add_transition_condition | Add a condition to an existing transition. Params: assetPath, stateId, transitionIndex, structType, instanceProperties?, operand? |
remove_transition | Remove a transition by index. Params: assetPath, stateId, transitionIndex |
add_binding | Add a property binding. Params: assetPath, sourceStructId, sourcePath, targetStructId, targetPath |
remove_binding | Remove a property binding. Params: assetPath, targetStructId, targetPath |
list_bindings | List all property bindings. Params: assetPath, structId? (filter) |
list_bindable_sources | Enumerate the context/bindable sources in a StateTree (context objects, parameters, evaluators, global tasks, per-state nodes) with their structId + struct type - what a property can bind FROM. Params: assetPath (#681) |
add_evaluator | Add an evaluator to the StateTree (tree-level). Params: assetPath, structType (must derive from FStateTreeEvaluatorBase), instanceProperties? |
remove_evaluator | Remove an evaluator by node ID. Params: assetPath, nodeId |
set_evaluator_instance_property | Set a property on an evaluator's instance data. Params: assetPath, nodeId, propertyName, value |
set_evaluator_property | Set a property on the evaluator's node struct (FStateTreeEvaluatorBase-level). Params: assetPath, nodeId, propertyName, value |
add_global_task | Add a global task to the StateTree (tree-level). Params: assetPath, structType (must derive from FStateTreeTaskBase), instanceProperties? |
remove_global_task | Remove a global task by node ID. Params: assetPath, nodeId |
set_global_task_instance_property | Set a property on a global task's instance data. Params: assetPath, nodeId, propertyName, value |
set_global_task_property | Set a property on a global task's node struct (FStateTreeTaskBase-level). Params: assetPath, nodeId, propertyName, value |
list_colors | List all color palette entries for a StateTree. Params: assetPath |
add_color | Add a new color to the StateTree palette. Params: assetPath, displayName, color? (FLinearColor string e.g. '(R=1.0,G=0.0,B=0.0,A=1.0)') |
list_state_parameters | List parameters defined on a state. Params: assetPath, stateId |
add_state_parameter | Add a parameter to a state's property bag. Rejects fixed-layout (linked) states. Params: assetPath, stateId, paramName, paramType (Bool|Int32|Int64|Float|Double|Name|String|Text) |
remove_state_parameter | Remove a parameter from a state's property bag by name. Rejects fixed-layout (linked) states. Params: assetPath, stateId, paramName |
set_state_parameter | Set the value of an existing state parameter. On fixed-layout states, also marks the parameter as overridden. Params: assetPath, stateId, paramName, value |
set_root_parameters | Define root parameters (property bag). Params: assetPath, parameters[] ((name, type)) where type is float|int32|bool|string|name|double |
compile | Compile a StateTree asset. Returns success, errors[], warnings[]. Params: assetPath |
validate | Validate a StateTree asset without compiling. Params: assetPath |
chooser
Author ChooserTable assets (the data-driven selection layer behind Motion Matching): introspect columns, list/add/edit/delete rows mapping input-column conditions to an output object.
| Action | Description |
|---|---|
create | Create an empty ChooserTable asset. Add input columns with add_column, then rows with add_row. Params: name, packagePath? (default /Game), onConflict? (#685) |
describe | Introspect a ChooserTable: row count, each input column (index, name, columnType, cellType) and the fallback result. Read this first to learn the cell text format each column expects. Params: table (#685) |
add_column | Add an input column to a ChooserTable (so rows have a condition to fill). columnType is a Chooser column struct short name, e.g. EnumColumn, BoolColumn, FloatRangeColumn, GameplayTagColumn, ObjectColumn, or an Output* column. Optionally bind its input: inputStruct (parameter struct e.g. EnumContextProperty/BoolContextProperty), boundProperty (context property name to read), enumPath (for enum columns). Sizes the new column's cells to the current rows. Params: table, columnType, inputStruct?, boundProperty?, enumPath? (#685) |
list_rows | List every row: index, disabled flag, output object (resultType + referenced asset path), and each column's cell value as round-trippable text. Params: table (#685) |
add_row | Append a row. Set the output via output (asset path) + outputType ('asset' hard ref default | 'soft_asset' | 'evaluate' for a nested ChooserTable). Set input-column conditions via cells (array aligned to column order) and/or inputs (object keyed by column index or name). Cell values are struct text like '(Value=2)' - partial fields are allowed and unspecified ones keep defaults; a bare number/bool works for scalar columns. Params: table, output?, outputType?, cells?, inputs? (#685) |
set_row | Edit an existing row by index: optionally replace the output (output + outputType), toggle disabled, and/or update column cells (cells / inputs, same format as add_row). Params: table, index, output?, outputType?, disabled?, cells?, inputs? (#685) |
delete_row | Delete a row by index (removes its output plus the per-row cell from every column). Params: table, index (#685) |
list_object_references | List every leaf object reference reachable from a chooser, descending through nested chooser tables. list_rows renders those as an opaque resultType:NestedChooser with an empty output, so the actual PoseSearchDatabase/asset paths were invisible. Each entry reports the owning table, the exact location (e.g. ResultsStructs[3].Asset), the struct type and the current object path. Params: assetPath, classFilter? (match the referenced object's class), pathFilter? (substring on the path) (#754) |
remap_object_references | Repoint object references throughout a chooser's nested structure. Either an exact swap (from + to) or a folder rewrite (fromPrefix + toPrefix), which is the 'adopt vendor choosers into our namespace' case. DRY RUN BY DEFAULT - pass dryRun=false to apply. Object-typed targets are class-checked before assignment; the chooser is recompiled and left dirty rather than saved. Params: assetPath, from?+to? | fromPrefix?+toPrefix?, dryRun? (default true) (#754) |
plugins
Introspect npm-distributed plugins that contribute actions into other categories. Read-only.
| Action | Description |
|---|---|
list | Every plugin loaded from ue-mcp.yml: name, version, prefix, status, and injected actions |
describe | Full detail for one plugin including knowledge files and flows. Params: name |
epic
The Unreal 5.8 AI Toolset Registry itself: discovery (status/list_toolsets/describe_toolset), direct dispatch (call_tool), and the registry's own meta-tooling (agent skills, programmatic tool batching). Toolsets that map to a real editor domain are NOT here - they are injected as epic_ actions on that domain's category (GAS in gas, Sequencer in animation, Dataflow in dataflow, and so on), so reach for the domain tool first and use this one to introspect or call the registry directly. Requires UE 5.8+ with the ToolsetRegistry plugin enabled - call epic(status) first to check availability.*
| Action | Description |
|---|---|
status | Report whether Epic's ToolsetRegistry is available and how many toolsets are registered. Never errors (reports available=false with a reason when the plugin is absent). Params: none |
list_toolsets | List registered toolsets: name, version, description, tool names + count. Strips the verbose per-tool input/output schemas to stay small - use describe_toolset for those (or includeSchemas). Params: nameFilter? (case-sensitive substring on the qualified name), includeSchemas? (return full tool objects with input/output schemas) |
describe_toolset | Full schema for one toolset: every tool with its input/output JSON schema. Params: toolset (qualified name from list_toolsets, e.g. 'GASToolsets.AttributeSetToolset') |
call_tool | Execute a registered Epic tool exactly as its MCP server would. Params: toolset (qualified), tool (qualified name from describe_toolset, e.g. 'GASToolsets.AttributeSetToolset.ListAttributeSets'), input? (object) or inputJson? (raw JSON string) |
fab
Import Fab (Epic marketplace) content: check plugin/login status, trigger login/logout, sync your owned library into the Content Browser, inspect/clear the download cache, and import owned or local source files into the project.
| Action | Description |
|---|---|
status | Report Fab plugin state: whether the module is loaded, whether the native import/cache API is linked in this build, whether the Fab window has been opened this session, and the download cache location/size. Call this first |
login | Trigger the Fab login flow (EOS account portal). Asynchronous - returns once the flow is opened, not once authenticated. Complete any prompt, then call status |
logout | Clear the persistent Fab authentication for this device |
sync_library | Load the user's owned Fab library ("My Folder") into the Content Browser via TEDS. Requires an active login; items appear asynchronously. Params: batchSize? (items per sync request) |
list_cached | List the entries currently in the local Fab download cache (already-downloaded owned assets). Params: none |
cache_info | Report the Fab download cache location, total size, and entry count |
clear_cache | Delete the local Fab download cache to reclaim disk. Does not affect assets already imported into the project |
import_file | Import a source file into the project through the Fab Interchange import pipeline. Use for owned assets that are downloaded/cached locally, or any local source file (fbx, textures). Single files import synchronously and report the created asset paths; pack/quixel workflows may run asynchronously. Params: source (absolute path to the source file on disk), destination (content path like /Game/Fab/Imported) |