How PinWright compares

This page compares six tools that let an AI agent work in the Unreal Editor: PinWright, ue-mcp, Epic's built-in MCP in Unreal Engine 5.8, ChiR24 Unreal_mcp, VibeUE and Monolith. The list of rows started from the feature matrix that ue-mcp publishes and was extended with rows drawn from all six projects. Every cell was graded from each project's source code at the version or commit listed at the bottom of this page, then re-checked in a second, separate review pass. The data was checked on 2026-09-28. PinWright is our project, so weigh this page with that in mind. If a cell is wrong, open an issue and we will correct it.

How to read the matrix

Select any cell to see the grader's note and the source files it was based on.

Totals

ProductYesPartialNo
PinWright1709537
ue-mcp1789232
Epic UE 5.8 MCP74116110
ChiR24 Unreal_mcp10211189
VibeUE6017369
Monolith11312860

Counts cover 307 rows and leave out the last section of the matrix, "Also possible without an MCP server". They depend on which rows were chosen and are not a score. Value and not-applicable cells are not counted.

What PinWright covers that most others do not

What other tools cover that PinWright does not fully cover

The other tools

ue-mcp. A Node.js MCP server with a C++ editor bridge plugin, installed through an npx ue-mcp init wizard that also writes client configs. It covers the most rows in setup tooling, editor dialog handling, multi-editor and multi-project control, and animation and GAS debugging. It also includes a YAML workflow engine and an npm-based plugin registry. It runs on Windows, macOS and Linux, and on UE 5.8 it wraps Epic's native tools.

Epic UE 5.8 MCP. Ships inside UE 5.8 as the ModelContextProtocol and Toolsets plugins. Its tools are Python toolset functions and C++ functions marked AICallable. It covers Blueprint text authoring and decompile, Sequencer and Control Rig baking, MVVM, Dataflow, typed Project Settings, and running many calls in one sandboxed script. Projects can add their own Python or C++ tools with hot reload, and it can expose tools from other MCP servers as its own. The engine source repository needs an Epic Games account linked to GitHub, so evidence for this column is shown as engine paths without links.

ChiR24 Unreal_mcp. A Node.js server with an editor plugin, exposed as a single gateway tool over 389 capabilities, and supported on UE 5.0 to 5.8. Its access controls include scoped tokens, consent for each action, remote access that is refused unless authentication is set up, and blocking of dangerous input. It also implements MCP resources, prompts and completions, plus gameplay scaffolding such as weapons, inventory and online sessions.

VibeUE. A UE 5.8 plugin built on Epic's MCP and ToolsetRegistry, with 1,027 AICallable methods plus 8 tools. Its landscape and terrain tools include auto-materials, heightmaps from real-world GPS data, erosion and procedural map blockout. It also offers pose validation against learned bone limits, Mutable character graphs, and play scenarios described in a file.

Monolith. An MIT-licensed plugin for UE 5.7 and 5.8. It ships prebuilt zips for each engine version and a small native launcher that connects the MCP client to the editor, with about 1,400 actions across 26 namespaces. It focuses on static and offline analysis: SQLite full-text search over assets, a C++ reflection index linked to assets, and INI diffs against engine defaults. It also covers level analysis (sightlines, per-region performance cost, lighting coverage, acoustics) and GAS, Enhanced Input, accessibility and CommonUI audits.

Feature matrix

Products

On a narrow screen, untick products to compare two side by side.

Showing all 307 rows.

Skip to audited versions

Architecture and install

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Works without a C++ project

No C++ project needed on Windows: the prebuilt Win64 zip and Fab ship binaries. Linux needs a source build of the plugin.

Evidence

Blueprint-only projects work, but a C++ toolchain (Visual Studio or Xcode) must compile the plugin.

Evidence

Engine plugin with prebuilt editor DLLs; enabling it in a Blueprint project needs no C++ build.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Binaries/Win64/UnrealEditor-ModelContextProtocol.dll
  • Engine/Plugins/Experimental/ToolsetRegistry/Binaries/Win64/UnrealEditor-ToolsetRegistry.dll

A source install needs a project with a code target; a self-built package works in Blueprint-only projects.

Evidence

C++ editor plugin, but BuildPlugin.bat builds it via UAT BuildPlugin without project Source.

Evidence

Per-engine release zip ships precompiled DLLs, so Blueprint-only projects open without rebuilding.

Evidence
Precompiled binaries

Per engine version Win64 zips on GitHub Releases plus Fab listing; no Linux or Mac prebuilt.

Evidence

No. Plugin ships as source only (plugin/ue_mcp_bridge has Source, no Binaries); compiled on first launch.

Evidence

Precompiled Win64 editor binaries ship with the engine for MCP, ToolsetRegistry and toolset plugins.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Binaries/Win64/UnrealEditor-ModelContextProtocolEditor.dll
  • Engine/Plugins/Experimental/ToolsetRegistry/Binaries/Win64/UnrealEditor-ToolsetRegistry.dll

No shipped binaries; release archives strip Binaries. Users can build their own via package-plugin script.

Evidence

Repo ships no Binaries (MakePlugin.ps1 excludes them); prebuilt only through the Fab listing.

Evidence

Release zips Monolith-vX-UE5.7.zip and -UE5.8.zip carry Win64 binaries plus proxy and query exes.

Evidence
UE versions
5.3 to 5.8

UE 5.3 to 5.8.

Evidence
5.4 to 5.8

5.4 to 5.8 on Windows; 5.6+ on Linux and macOS; epic category needs 5.8+.

Evidence
5.8

UE 5.8 only; plugin is part of the 5.8 engine tree, not a separate versioned install.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin (IsExperimentalVersion true, Installed false)
5.0 to 5.8

UE 5.0 to 5.8 per README badge, uplugin description and README note.

Evidence
5.8+

5.8+ only (EngineVersion 5.8.0; depends on Epic 5.8 MCP and ToolsetRegistry).

Evidence
5.7, 5.8

UE 5.7 and 5.8, one source tree, separate precompiled zip per engine.

Evidence
Platform
Windows, plus Linux from source

Windows (Win64) and Linux; no Mac. Prebuilt binaries are Windows only, Linux builds from source.

Evidence
Windows, Mac, Linux

Windows, macOS, Linux (Linux and macOS only from UE 5.6); bridge uses raw sockets for all three.

Evidence
Windows, Mac, Linux

Win/Mac/Linux editor: no PlatformAllowList in any .uplugin; Linux build intermediates present.

Evidence
  • grep PlatformAllowList in ModelContextProtocol, ToolsetRegistry, Toolsets\*\*.uplugin: no hits
  • ModelContextProtocol\Intermediate\Build\Linux and LinuxArm64 folders
Windows, Mac, Linux

Win64, Mac, Linux in module PlatformAllowList.

Evidence
Windows, Mac, Linux

Win64, Linux, Mac (module WhitelistPlatforms; .ps1 and .sh build scripts).

Evidence
Windows, plus Mac and Linux from source

README lists Win, Mac and Linux; shipped binaries and the native proxy are Win64 only, and Mac and Linux build from source.

Evidence
Works without an API key

No API key or account; only a local bearer token auto generated in Saved/PinWright/gateway-token.

Evidence

No API key needed. Optional GitHub OAuth only for feedback(submit); ANTHROPIC_API_KEY only for a dev script.

Evidence

No key needed; grep for Authorization, Bearer, api key, token in server source found nothing.

Evidence
  • ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp (only Origin check at :73, no auth header handling)

No external API key; auth uses a locally auto-generated capability token.

Evidence
  • README.md:52 (auto-generated token at Saved/MCP/capability-token)
  • grep api key in README.md docs/*.md: no hits

No key for most tools; a free vibeue.com API key is required for the terrain_data tools.

Evidence

No API key or token; grep for bearer, api key, auth token in Source, Tools, MCP, Scripts found none.

Evidence
License
MIT

MIT.

Evidence
MIT
UE EULA

Unreal Engine EULA (source available, not OSS); plugins marked NoRedist.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin NoRedist true
  • Copyright Epic Games headers in Source
MIT

MIT for server and plugin.

Evidence
  • LICENSE (MIT License)
  • plugins/McpAutomationBridge/LICENSE (MIT License)
MIT

MIT, Copyright 2025 Kevin Buckley / Buckley Builds LLC.

Evidence
MIT

MIT.

Evidence
Works without a running editor

Only editor launch tools run without an editor; every call(), including wiki lookup, needs a live editor.

Evidence

Only filesystem reads work offline: INI parsing, C++ headers, asset dir listing, check_install.

Evidence

Tools run in the editor process; only commandlet is ToolHashMapping for analytics, not a tool server.

Evidence
  • ModelContextProtocolEditor/Private/ModelContextProtocolToolHashMappingCommandlet.h:12
  • Toolsets\*\*.uplugin EditorOnly true

Only get_project_settings runs without editor, and only when no capability token is configured.

Evidence

All tools run in the editor process; skips services under commandlets. Searched for offline/commandlet mode.

Evidence

monolith_query.exe and monolith_offline.py serve source, project and reflection queries read-only offline.

Evidence
Operation count (units differ per product)
1,262

1,262 operations in 68 namespaces, all behind one MCP tool named call.

Evidence
1,136 plus 830 wrappers

1,136 own actions plus 830 epic_ wrappers on UE 5.8. The README gives 1,103, an earlier count.

Evidence
about 870

About 870: ~597 Python @toolset_registry.tool_call plus 273 C++ AICallable UFUNCTIONs, tests excluded.

Evidence
  • grep -c @toolset_registry.tool_call *.py in Experimental\Toolsets and ToolsetRegistry: 612 incl 15 in test files
  • grep -c AICallable *.h in Toolsets, ToolsetRegistry, ModelContextProtocol: 296 incl 23 in test files
389

389 capabilities across 23 internal parent tools behind one unreal gateway tool.

Evidence
1,027

1,027 AICallable service methods in 37 headers plus 8 REGISTER_VIBEUE_TOOL tools; Epic toolsets extra.

Evidence
about 1,400

About 1,400+ actions across 26 namespaces behind about 30 dispatch tools; live count via monolith_discover.

Evidence
Auto-writes MCP client config

Setup screen one click writes project config for Claude Code, Codex, Cursor, Gemini CLI, VS Code.

Evidence

init detects and writes configs for Claude Code, Claude Desktop, Cursor, Codex.

Evidence

Console command writes URL configs for Claude Code, Cursor, VS Code, Gemini CLI, Codex; run manually.

Evidence
  • ModelContextProtocolEngine/Private/ModelContextProtocolEngineModule.cpp:41 ModelContextProtocol.GenerateClientConfig
  • ModelContextProtocolEngine/Private/ModelContextProtocolClientConfig.cpp:177 WriteAllClientConfigurations

Searched src and scripts for mcpServers, claude_desktop_config, .mcp.json writers; README has manual JSON.

Evidence

Via Epic toolset: .mcp.json from ModelContextProtocol.GenerateClientConfig; VibeUE writes only the agent guide.

Evidence

User writes .mcp.json by hand; grep for .mcp.json and mcpServers found only usage comments, no writer.

Evidence
No external runtime (Node.js/Python) required

Server is in process C++; optional stdio proxy runs on UE bundled Python stdlib; direct HTTP needs nothing.

Evidence

Requires Node.js (README says 18+, package.json engines >=20) plus PythonScriptPlugin in editor.

Evidence

C++ HTTP server in editor; Python tools use the engine's bundled PythonScriptPlugin, no Node needed.

Evidence
  • ModelContextProtocolServer.cpp:13 HttpServerModule include, :432 GetHttpRouter
  • ToolsetRegistry.uplugin depends on PythonScriptPlugin (bundled)

Plugin embeds MCP Streamable HTTP server; no Node.js or npm needed for that path.

Evidence

Runs inside the editor; Python is the engine's embedded PythonScriptPlugin, no Node or external Python.

Evidence

Native monolith_proxy.exe or direct streamableHttp config; only the Mac/Linux proxy script needs Python.

Evidence
Network MCP transport (HTTP/SSE)

Streamable HTTP at /mcp with SSE progress streams when the client accepts text/event-stream.

Evidence

Searched src for SSE and Streamable HTTP; MCP is stdio only. Loopback HTTP exposes only flow routes.

Evidence

Streamable HTTP: POST/GET/DELETE on /mcp, SSE event stream responses, default port 8000.

Evidence
  • ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:435-441 BindRoute
  • ModelContextProtocolServer.cpp:278 FormatSSEMessage
  • ModelContextProtocolSettings.h:38 ServerPortNumber=8000

Native Streamable HTTP with SSE at http://localhost:3000/mcp inside the plugin.

Evidence

Via Epic toolset: tools ride Epic's HTTP endpoint 127.0.0.1:8000/mcp; VibeUE has no own transport.

Evidence

In-editor HTTP server on port 9316, POST /mcp streamable HTTP; GET returns one SSE event then closes.

Evidence
Remote/LAN access with fail-closed auth

Bind is hardcoded to loopback and docs forbid LAN exposure; bearer token auth exists but only for local use.

Evidence

Bridge binds 127.0.0.1 with no auth; flow HTTP has a token but rejects non localhost Host headers.

Evidence

Binds localhost by default; LAN needs engine ini BindAddress and then has no auth, only Origin check.

Evidence
  • Engine/Source/Runtime/Online/HTTPServer/Private/HttpServerConfig.h:13 BindAddress localhost
  • ModelContextProtocolServer.cpp:73 ValidateOriginHeader, no auth token

Non-loopback bind refused unless bRequireCapabilityToken is on; token on by default.

Evidence

README states endpoint is loopback only with no authentication; no auth code found in Source.

Evidence

Binds all interfaces with no auth; only a CORS origin check; docs tell users to firewall port 9316.

Evidence
Install methodHow each product installs, including ue-mcp deploying its plugin source into the project.
Fab, zip or source

Fab via Epic Launcher, prebuilt Win64 zip from GitHub Releases, or git clone and build; then Setup screen.

Evidence
npx init and plugin deploy

npx ue-mcp init: wizard deploys the C++ plugin source, enables UE plugins, writes MCP client configs; ue-mcp deploy also copies the bridge plugin into a project.

Evidence
Ships in engine

Ships in engine; enable ModelContextProtocol plus Toolsets plugins, then StartServer command or bAutoStartServer.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin (EnabledByDefault false)
  • ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolModule.cpp:31 ModelContextProtocol.StartServer
  • ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:42 bAutoStartServer=false
npx and plugin copy

npx unreal-engine-mcp-server plus manual copy of plugin into Plugins/; or plugin only via native HTTP.

Evidence
Source build or Fab

git clone into Plugins then BuildPlugin.bat or BuildAndLaunchGame script; Fab listing also offered.

Evidence
Source or zip

git clone or release zip into Plugins/Monolith, then hand-write .mcp.json pointing at monolith_proxy.exe.

Evidence
Update tooling (one-command update, notices)Updating server and plugin together, automatic updates, and telling the agent a newer version exists.

One-command update (server + plugin) (Partial): Server and proxy live inside the plugin so one plugin update covers both; no update command, via Fab or zip.

  • README.md:30 (Releases zip, Fab, git clone)
  • Grep for self update/check for update in Source and mcp_proxy.py found nothing

Auto-updater (No): Searched update check, auto update, releases/latest in Source and proxy; none found.

Upgrade notice in tool responses (No): No release or update check. EDITOR_PLUGIN_OUTDATED is a proxy/binary readiness mismatch error, not an upgrade notice.

  • Content/Python/mcp_proxy.py:1912-1924 EDITOR_PLUGIN_OUTDATED fires only when the compiled binary predates the readiness protocol and says to rebuild; it does not compare against any published release
  • Grep for 'releases/latest|api.github|latest release|check.?for.?update|fab.com' over Source, Content/Python, Resources and .uplugin: no hits
  • Grep for 'upgrade|newer version|update available|outdated' in docs/wiki-src: only unrelated hits (foliage BuildTreeIfOutdated, SSE upgrade, engine Target Upgrade dialog in unattended.md:155)
  • Grep for update/upgrade terms in Source/PinWright/Private/PinWrightModule.cpp, Setup/ and Transport/: no version-notice code

One-command update (server + plugin) (Yes): ue-mcp update: npm update, plugin deploy, rebuild; rebuild needs the editor closed.

Auto-updater (Yes): Startup npm version check notice plus ue-mcp update CLI that runs npm install; not automatic.

Upgrade notice in tool responses (Yes): npm registry check cached 24h; notice is added once to the next tool response.

One-command update (server + plugin) (Not applicable): Bundled in the engine; server and plugins update only with an engine version upgrade.

  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin (engine plugin, Installed false)

Auto-updater (Not applicable): Ships as engine plugins inside UE 5.8; updates arrive with engine releases, no separate updater.

  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin (engine plugin)

Upgrade notice in tool responses (No): Searched newer version, update available, upgrade, outdated in MCP, registry and toolsets; nothing found.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source (grep, no match)
  • Engine/Plugins/Experimental/ToolsetRegistry (grep, no match)

One-command update (server + plugin) (Partial): npx fetches server; plugin copied separately by dev script sync-mcp-plugin.js from a repo clone.

Auto-updater (No): Searched auto update, self update, registry.npmjs, api.github, releases/latest; nothing found.

  • rg auto.?updat|self.?updat|registry\.npmjs|api\.github|releases/latest over src and plugins: no hits

Upgrade notice in tool responses (No): Searched upgrade, newer/latest version, npm registry, version mismatch; only serverVersion in handshake.

One-command update (server + plugin) (No): No update command found; update means git pull and rebuild. Searched Source and scripts for update logic.

Auto-updater (No): Searched AutoUpdate, CheckForUpdate, releases/latest; install is git clone or FAB.

  • README.md Step 2 git clone
  • grep AutoUpdate returned no matches

Upgrade notice in tool responses (No): Searched update available, newer/latest version, upgrade; no version check or notice in responses.

  • grep -i 'update available|newer version|latest version|upgrade|CheckForUpdate' over Source and Content/Python: no relevant hits

One-command update (server + plugin) (Yes): monolith.update install stages the release zip, which includes the proxy, and swaps the plugin on editor exit.

Auto-updater (Yes): Opt-in GitHub Releases updater with SHA256 check, swaps plugin on exit; monolith.update action.

Upgrade notice in tool responses (Partial): No notice injected in tool responses; monolith_update check action plus editor Slate toast on startup check.

CLI and setup

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Generates agent instruction files

Seeds CLAUDE.md and AGENTS.md only in the asset dump root; server instructions sent via MCP, no project files.

Evidence

init copies shipped SKILL.md files into .claude/skills (Claude Code only); no CLAUDE.md or AGENTS.md writer.

Evidence

Writes only MCP server config files; searched CLAUDE.md, AGENTS.md, GEMINI.md, cursorrules, copilot writers.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolClientConfig.h EModelContextProtocolClient (.mcp.json, mcp.json, settings.json, config.toml)

No instruction file writer; NativeMCPInstructions setting is sent only in the MCP initialize response.

Evidence

VibeUE.GenerateAgentConfig writes CLAUDE.md, GEMINI.md, AGENTS.md or copilot file as a managed block.

Evidence

README says paste namespace list to your AI; ships Skills/ for manual copy and a runtime monolith.guide action.

Evidence
Install diagnostics command (doctor)Diagnoses a broken or not-yet-possible install.

Doctor diagnostics command (Partial): No doctor command; Setup tab shows server status, port in use and outdated configs; proxy flags stale plugin.

Install feasibility check (Partial): No standalone doctor; Install checks bundled Python and proxy script, writes HTTP fallback, reports error.

Doctor diagnostics command (Yes): ue-mcp doctor: read-only report of versions, npx shadowing, running servers, deployed bridge version.

Install feasibility check (Yes): inspectInstall checks C++ toolchain, engine, plugin deploy state from disk; run by init and project(check_install).

Doctor diagnostics command (No): No doctor command; console cmds are only RefreshTools, StartServer, StopServer, GenerateClientConfig.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolModule.cpp:23,32,59
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolEngineModule.cpp:41

Install feasibility check (No): No install feasibility or prerequisite check; searched doctor, diagnos, health, setup, install in MCP and Toolsets.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source
  • Engine/Plugins/Experimental/Toolsets

Doctor diagnostics command (Partial): No doctor command; ue://health MCP resource reports bridge status, readiness probes and session diagnostics.

Install feasibility check (No): Searched for feasibility, code target or engine fit checks in src, scripts, plugin; none found.

  • grep feasib|can_install|code target|blueprint-only over src, scripts, plugin Source: no check logic
  • README.md Step 2

Doctor diagnostics command (Partial): No doctor command; automatic startup probe of MCP port logs listener errors, plus health/readiness JSON files.

Install feasibility check (No): No feasibility check; scripts only auto-detect engine path via registry or EngineAssociation. Searched prereq/version.

Doctor diagnostics command (Partial): No doctor CLI; MCP action monolith.status reports version, port, action count, module status from live editor.

Install feasibility check (No): No install feasibility check; searched feasib, preflight; preflight hits are release script and asset validators.

Guided setup (CLI wizard or in-editor screen)An interactive setup flow, in a terminal or inside the editor, including detecting drifted client configs.

Interactive setup wizard (Partial): No CLI wizard; in-editor PinWright Setup tab with one-click Install per agent (5 clients) plus copyable prompt.

In-editor setup screen with config drift check (Yes): Setup tab marks each agent config Configured, Outdated or NotConfigured; opens on launch when a config is outdated.

Interactive setup wizard (Yes): npx ue-mcp init: interactive wizard with category checkboxes, MCP client selection, plugin enablement.

In-editor setup screen with config drift check (No): Searched plugin for tab spawners, UDeveloperSettings, ToolMenus, setup UI; BridgeStatus module is a heartbeat only.

Interactive setup wizard (No): No setup wizard; searched MCP, ToolsetRegistry, Toolsets for menus, tabs, Slate UI, setup commandlets.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source (grep ToolMenus/AddMenuEntry/RegisterNomadTab/SNew: none outside tests)

In-editor setup screen with config drift check (Partial): Project Settings page has port, URL path, autostart, tool search; no client config drift check.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:24-46 UModelContextProtocolSettings
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolSettings.cpp PostEditChangeProperty

Interactive setup wizard (No): No setup wizard. cli.ts only starts the stdio server with no argv parsing; setup is manual per README.

In-editor setup screen with config drift check (Partial): Status bar widget shows port and sessions and opens the Project Settings page; no config drift check.

Interactive setup wizard (No): No setup wizard. Searched scripts and Source for wizard/setup; BuildPlugin.bat only prompts for engine path.

In-editor setup screen with config drift check (No): Only an Editor Preferences page holding an API key; no setup screen or drift check. Searched Slate tabs, settings.

Interactive setup wizard (No): No setup wizard; README install is manual git clone plus hand-written .mcp.json. Searched wizard/setup/onboard.

In-editor setup screen with config drift check (No): Editor settings page has only Re-Index buttons; no setup screen or .mcp.json drift check in Source.

Blueprints

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Function CRUD

add_function (incl. overrides), remove_function, set_function_settings, decompile_function.

Evidence

create_function, delete_function, rename_function, list_functions, set_function_properties, param CRUD.

Evidence

add_function_graph, remove_function_graph, add/remove function params, list_functions.

Evidence
  • blueprint.py:287 add_function_graph
  • blueprint.py:370 remove_function_graph
  • blueprint.py:394 add_function_param
  • blueprint.py:440 remove_function_param

Create, read, params and locals in VibeUE; no function delete, remove_function_graph via Epic toolset.

Evidence

add/remove/rename_function, set_function_params, override_parent_function, get_functions.

Evidence
Node CRUD + connect

create_node, delete_node, set_node_property, connect_pins, break_pin_links, reroute nodes.

Evidence

add_node, delete_node, set_node_property, refresh_node, connect_pins, disconnect_pins.

Evidence

create_node, delete_node, connect_pins, break_pins, set_pin_value, add/remove dynamic pins.

Evidence
  • blueprint.py:877 create_node
  • blueprint.py:919 delete_node
  • blueprint.py:1058 connect_pins
  • blueprint.py:1074 break_pins
  • blueprint.py:1091 set_pin_value

create_node_by_key, delete_node, connect_nodes, disconnect_pin, set_node_pin_value, configure_node.

Evidence

add_node, remove_node, connect_pins, disconnect_pins, set_pin_default, set_node_position.

Evidence
Batch connect (single compile)

connect_pins takes one link; many links wired with one compile only via compile_bpir text.

Evidence

connect_pins_batch applies many connections then compiles and saves once.

Evidence

connect_pins does not compile; write_graph_dsl wires a whole graph then compiles once; execute_tool_script batches calls.

Evidence
  • blueprint.py:1058 connect_pins (no compile)
  • blueprint.py:1454 write_graph_dsl (compile once at end)
  • programmatic.py:906 execute_tool_script

build_graph runs up to N create/connect/default steps then compiles and saves once.

Evidence

build_graph creates nodes, wires connections, sets defaults in one transaction with optional compile.

Evidence

connect_pins_bulk wires many links in one transaction; batch_execute has compile_on_complete.

Evidence
Auto-layout graph

Auto-layout only for BPIR bodies without @(x,y); no standalone relayout of an existing BP graph.

Evidence

auto_layout topological layered layout, returns previous positions for undo.

Evidence

arrange_nodes runs a layered left to right GraphFormatter with crossing minimisation.

Evidence
  • blueprint.py:1030 arrange_nodes
  • blueprint_layout.py:84 GraphFormatter

auto_layout_graph, auto_layout_selected_nodes, analyze_graph_layout quality report.

Evidence

auto_layout: built-in Sugiyama layout, all/new_only/selected modes, optional Blueprint Assist.

Evidence
Bulk graph rewrite (T3D/JSON)

compile_bpir upserts whole entry graphs from BPIR text; format is BPIR, not T3D or JSON.

Evidence

export_nodes_t3d and import_nodes_t3d (Ctrl+C/Ctrl+V T3D round trip); also export_batch.

Evidence

write_graph_dsl rewrites event and function bodies from S-expression text and deletes stale nodes; no T3D or JSON.

Evidence
  • blueprint.py:1454 write_graph_dsl
  • blueprint_dsl.py:1627 Transpiler.transpile
  • blueprint_dsl.py:769 _GraphSnapshot.delete_stale

build_graph takes a JSON list of additive edits; no T3D import or whole graph replace found.

Evidence

build_graph adds from JSON style descriptors, no clear or replace of existing graph, no T3D.

Evidence

build_blueprint_from_spec builds a graph from JSON; export_graph emits it; copy_nodes uses T3D.

Evidence
Set class default (CDO) property

blueprint.set_default writes CDO property via reflection and compiles.

Evidence

set_class_default on Blueprint CDO; set_cdo_property for any C++ class CDO.

Evidence

ObjectTools.set_properties on a Blueprint targets its CDO via JSON values; reset_properties also exists.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties
  • object.py:119 _get_instance_object returns CDO for Blueprint

set_default writes any CDO property incl. nested paths; inspect_cdo reads CDO.

Evidence

set_property writes a CDO property by native name from a string value.

Evidence

set_cdo_property and set_cdo_properties write Blueprint CDO values via ImportText.

Evidence
Compile / batch compile

blueprint.compile takes one asset path; no multi-asset batch compile operation found.

Evidence

compile reports errors and messages; compile_all batch compiles and saves with per path status.

Evidence

compile_blueprint with warnings_as_errors returns node error messages; batch only by looping in execute_tool_script.

Evidence
  • blueprint.py:199 compile_blueprint
  • ToolsetRegistry/Content/Python/toolset_registry/helpers.py:30 compile_blueprint
  • programmatic.py:906 execute_tool_script

compile handles one Blueprint with diagnostics and optional save; no multi Blueprint batch compile.

Evidence

compile_blueprint returns errors per asset; no multi asset batch compile operation.

Evidence

compile_blueprint compiles one asset; no multi-asset compile, only editor.list_errored_blueprints scan.

Evidence
Validate without saving

blueprint.compile is in-memory only and returns errors and warnings; saving is a separate asset.save.

Evidence

validate compiles with SkipSave and returns diagnostics.

Evidence

compile_blueprint reports errors without saving but mutates the in memory asset; no dry run validator.

Evidence
  • helpers.py:30 compile_blueprint
  • searched toolsets for validate/dry_run: none for Blueprints

compile defaults to saveAfterCompile false: compiles in memory, returns diagnostics, does not save.

Evidence

compile_blueprint compiles in memory and returns error text without saving the asset.

Evidence

validate_blueprint reports unused vars, disconnected nodes, stored compiler messages; no save.

Evidence
Interfaces / dispatchers / macros

add_interface, remove_interface, add_dispatcher, add_macro, decompile_macro.

Evidence

create/add/remove/list interface, add/list/remove event dispatcher, create/delete macro.

Evidence

Dispatchers add/list; engine standard macro nodes placeable; no add interface or macro graph tools.

Evidence
  • blueprint.py:1403 add_event_dispatcher
  • blueprint.py:50 get_macros (StandardMacros only)
  • grep ImplementNewInterface/add_interface/AddMacroGraph in Toolsets: none

Standard macro nodes, bound events, fixed interactable interface only; no interface add or dispatcher op.

Evidence

add/remove_interface, add_event_dispatcher with params, create_macro_graph, add_macro_instance_node.

Evidence

implement_interface, add_event_dispatcher, add_macro plus remove/rename and detail queries.

Evidence
Construction script preview

No preview or rerun op; spawning a BP class runs its construction script, python.execute can rerun it.

Evidence

run_construction_script spawns temp actor and returns generated components and transforms.

Evidence

Searched toolsets for construction script run or preview; only Niagara C++ gets the UCS graph for editing.

Evidence
  • NiagaraToolset_Blueprint.cpp:77 GetConstructionScriptGraph (graph access only)
  • grep ConstructionScript/rerun in Toolsets

add_construction_script only ensures the graph exists; searched RerunConstructionScripts, preview: none.

Evidence

refresh_blueprint_editor reruns construction script in open editor viewport; no preview result returned.

Evidence

get_construction_script only lists CS nodes; running it needs spawn_blueprint_actor into a level.

Evidence
Auto-rollback when an edit breaks compile

compile_bpir and insert_bpir roll back the transaction when the BP compile fails; undo_last_bpir too.

Evidence

Flow rollback_on_failure fires on success:false only; compile with errors returns success true.

Evidence

write_graph_dsl rolls back new nodes on transpile error; no rollback when the following compile fails.

Evidence
  • blueprint_dsl.py:745 _GraphSnapshot.rollback
  • blueprint_dsl.py:1719 rollback in except
  • blueprint.py:1474 compile after transpile, no rollback

build_graph prechecks steps but keeps applied steps on failure and only warns if compile fails.

Evidence

Bulk maintenance undoes the transaction when compile or save fails; interface and metadata ops only.

Evidence

Searched rollback/Undo/BS_Error in MonolithBlueprint; compile errors are reported, edits not reverted.

Evidence
Reparent Blueprint to new parent class

blueprint.reparent changes parent UClass and recompiles.

Evidence

reparent changes ParentClass, recompiles and saves, checks writability first.

Evidence

set_parent calls BlueprintEditorLibrary.reparent_blueprint.

Evidence
  • blueprint.py:1134 set_parent

No reparent in VibeUE (only get_parent_class); set_parent via Epic toolset.

Evidence

reparent_blueprint changes a Blueprint's parent class.

Evidence
Dead Blueprint code detection and cleanup

find_orphaned_nodes, delete_orphaned_nodes and delete_unused_variables with dryRun.

Evidence

audit_dead_code detects but is report only; cleanup_graph removes only broken nodes, not dead code.

Evidence

write_graph_dsl deletes nodes unreachable from exec roots as a side effect; no detection tool.

Evidence
  • blueprint_dsl.py:769 delete_stale
  • searched blueprint*.py for unused/dead/orphan: none

No dedicated op; only via consent gated execute_python calling engine BlueprintEditorLibrary.

Evidence

No dead node detection; unused variable sweep only via engine BlueprintEditorLibrary in Python.

Evidence

validate_blueprint detects unused variables and disconnected nodes; no cleanup or removal action.

Evidence
Callable-API index and node pin preview

build_api_index and search_api over reflection; get_node_type_pins previews pins of a node type.

Evidence

search_node_types indexes callables without pins; pin preview via Epic tool (UE 5.8) or reflect_class.

Evidence

find_node_types and find_node_categories index spawnable actions; get_node_type_pins previews pins.

Evidence
  • blueprint.py:752 find_node_types
  • blueprint.py:806 find_node_categories
  • blueprint.py:786 get_node_type_pins

list_node_types lists K2Node classes by name only; no function index or pin preview.

Evidence

discover_nodes indexes spawnable nodes without pins; get_node_type_pins preview via Epic toolset.

Evidence

search_functions indexes BP-callable functions; resolve_node dry-runs a node and returns its pins.

Evidence
Timeline authoring (tracks and keys)

BPIR timeline instruction creates float_curve tracks with keys only; no vector, color or event tracks.

Evidence

add_timeline_track creates timeline, curve and keys; add only, no track edit or removal action.

Evidence

Searched toolsets for timeline; no track or key authoring tools.

Evidence
  • grep -i timeline in Toolsets: only AnimationAssistantToolset sequencer/keyframing, none for Blueprints

add_timeline, float/vector/color/event tracks and keys, rename, remove, clear keys.

Evidence

add_timeline, add_timeline_track, set_timeline_keys, get_timeline_data.

Evidence
Blueprint override drift vs native defaults

inspect includeProperties lists CDO values differing from immediate parent CDO; no dedicated drift report.

Evidence

Searched drift, Identical, overridden, nonDefault in BP handlers; only variable vs authored default check.

Evidence

Searched for override diff; only reset_properties to parent defaults, no drift report.

Evidence
  • object.py:98 reset_properties
  • grep override/drift in editor_toolset: none for Blueprints

Searched override drift, CDO diff vs parent defaults; nothing found beyond plain inspect_cdo reads.

Evidence

Searched drift and non-default vs parent CDO; diff_blueprints and compare_components compare two assets.

Evidence

blueprint.audit_cdo_drift scans BP CDOs whose defaults differ from native parent CDO.

Evidence
Read Blueprint structure and full graphReads classes, variables, components and every graph node, pin and link.

Read blueprint structure (Yes): blueprint.inspect returns structural read; blueprint.get gives registry summary.

Full graph (nodes, pins, connections) (Yes): get_graph_details, get_graph_connections, get_nodes and pin detail reads.

Read blueprint structure (Yes): blueprint(read) returns SCS plus inherited native components; also list_variables, list_functions, list_graphs.

Full graph (nodes, pins, connections) (Yes): read_graph with includePins, read_graph_summary exec/data edges, get_connections by node GUID.

Read blueprint structure (Yes): BlueprintTools list_graphs, list_functions, list_events, list_variables, list_event_dispatchers, get_parent.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:233 list_graphs
  • blueprint.py:265 list_functions
  • blueprint.py:1255 list_variables
  • blueprint.py:1423 list_event_dispatchers

Full graph (nodes, pins, connections) (Yes): get_node_infos returns nodes with pins, types, values and connected pins; find_nodes and get_connected_subgraph.

  • blueprint.py:597 get_node_infos
  • blueprint_node.py NodeInfo/PinInfo connected_pins
  • blueprint.py:681 find_nodes
  • blueprint.py:722 get_connected_subgraph

Read blueprint structure (Yes): manage_blueprint get_blueprint returns variables, functions, graphs and SCS components.

Full graph (nodes, pins, connections) (Yes): inspect_graph get_graph_details/get_node_details/get_pin_details list nodes, pins and linkedTo.

Read blueprint structure (Yes): get_blueprint_info returns parent, variables, functions, components; list_graphs, list_components.

Full graph (nodes, pins, connections) (Yes): get_nodes_in_graph, get_node_pins, get_connections, get_node_details, get_graph_definition.

Read blueprint structure (Yes): get_blueprint_info gives parent, graphs, counts, compile status; list_graphs, get_variables etc.

Full graph (nodes, pins, connections) (Yes): get_graph_data returns nodes, pins and links; get_node_details gives a full pin dump per node.

Variable and component CRUDAdds, edits and removes Blueprint variables and components.

Variable CRUD (Yes): add_variable, remove_variable, rename_variable, set_variable_settings and set_variable_metadata.

Component CRUD (Yes): blueprint.scs add, remove, duplicate, reparent, set_property, set_transform, batch modify_scs.

Variable CRUD (Yes): add_variable, list_variables, set_variable_properties, set_variable_default, rename_variable, delete_variable.

Component CRUD (Yes): add_component, remove_component, set/get_component_property, reparent_component.

Variable CRUD (Yes): add_variable, add_struct_variable, add_object_variable, list_variables, remove_variable, category and replication setters.

  • blueprint.py:1154 add_variable
  • blueprint.py:1372 remove_variable
  • blueprint.py:1309 set_variable_replication
  • blueprint.py:1353 set_variable_category

Component CRUD (Yes): ActorTools add_component, remove_component, get_components, set_parent_component work on Blueprints via SDS.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:392 add_component (accepts Blueprint owner, line 424)
  • actor.py:488 remove_component
  • actor.py:356 get_components
  • actor.py:257 set_parent_component

Variable CRUD (Yes): add_member_variable, remove_member_variable, set_variable_default_value, get_variable_info.

Component CRUD (Yes): add, remove, reparent, set root, get/set component property, collision settings.

Variable CRUD (Yes): add/remove/rename_variable, set_variable_type, set_variable_defaults, local variable add/remove.

Component CRUD (Yes): add/remove/rename/duplicate/reparent_component, set_component_property, get_components.

Call-site search and execution flow traceFinds where a function or event is used and follows execution paths through graphs.

Project-wide call-site search (Yes): blueprint.search runs Find-in-Blueprints over all indexed BPs; blueprint.references per asset.

Execution flow trace (Yes): get_execution_flow walks exec pins BFS from an entry; get_node_connections for exec topology.

Project-wide call-site search (Yes): search_call_sites sweeps a directory for call nodes, registry narrowed, paginated.

Execution flow trace (Yes): get_execution_flow traces exec pins from an entry point.

Project-wide call-site search (Partial): Only asset level get_referencers and semantic asset search; no function call site search across Blueprints.

  • asset.py:408 get_referencers
  • SemanticSearchToolset.h:55 Search
  • searched Toolsets for FindInBlueprint/ImaginaryBlueprint and blueprint*.py for call site: none

Execution flow trace (Partial): read_graph_dsl renders exec flow as structured code; get_connected_subgraph walks links; no trace tool.

  • blueprint.py:1481 read_graph_dsl
  • blueprint.py:722 get_connected_subgraph

Project-wide call-site search (No): Searched FindInBlueprints, find_references, callers, call_sites; only asset get_dependencies, struct usage.

Execution flow trace (No): Searched trace_execution, execution_flow, exec_flow in src and plugin; nothing found.

  • grep over src and plugins/McpAutomationBridge/Source: no matches

Project-wide call-site search (Partial): function_call_exists checks one graph only; searched callers/referencers, no project wide search.

Execution flow trace (Partial): No trace op in VibeUE; get_connected_subgraph walks connected nodes via Epic toolset.

Project-wide call-site search (Partial): project.search full-text over indexed BP node names finds calls by asset; no dedicated callers query.

Execution flow trace (Yes): get_execution_flow returns linearized exec flow from an event or function entry point.

Blueprint graphs as editable textDecompiles graphs to text and compiles text back into nodes, including inline expressions.

Blueprint logic authored as text code (Yes): BPIR text language compiled to wired graph nodes by blueprint.compile_bpir.

Decompile Blueprint graphs to editable text (Yes): blueprint.decompile, decompile_function and decompile_macro emit BPIR that round-trips with positions.

Inline text-expression Blueprint node (Yes): UK2Node_BpirExpression node compiles BPIR text into a collapsed subgraph; create/update RPCs.

Blueprint logic authored as text code (Partial): Only epic_write_graph_dsl; via wrapped Epic toolset, UE 5.8 only. No own text language.

Decompile Blueprint graphs to editable text (Partial): epic_read_graph_dsl via wrapped Epic toolset, UE 5.8 only; own path is T3D export only.

Inline text-expression Blueprint node (No): Searched MathExpression across src and plugin source; no match, no expression node action.

Blueprint logic authored as text code (Yes): write_graph_dsl transpiles S-expression code (event, fn, if, for, while, switch) into nodes.

  • blueprint.py:1454 write_graph_dsl
  • blueprint_dsl.py:23 USAGE grammar
  • blueprint.py:1440 get_graph_dsl_docs

Decompile Blueprint graphs to editable text (Yes): read_graph_dsl decompiles a graph to DSL text that write_graph_dsl accepts back.

  • blueprint.py:1481 read_graph_dsl
  • blueprint_dsl.py:2470 Decompiler.decompile

Inline text-expression Blueprint node (No): Searched for MathExpression; DSL arithmetic expands to separate operator nodes, not one expression node.

  • grep MathExpression in Toolsets source: none (only unrelated .pdb hits)
  • blueprint_dsl.py:1146 _eval_binop

Blueprint logic authored as text code (No): Logic is authored only as JSON node/pin operations; searched DSL, from_text, script compilers: none.

Decompile Blueprint graphs to editable text (No): Graph reads return JSON nodes and pins only; searched decompile, graph_to_text, to_text: none.

Inline text-expression Blueprint node (No): Searched K2Node_MathExpression and MathExpression across src and plugin; none found.

  • grep over plugins/McpAutomationBridge/Source and src: no matches

Blueprint logic authored as text code (Partial): VibeUE build_graph takes data descriptors, not code; text DSL write_graph_dsl via Epic toolset.

Decompile Blueprint graphs to editable text (Partial): get_graph_definition dumps descriptors replayable in build_graph; text decompile via Epic read_graph_dsl.

Inline text-expression Blueprint node (No): Searched MathExpression and math_expression in VibeUE and Epic toolset; no match.

Blueprint logic authored as text code (No): Searched for a text or script language for BP logic; authoring is JSON specs and per-node actions only.

Decompile Blueprint graphs to editable text (Partial): export_graph emits JSON reusable by build_blueprint_from_spec; no code-like text decompiler.

Inline text-expression Blueprint node (No): Searched MathExpression across Source; no math expression or inline text expression node support.

  • grep MathExpression in Source: no hits
Targeted graph edits (splice, swap node)Inserts logic at a chosen node or replaces a node while keeping its links.

Splice new logic at a chosen node (Yes): insert_bpir_at_node and insert_bpir_before_node splice BPIR at an anchor node.

Swap node type preserving connections (Yes): blueprint.graph.replace_node moves matched pin links and defaults in one transaction.

Splice new logic at a chosen node (No): Searched splice, insert, between, autowire in BP tools, specs and handlers; none found.

Swap node type preserving connections (Partial): epic_retarget_node_class swaps class ref only; via wrapped Epic toolset, UE 5.8 only.

Splice new logic at a chosen node (Partial): DSL writes whole event or function bodies; splicing mid chain needs manual break_pins and connect_pins.

  • blueprint_dsl.py:1627 transpile finds entry node by name
  • blueprint.py:1074 break_pins
  • blueprint.py:1058 connect_pins

Swap node type preserving connections (Partial): retarget_node_class swaps baked class on cast, call, event, delegate nodes in place; no general type swap.

  • blueprint.py:985 retarget_node_class

Splice new logic at a chosen node (No): Searched splice, insert_node, insert_between, insertAfter in Blueprint handlers; none found.

  • grep over plugins/McpAutomationBridge/Source and src: no Blueprint matches

Swap node type preserving connections (No): Searched ReplaceNode, swap_node, replace_node, MovePinLinks; none found.

  • grep over plugins/McpAutomationBridge/Source and src: no matches

Splice new logic at a chosen node (Partial): build_graph can wire new nodes to existing node GUIDs; no insert between operation found.

Swap node type preserving connections (Partial): Searched replace/swap node in VibeUE, none; Epic retarget_node_class swaps class ref in place.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:985 retarget_node_class

Splice new logic at a chosen node (No): Searched splice, insert_after, insert_before in MonolithBlueprint; only ABP pose-chain splicing exists.

  • grep splice|insert_(after|before) in Source/MonolithBlueprint: no hits

Swap node type preserving connections (No): Searched replace_node, swap_node and node retype actions across Source; none found.

  • grep replace_node|swap_node in Source: no hits

Materials

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Build graph from JSON

compile_mgir builds full wired graphs from MGIR text (not JSON); create_nodes takes a JSON node array, no wires.

Evidence

build_graph spawns nodes and output-property links only; no node-to-node edges, values only for Constant/ScalarParam.

Evidence

No JSON graph builder; sandboxed execute_tool_script can chain add/connect tool calls in one script.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script
  • material.py searched: no build/json graph tool

No single JSON import; recreation is a documented multi step flow over batch create/connect calls.

Evidence

build_material_graph takes a JSON graph_spec; import_material_graph overwrite or merge.

Evidence
Custom HLSL node

material.authoring.add_custom_expression adds a Custom HLSL node; HLSL errors reported in shaderCompile.

Evidence

set_custom_expression reads/writes code, named inputs, outputType on Custom nodes, also inside functions.

Evidence

No HLSL tool; add_expression with MaterialExpressionCustom then object set_properties for Code.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:123 add_expression
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

Dedicated Custom HLSL expression creation with code, output type and inputs.

Evidence

create_custom_hlsl_node and update_custom_hlsl_node with inputs, outputs, includes, defines.

Evidence
Recompile dependent materials

compile_material recompiles, recaches dependent instances via FMaterialUpdateContext, rebuilds landscape MICs.

Evidence

recompile with recompileChildren walks MaterialInstanceConstants whose parent chain reaches it.

Evidence

recompile on a MaterialFunction also recompiles referencing Materials; get_referencing_materials.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:486 recompile, :517 get_referencing_materials

CompileMaterial calls ForceRecompileForRendering on one material; no explicit instance or dependent cascade.

Evidence

update_material_function recompiles and cascades to users; also recompile_material, batch_recompile.

Evidence
Render preview PNG

asset.generate_thumbnail renders a material to PNG on sphere, cube, plane, shaderBall or mesh with camera angles.

Evidence

render_preview writes lit thumbnail PNG; falls back to flat base color swatch if renderer unavailable.

Evidence

CaptureAssetImage renders an asset thumbnail (materials included) as an image; no preview options.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:216 CaptureAssetImage

No material preview render; own capture_image grabs an editor window, editor open/capture via Epic toolset.

Evidence

render_preview writes PNG on plane, sphere or cube; get_thumbnail also returns PNG.

Evidence
Material function authoring

create_material_function, add_function_input/output, use_material_function; MGIR decompiles functions.

Evidence

create_function, add/connect/list_function_expressions; set_expression_value and delete accept functionPath.

Evidence

create_function plus all graph tools accept MaterialFunction; FunctionInput/Output allowed.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:50 create_function, :561 _dispatch

Create function, add inputs/outputs, add, connect and set function expressions, export graph.

Evidence

create_material_function, build_function_graph, export, metadata, function instances.

Evidence
Shader stats / graph validation

Shader compile errors per permutation reported; get_material_stats gives samplers, instructionCount is null.

Evidence

validate finds orphans, null textures, UV mismatch; shader stats only count samplers and params, no instructions.

Evidence

recompile raises with compile error list; no shader stats or instruction counts found.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:499 _recompile_material
  • grep shader stat|instruction count|MaterialStats over Toolsets and ModelContextProtocol: no hits

Diagnostics give compile errors, textures and node counts; instruction stats only via Python MEL.get_statistics.

Evidence

get_compilation_stats (instructions, samplers) and validate_material with optional fix_issues.

Evidence
Material graph decompile to editable text

material.decompile_mgir exports material or function graph and properties to MGIR text; compile_mgir round trips.

Evidence

export_graph JSON is lossy: no node-to-node wiring, 4 value types, 8 outputs; import only re-adds nodes.

Evidence

Only object-level get_expressions/get_expression_inputs; searched for text IR or decompile tool, none.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:176 get_expressions, :359 get_expression_inputs

get_material_info returns read only JSON node list; no text form that replays into build_material_graph.

Evidence

Exports full graph JSON for materials and functions; no import, text is rebuilt by manual batch calls.

Evidence

export_material_graph gives JSON that import_material_graph reads back; no readable text DSL.

Evidence
Material layer and layer-blend stacks

create_material_layer, create_material_layer_blend, set_material_layer_stack fills Layers/Blends arrays.

Evidence

No UE Material Layers support; only Material Designer layer stacks, needs Material Designer plugin.

Evidence
  • src/tools/material.ts:69-73 *_designer actions
  • Grep MaterialLayer|LayerBlend|SetMaterialLayers in src and plugin: no matches outside Designer

Searched Toolsets and MCP for MaterialLayer, layer blend, MaterialAttributeLayers; no tools.

Evidence
  • grep MaterialLayer|layer_blend over Engine/Plugins/Experimental/Toolsets and ModelContextProtocol: no hits
  • material.py:50 create_function uses MaterialFunctionFactoryNew only

Searched MaterialFunctionMaterialLayer, MaterialAttributeLayers, layer stack; only landscape LayerBlend nodes exist.

Evidence

Creates MaterialLayer and LayerBlend functions, get_layer_info; no op to assign layer stacks.

Evidence
Material Parameter Collection authoring

create_parameter_collection, add collection scalar/vector params, set defaults, remove, info, graph node.

Evidence

read_mpc native; create only via generic create_asset_by_class or Epic toolset; params need raw set_property.

Evidence

create_parameter_collection makes an empty MPC; adding params only via object set_properties.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:66 create_parameter_collection
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

Searched MaterialParameterCollection and parameter_collection in C++ and TS; only Niagara collection include.

Evidence

Only adds CollectionParameter nodes referencing an existing MPC; no MPC asset create or edit.

Evidence

Only generic create_data_asset with class MaterialParameterCollection; no MPC parameter ops.

Evidence
Procedural texture generation and processing

texture namespace: noise, gradient, pattern, normal from height, blur, levels, curves, channel pack.

Evidence

Only import, export, compare, settings, render target create; searched noise, create_texture, channel pack, bake.

Evidence
  • src/tools/asset.ts:269-306 texture actions
  • Grep noise|create_texture|generate_texture|pack_channel|bake_material in src\tools: none for textures

Texture toolset has only import_file and get_size; searched texture/render target tools, none else.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/texture.py:15 import_file, :35 get_size

Searched NewObject<UTexture2D>, Source.Init, texture generation; only file import and RVT asset creation found.

Evidence

No texture generation op; only import/preview/tiling checks; generation only via editor.run_python.

Evidence
Landscape auto-material (height/slope blend)

No auto material op; slope/height blend only by hand from generic graph nodes. LB_HeightBlend is painted, not auto.

Evidence

No auto-material builder; searched LandscapeLayerBlend, auto material, slope blend; only set_material and weight writes.

Evidence

Searched all Toolsets and MCP source for landscape; only a PCG node name, no landscape material tools.

Evidence
  • grep -i landscape over Engine/Plugins/Experimental/Toolsets and ModelContextProtocol: only PCGToolsetLibraryCore.h:91 node list

CreateAutoMaterial builds layered landscape material; SetupHeightSlopeBlend wires height and slope masks.

Evidence

Searched Landscape, LayerBlend, slope, auto_material; none; only manual build_material_graph.

Evidence
Expression graph CRUD and wiringAdds, edits, removes and connects material expressions.

Expression graph CRUD (Yes): material.graph add_node, add_expression, create_nodes, get_node_details, remove_node, break_connections.

Connect expressions (Yes): material.graph.connect_nodes and material.authoring.connect_nodes wire outputs to named inputs.

Expression graph CRUD (Yes): add_expression, list_expressions, read_graph, set_expression_value (generic UPROPERTY path), delete_expression.

Connect expressions (Yes): connect_expressions, connect_to_property, disconnect_property; function graph via connect_function_expressions.

Expression graph CRUD (Yes): add_expression, delete_expression, get_expressions, list_expression_classes, layout, delete_unused.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:123 add_expression, :158 delete_expression, :176 get_expressions, :470 delete_unused_expressions

Connect expressions (Yes): connect_expressions, disconnect_expressions, connect_to_output, disconnect_from_output.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:310 connect_expressions, :431 connect_to_output

Expression graph CRUD (Partial): Own batch create, list, get/set property; deleting a chosen node only via Epic toolset, own delete is unused cleanup.

Connect expressions (Yes): Batch expression connect plus connect/disconnect to material outputs.

Expression graph CRUD (Yes): get_all_expressions, set_expression_property, delete_expression, replace/duplicate; add via build graph merge.

Connect expressions (Yes): connect_expressions (expr to expr or to material property) plus disconnect_expression.

Create material / instance and set parametersCreates materials and instances and sets instance parameters.

Create material / instance (Yes): create_material, create_material_instance, plus decal, post process and landscape material creators.

Instance parameter set (Yes): Typed scalar/vector/texture/static switch setters, batch set_material_instance_parameters, clear override.

Create material / instance (Yes): material(create), create_simple, build_material and create_instance, all idempotent by path.

Instance parameter set (Yes): set_parameter (scalar/vector/texture, readback), set_static_switch, batch_set_instances, clear_instance_parameters.

Create material / instance (Yes): MaterialTools.create_material and MaterialInstanceTools.create tools.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material.py:31 create_material
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material_instance.py:79 create

Instance parameter set (Yes): Get/set scalar, vector, texture, static switch params plus set_parameter_override, clear_parameters.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/material_instance.py:150 set_scalar_parameter, :182, :214, :248, :294

Create material / instance (Partial): Plain material and instance create via Epic toolset; own code creates only landscape materials and functions.

Instance parameter set (Yes): Bulk scalar, vector, texture and static switch set on an instance; single sets via Epic toolset.

Create material / instance (Yes): material.create_material and material.create_material_instance actions.

Instance parameter set (Yes): set_instance_parameter and batch set_instance_parameters for scalar, vector, texture, switch.

Animation

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Anim Blueprint CRUD

create_animation_bp, authoring.create_anim_blueprint, graph node ops, AGIR compile/decompile.

Evidence

create_anim_blueprint, read_anim_blueprint, read_anim_graph, set_anim_blueprint_skeleton, node actions.

Evidence

Only generic Blueprint tools; create uses BlueprintFactory, not an AnimBlueprint factory; no AnimGraph ops.

Evidence
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:176 BlueprintTools.create (BlueprintFactory)
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:121 duplicate, :159 delete
  • grep AnimBlueprint|AnimGraph|AnimInstance across ModelContextProtocol, ToolsetRegistry, Toolsets: no hits

AnimGraphService reads and edits AnimBP graphs; creation is only a Python AnimBlueprintFactory recipe in a skill.

Evidence

create_anim_blueprint, get_abp_info, add_anim_graph_node, remove_node_slice, duplicate_reparent_and_sanitize.

Evidence
State machine CRUD

add_state_machine, add_state, add_state_alias, add_transition, set_transition_rules, set_state_machine_entry.

Evidence

create_state_machine, add/remove_state, add/remove_transition, set_transition_condition, read_state_machine.

Evidence

No state machine, state or transition tools; searched StateMachine, state_machine, AnimGraph.

Evidence
  • grep StateMachine|state_machine|AnimGraph in Experimental/ModelContextProtocol, ToolsetRegistry, Toolsets: no hits

Add state machine, states, conduits and transitions, remove them, set rules, entry state and priority, validate.

Evidence

create_state_machine, build_state_machine, add_state_to_machine, add_transition, remove_anim_state/transition.

Evidence
Curves CRUD

set_curve_key (creates if missing) and list_curves; no curve delete or rename verb in wiki.

Evidence

add_curve, remove_curve, set_anim_curve_keys, edit_curve_metadata on skeleton.

Evidence

No animation curve tools; only curve_table.py for CurveTable assets; searched FloatCurve, add_curve.

Evidence
  • grep AnimationCurve|add_curve|FloatCurve: only Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/curve_table.py
  • controlrig.py:168 add_element supports only bone or null, no rig curves

List, add, remove curves, set and add curve keys, read values; skeleton curve metadata CRUD too.

Evidence

add_curve, remove_curve, set_curve_keys, get_curve_keys, list_curves, get_skeleton_curves.

Evidence
Montage CRUD

create_montage plus section, slot, notify, blend in/out, section timing and link_sections verbs.

Evidence

create_montage, author_montages_batch, sections, segments, slot, properties, read_montage.

Evidence

No montage tools; SlotAnimTracks and CompositeSections are not Edit properties, so set_properties cannot reach them.

Evidence
  • Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:211 CaptureAssetImage comment only
  • Engine/Source/Runtime/Engine/Classes/Animation/AnimMontage.h:696 CompositeSections UPROPERTY(), :700 SlotAnimTracks BlueprintReadOnly

Create, duplicate montages; sections, slot tracks, segments, notifies, branching points, blend settings.

Evidence

create_montage, add/delete_montage_section, add_montage_slot, set_montage_blend, get_montage_info.

Evidence
Blendspace CRUD

create_blend_space_1d/2d, create_aim_offset, add_blend_sample, add_aim_offset_sample.

Evidence

create_blendspace, create_blendspace_1d, populate_blendspace, add/set_blend_sample, read_blendspace.

Evidence

No blend space tools; existing asset axes and samples editable via generic set_properties; no create.

Evidence
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties
  • Engine/Source/Runtime/Engine/Classes/Animation/BlendSpace.h:913 SampleData EditAnywhere, :925 BlendParameters EditAnywhere
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:121 duplicate

No blend space service; creation only via execute_python_code with engine BlendSpaceFactoryNew.

Evidence

create_blend_space(_1d), aim offsets, add/edit/delete_blendspace_sample, set_blend_space_axis.

Evidence
IK rig / retargeter

Native create/read/configure IK rig and retargeter; configure_* actions are UE 5.8 only.

Evidence

No IK Rig or retargeter tools; retarget hits are Blueprint node class retargeting.

Evidence
  • grep IKRig|Retarget: only blueprint.py:985 retarget_node_class and a skeletal_mesh.py:152 docstring

No IK Rig or retargeter code; only RetargetPreview and bone retarget modes; rest via execute_python_code.

Evidence

create_ik_rig, add_ik_solver, add_retarget_chain, create_ik_retargeter, retarget pose and chain settings.

Evidence
Pose Search

3 dedicated experimental verbs exist, but schemas accept Position channels only, no trajectory or velocity channels.

Evidence

Pose search database, schema, channels, normalization set, index build, motion matching node.

Evidence

Generic DataAsset create plus set_properties can make PoseSearch schemas; database anim list not editable.

Evidence
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/data_asset.py:16 create (any DataAsset class)
  • Engine/Plugins/Animation/PoseSearch/Source/Runtime/Public/PoseSearch/PoseSearchSchema.h:76 Skeletons, :80 Channels EditAnywhere
  • PoseSearchDatabase.h:508 Schema EditAnywhere, :558 DatabaseAnimationAssets UPROPERTY() only

Searched PoseSearch, motion matching across whole repo (plugin C++, TS, docs); no hits.

Searched PoseSearch, pose search, motion matching in Source, skills and docs; no code or docs.

Evidence
  • grep -i 'PoseSearch|pose search|motion matching' Source Content: no hits

Pose Search schema/database create, channels, normalization sets, index rebuild, validation.

Evidence
Control Rig authoring

create_control_rig plus CRIR compile of RigVM graph, functions and hierarchy with controls.

Evidence

Native create_control_rig plus graph reads; controls and graph edits via wrapped Epic toolset, UE 5.8 only.

Evidence

ControlRigTools: create rig, add bones, nulls, controls, graphs, nodes, pins, links, variables.

Evidence
  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig.py:51 create, :219 add_bone, :267 add_control, :638 create_node, :912 connect_pins

create_control_rig creates asset from skeleton or mesh; no hierarchy or RigVM graph editing actions.

Evidence

No Control Rig code; only via execute_python_code; Epic AnimationAssistantToolset not enabled by VibeUE.

Evidence

add_control_rig_element, add_control_rig_node, connect_control_rig_pins, get_control_rig_graph.

Evidence
Skin weights / cloth binding

set_vertex_weights, auto_skin_weights, copy/normalize/prune weights, bind_cloth_to_skeletal_mesh.

Evidence

read/set_skeletal_mesh_skin_weights (256 verts per call), bind_cloth_to_section, set_cloth_config.

Evidence

Cloth binding to mesh sections via ChaosClothAssetToolset plugin; no skin weight tools.

Evidence
  • Experimental/Toolsets/ChaosClothAssetToolset/Source/ChaosClothAssetToolset/Private/ChaosClothAsset/ClothAssetToolset.h:56 CreateClothingAsset, :76 AssignClothingToSection
  • grep SkinWeight|skin_weight: no hits

No own skin weight op; engine SkinWeightModifier (MeshModelingToolset, enabled) via execute_python_code; no cloth.

Evidence
  • VibeUE.uplugin Plugins: MeshModelingToolset Enabled
  • Engine/Plugins/Runtime/MeshModelingToolset/Source/SkeletalMeshModifiers/Public/SkinWeightModifier.h:123 SetVertexWeights, :84 CommitWeightsToSkeletalMesh
  • grep -i 'SkinWeight|cloth' VibeUE Source Content: no hits

Searched SkinWeight, skin_weight, Cloth, Clothing across Source; no skin weight or cloth binding actions.

Evidence
  • grep -i skinweight|clothing in Source: no hits
Non-destructive Control Rig sessions

No rig session verbs; Control Rig posing only via Sequencer tracks: key_controls, bake_to_controlrig.

Evidence

begin/read/apply/bake_control_rig_edit sessions over a LevelSequence; source unchanged; UE 5.8 only.

Evidence

Sequencer layered Control Rigs, bake to rig, collapse layers and linked AnimSequence export.

Evidence
  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig_sequencer.py:689 bake_to_control_rig, :799 collapse_anim_layers, :915 set_layered_mode
  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:125 link_anim_sequence

Searched ControlRig session, RigVMController, RigHierarchyController; only asset creation exists.

No Control Rig; non-destructive preview sessions exist for AnimSequence bone edits (stack, cancel, bake).

Evidence

Control Rig edits apply directly to the asset; searched session/transaction actions, only material ones exist.

Evidence
Batch retarget animations

setup_retargeting batch copies clips with skeleton swap, no track remap; IK batch export only via python.execute.

Evidence
  • operation animation.setup_retargeting: takes an assets array, duplicates AnimSequences and assigns the target Skeleton, reports retargeted=false
  • wiki page animation lines 45-49: says it is a skeleton swap copier, works only when tracks are already compatible, and takes no source/target SkeletalMesh or UIKRetargeter
  • operation animation.authoring.create_ik_retargeter and set_retarget_chain_mapping.md only author assets; neither runs an export
  • grep for IKRetargetBatch|BatchOperation|RetargetAnimations|DuplicateAndRetarget in Plugins\PinWright\Source and Content\Python: no hits

batch_retarget_animations via IK Retargeter with mapping completeness report and rollback.

Evidence

No batch retarget; searched Retarget, IKRetargeter, batch.

Evidence
  • grep IKRig|Retarget in Toolsets: only blueprint.py:985 retarget_node_class

No batch retarget op; only reachable through execute_python_code with engine retarget Python API.

Evidence

batch_retarget_animations action.

Evidence
Curve-to-morph target check

Searched wiki and Source for curve to morph target checks; list_curves and list_morph_targets exist separately.

compare_curves_to_morph_targets matches curve names against mesh morph target names.

Evidence

Only morph target name listing; no curve to morph comparison.

Evidence
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:298 get_morph_target_names

Searched curve to morph checks; only list_morph_targets and runtime set_morph_target_value.

Reads and sets the curve morph target flag; no check against the mesh's morph targets.

Evidence

get_skeletal_mesh_info lists morph names only; searched morph across Source, no curve to morph check.

Evidence
Morph target creation and vertex deltas

create_morph_target, set_morph_target_deltas, set_morph_target_value, list and delete.

Evidence

Searched UMorphTarget/create_morph in src, plugin, docs: only name reads and curve flag; no creation.

Evidence

Morph targets can only be listed by name; no creation or vertex delta tools.

Evidence
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:298 get_morph_target_names

No morph target creation or deltas; only MorphTargetCount in mesh info and Epic morph name listing.

Evidence

Searched MorphTarget across Source; only morph name read in get_skeletal_mesh_info; no creation or deltas.

Evidence
Skeletal sockets and virtual bones CRUD

create/configure/delete/list sockets and create/delete/list virtual bones.

Evidence

add/remove/list_sockets, set_socket_transform (asset); add/remove_virtual_bone (animation).

Evidence

Skeletal mesh socket add, list, transform, rename, remove; no virtual bone tools.

Evidence
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:314 add_socket, :406 set_socket_transform, :421 remove_socket, :436 rename_socket
  • Skeleton.h:334 VirtualBones UPROPERTY() only, not settable; grep VirtualBone in Toolsets: no hits

Socket CRUD via Epic toolset (SkeletalMeshTools); no virtual bone support found.

Evidence

add_socket, remove_socket, set_socket_transform, get_skeleton_sockets, add_virtual_bone, remove_virtual_bones.

Evidence
Sync markers, sync groups and notify states

add/set/remove/list sync markers, set_sync_group, add_notify_state, set_notify_state_property.

Evidence

set_sync_markers and add/remove_notify_state exist; no sync group action (searched SyncGroup, sync_group).

Evidence

No sync marker, sync group or anim notify tools; Notifies and sync markers are not editable properties.

Evidence
  • grep SyncMarker|sync_marker|Notify in Toolsets: only blueprint.py REP_NOTIFY, GameplayCue, ToolsetRegistry async
  • AnimSequenceBase.h:42 Notifies UPROPERTY(), AnimSequence.h:701 AuthoredSyncMarkers UPROPERTY()

Sync markers and notify states CRUD exist; no sync group setting on graph nodes found.

Evidence

add/remove/rename_sync_marker, derive_foot_sync_markers, set_sync_group, add_notify_state.

Evidence
Learned bone rotation limits and pose validation

Searched for rotation limit, joint limit, pose validation; only physics constraint limits exist.

Evidence

Searched rotation limit, joint limit, RotationLimit, pose validation; only guidance prose in doc.

Evidence

No learned rotation limits or pose validation; searched limit, validate, pose in animation toolsets.

Evidence
  • grep -i rotation_limit|pose_valid|limit in AnimationAssistantToolset: no hits

Searched RotationLimit, JointLimit, pose validation; only physics constraint limits exist.

Learns per bone rotation limits from animations, stores constraints, validates rotations and poses.

Evidence

Searched rotation limit, joint limit, validate_pose; only validate_pose_search_database exists.

Evidence
Assets compiled from text sourceBuilds skeletons, animation clips and meshes from a text description.

Skeleton compiled from text source (Yes): skeleton.compile builds one USkeleton from a .pwskel file; skeleton.validate parses only.

Animation clip compiled from text source (Yes): anim.compile builds one UAnimSequence from a .pwanim file; anim.validate parses without writing.

Text-source mesh recipe compiled to asset (Yes): model.compile builds a .pwmodel text recipe into one mesh asset; experimental, needs GeometryScripting.

Skeleton compiled from text source (No): Searched for text source skeleton compile; only create_skeleton from mesh and JSON bone edit batches.

Animation clip compiled from text source (No): Searched for text source clip compile; clips authored via JSON keys (set_bone_keyframes) only.

Text-source mesh recipe compiled to asset (No): Searched docs and bridge for mesh creation from text, vertex data or recipes; only edits of existing meshes.

  • no AppendBox/AppendPolygonList/AppendTriangles/FMeshDescriptionBuilder mesh-from-data action in plugin/
  • docs/tool-reference.md has no create_mesh or mesh_from action

Skeleton compiled from text source (No): No text to skeleton compiler; skeletons only created by mesh import.

  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:16 import_file

Animation clip compiled from text source (No): No text to animation clip compiler; clips come from FBX import or Sequencer bake.

  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:54 import_fbx, :88 export_anim_sequence

Text-source mesh recipe compiled to asset (No): No text mesh recipe compiler; searched static_mesh.py, primitive.py, all toolsets; only import_file from disk.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:15 import_file

Skeleton compiled from text source (No): Searched text source compilers for skeletons; skeletons built by bone actions only.

Animation clip compiled from text source (No): Searched text source compilers for animation clips; sequences built by key actions only.

Text-source mesh recipe compiled to asset (No): No text mesh recipe; only per call append_vertex/append_triangle JSON ops then convert_to_static_mesh.

Skeleton compiled from text source (No): No text or spec import for skeletons; only per bone AddBone calls.

Animation clip compiled from text source (Partial): CreateAnimSequence builds a clip from keyframe structs; ExportAnimationToJson is export only.

Text-source mesh recipe compiled to asset (No): Searched mesh recipe, GeometryScript, DynamicMesh, procedural mesh builders; nothing compiles text to mesh.

  • rg GeometryScript|DynamicMesh|ProceduralMesh in Source and Content/Skills: no mesh builder hits

Skeleton compiled from text source (No): Searched skeleton import/build/spec actions; none compile a skeleton from text.

  • action list of Source/MonolithAnimation (no skeleton build action)

Animation clip compiled from text source (Partial): build_sequence_from_poses builds a clip from JSON per frame bone transforms; no text source format.

Text-source mesh recipe compiled to asset (No): Searched recipe, DSL, from_spec, from_text in MonolithMesh; only JSON param generators and batch_execute.

Anim sequence and bone track editingReads and writes animation sequences down to per-bone keys.

Anim sequence read/write (Yes): describe_sequence and get_animation_info read; create_animation_sequence, set_sequence_length, track keys write.

Bone track keys (Yes): add_bone_track and set_bone_track_keys; .pwanim keys also compile.

Anim sequence read/write (Yes): read_sequence, create_sequence, set_sequence_properties, reverse_sequence, set_root_motion.

Bone track keys (Yes): set_bone_keyframes writes bone transform keys; read_bone_track reads raw track.

Anim sequence read/write (Partial): Bake a Sequencer binding to an AnimSequence and load one into a Control Rig; no direct frame or key reads.

  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:88 export_anim_sequence
  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig_sequencer.py:729 load_anim_into_rig
  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:16 import_file (import_animations)

Bone track keys (Partial): Indirect only: load AnimSequence into a Sequencer Control Rig, key controls, bake back to AnimSequence.

  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig_sequencer.py:729 load_anim_into_rig, :640 key_controls, :661 key_controls_at_frames
  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:88 export_anim_sequence
  • grep BoneTrack|bone_track|AnimationDataController: no hits (no direct track key API)

Anim sequence read/write (Yes): AnimSequenceService creates sequences, reads poses, bone transforms and root motion, and writes keys.

Bone track keys (Yes): Bone tracks written from keyframe arrays or baked edits via SetBoneTrackKeys; per bone reads by time or frame.

Anim sequence read/write (Yes): create_sequence, get_sequence_info, set_sequence_properties, duplicate_sequence, set_compression_settings.

Bone track keys (Yes): get_bone_track_keys, set_bone_track_keys, add_bone_track, remove_bone_track, list_bone_tracks.

Anim Blueprint and Control Rig graphs as textRound-trips AnimBP and Control Rig graphs through editable text.

Anim Blueprint graph text round-trip (Yes): AGIR text: anim.decompile_agir and anim.compile_agir with atomic rollback.

Control Rig graph text round-trip (Yes): CRIR text: controlrig.decompile_crir and compile_crir covering graphs, functions and hierarchy.

Anim Blueprint graph text round-trip (Partial): Generic blueprint export_nodes_t3d/import_nodes_t3d clipboard T3D works on AnimBP graphs; no AnimBP format.

Control Rig graph text round-trip (No): Searched ExportNodesToText/RigVM text export; read_control_rig_graph is JSON read, writes are per node Epic tools.

Anim Blueprint graph text round-trip (Partial): Generic Blueprint graph DSL read/write; no AnimGraph or state machine support in the DSL.

  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:1454 write_graph_dsl, :1481 read_graph_dsl
  • grep AnimGraph in blueprint_dsl.py: no hits

Control Rig graph text round-trip (No): Control Rig graph editable node by node only; no text export or import.

  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig.py:638 create_node, :685 list_nodes; grep dsl|export: no text round trip

Anim Blueprint graph text round-trip (No): Searched ExportNodesToText, ImportNodesFromText, graph text formats; none found.

Control Rig graph text round-trip (Partial): No dedicated action; RigVMController export/import nodes text reachable only via execute_python.

Anim Blueprint graph text round-trip (Partial): BuildStateMachine builds from a JSON spec, no export; BP graph round trip covers EventGraph, not AnimGraph.

Control Rig graph text round-trip (No): No Control Rig code at all; searched ControlRig, RigVM.

  • grep ControlRig|RigVM in Source Content: none

Anim Blueprint graph text round-trip (Partial): Generic blueprint.export_graph JSON plus build_blueprint_from_spec; not AnimGraph specific text.

Control Rig graph text round-trip (Partial): get_control_rig_graph reads RigVM graph as JSON; no import of that dump, only per node writes.

Skeleton editingCreates skeletons from meshes and edits bone hierarchies.

Skeleton edit sessions (Partial): Direct add/remove/rename/reparent bone verbs and atomic .pwskel compile; no begin/commit session.

Create skeleton from skeletal mesh (No): No op derives a USkeleton from a mesh; create_skeleton makes a bare root and .pwskel preview_mesh must already match.

Skeleton edit sessions (Yes): begin_skeleton_edit, edit_skeleton_bones, commit_skeleton_edit, cancel_skeleton_edit.

Create skeleton from skeletal mesh (Yes): create_skeleton builds a USkeleton from a SkeletalMesh via the skeleton factory.

Skeleton edit sessions (No): No skeleton editing; add_bone edits a Control Rig hierarchy, not a USkeleton.

  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig.py:219 add_bone (rig hierarchy)
  • grep Skeleton edit/add_bone on USkeleton: no hits

Create skeleton from skeletal mesh (Partial): import_file creates a Skeleton when importing a mesh file without one; no tool for existing meshes.

  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:16 import_file (creates Skeleton when none supplied, :47)

Skeleton edit sessions (Partial): Direct add_bone, remove_bone, rename_bone, set_bone_parent edits; no session or commit model.

Create skeleton from skeletal mesh (No): create_skeleton builds a root bone only skeleton; no creation from a skeletal mesh found.

Skeleton edit sessions (Yes): Add, remove, rename, reparent bones and set transforms as pending changes, then CommitBoneChanges.

Create skeleton from skeletal mesh (No): Searched CreateSkeleton, USkeletonFactory; only DuplicateSkeleton and GetSkeletonForMesh exist.

Skeleton edit sessions (No): Skeleton edits (sockets, virtual bones) are direct calls; searched for skeleton session actions, none.

Create skeleton from skeletal mesh (No): Searched create_skeleton, NewObject<USkeleton>; only a test creates one; import_mesh makes one only from FBX.

Animation analysis (determinism, locomotion speed)Measures animation data offline, including locomotion speed.

Deterministic animation analysis (Yes): measure_motion samples data model: moving, loop seam, jitter, locomotion pass/fail checks.

Locomotion speed measurement (Yes): measure_motion with footBones reports impliedGroundSpeed, stride, slideFraction, suggestedPlayRate.

Deterministic animation analysis (Yes): analyze_animation samples a clip and reports numeric motion, continuity and facing metrics.

Locomotion speed measurement (Yes): measure_natural_speed returns planted foot speed in cm/s.

Deterministic animation analysis (No): No animation analysis tools; searched analysis, foot sliding, root motion, velocity terms.

  • grep -i analy|root_motion|foot|velocity in AnimationAssistantToolset and SequencerAnimMixerToolset: no analysis tools

Locomotion speed measurement (No): No locomotion speed measurement; searched speed, velocity, root motion.

  • grep -i speed|velocity|root_motion in animation toolsets: only Sequencer playback speed (sequencer.py:160)

Deterministic animation analysis (No): Searched animation analysis actions; only get_animation_info metadata, no analysis.

Locomotion speed measurement (No): Searched Locomotion, root motion speed, measure speed; only catalog topic words.

Deterministic animation analysis (Partial): Sampling ops for poses, root motion, JSON export and pose validation; no dedicated analysis report.

Locomotion speed measurement (Partial): Only root motion reads (at time and total); no speed measurement op.

Deterministic animation analysis (Partial): Targeted analyses only: derive_foot_sync_markers, get_root_motion_speed, get_animated_bone_transform.

Locomotion speed measurement (Yes): get_root_motion_speed computes clip root motion speed in cm/s.

Live PIE bone reads and AnimBP overrideReads bone transforms during play and overrides the post-process AnimBP live.

Live PIE bone reads (Partial): No PIE bone read verb; only via object.call_function or python.execute. get_bone_transform is bind pose.

Live post-process AnimBP override (No): Searched Source and wiki for PostProcessAnim and OverridePostProcessAnimBP; nothing found.

Live PIE bone reads (Yes): get_live_bone_transforms reads evaluated pose off a live component in editor world or PIE.

Live post-process AnimBP override (Yes): set_live_post_process_anim_blueprint sets or clears transient override in editor world or PIE.

Live PIE bone reads (No): No runtime bone transform reads during PIE; bone tools read static mesh hierarchy only.

  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:148 get_bone_names, :166 get_bone_parent
  • grep GetBoneTransform|bone_transform|PIE bone: no hits

Live post-process AnimBP override (Partial): No dedicated tool; generic set_properties can set a mesh PostProcessAnimBlueprint (asset edit, not live).

  • Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties
  • Engine/Source/Runtime/Engine/Classes/Engine/SkeletalMesh.h:2214 PostProcessAnimBlueprint EditAnywhere
  • grep AnimInstance|PostProcessAnim in Toolsets: no hits

Live PIE bone reads (Partial): get_bone_transform reads ref pose only; live component bone reads only via execute_python escape hatch.

Live post-process AnimBP override (No): Searched PostProcessAnim, OverridePostProcess, anim instance overrides; none found.

Live PIE bone reads (Partial): No bone read op; skill shows raw Python reading a PIE component's socket rotation.

Live post-process AnimBP override (Partial): Sets the post process AnimBP on the skeletal mesh asset, not live on a running component.

Live PIE bone reads (Yes): sample_pie_anim_instance returns live PIE bone/socket transforms, states, montage, variables.

Live post-process AnimBP override (Partial): assign_post_process_anim_rig sets the mesh asset PostProcessAnimBlueprint; not a live runtime override.

Pose editing aids (contact locks, pose propagation)Locks hands or feet during edits and propagates a captured pose across frames.

Contact constraints (hand/foot lock) (No): Searched wiki and Source for foot lock, hand lock, contact constraint, foot plant; none found.

Viewport pose capture + propagation (No): capture_animation_preview renders images only; no verb captures a viewport pose and propagates it.

Contact constraints (hand/foot lock) (Yes): contact_lock operation inside apply_control_rig_edits, native; UE 5.8 only.

Viewport pose capture + propagation (Yes): capture_control_rig_pose plus propagate_pose op in apply_control_rig_edits; UE 5.8 only.

Contact constraints (hand/foot lock) (Partial): Snap controls to an actor over a frame range and space switching; no dedicated hand or foot lock.

  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig_sequencer.py:1198 snap_control_rig, :993 set_space, :1096 bake_space

Viewport pose capture + propagation (Partial): Keys current control values at listed frames; viewport capture is an image only, no pose capture.

  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig_sequencer.py:640 key_controls, :661 key_controls_at_frames
  • Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:246 CaptureViewport

Contact constraints (hand/foot lock) (No): Searched FootLock, HandLock, contact constraint, foot/hand lock; no hits.

Viewport pose capture + propagation (No): Searched pose capture and propagation; only generic editor screenshots exist, no pose capture.

Contact constraints (hand/foot lock) (No): Searched foot lock, hand lock, contact, foot sliding in Source and skills; nothing found.

  • grep -i 'foot.?lock|hand.?lock|contact|foot.?slid' Source Content/Skills: no animation hits

Viewport pose capture + propagation (Partial): No viewport pose capture; CopyPose copies frame poses and preview edits bake across a frame range.

Contact constraints (hand/foot lock) (Partial): enable_foot_ground_lock sets retargeter Speed Planting; build_foot_ik_pass adds ABP foot IK; no hand lock.

Viewport pose capture + propagation (Partial): copy_bone_pose_between_sequences keys a sampled pose into another clip; no viewport pose capture.

Niagara VFX

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Create system

niagara.create_system creates an empty UNiagaraSystem asset.

Evidence

create (idempotent) and create_system_from_spec; Epic epic_create_niagara_system also wrapped (5.8 only).

Evidence

CreateNiagaraSystem AICallable in NiagaraToolsets; a template system is required, no empty create.

Evidence
  • Engine/Plugins/Experimental/Toolsets/NiagaraToolsets/Source/NiagaraToolsets/Private/NiagaraToolset_System.h:113 CreateNiagaraSystem(AssetName, AssetPath, TemplateSystem)

Via Epic toolset: NiagaraToolset_System CreateNiagaraSystem; VibeUE NiagaraService create was trimmed.

Evidence

niagara.create_system action; create_system_from_spec builds a full system from JSON.

Evidence
Module CRUD

add_module, remove_module, move_module, set_module_input, set_module_script, reset_module_input.

Evidence

add/remove/enable module, set input, dynamic inputs, static switches; list_module_inputs returns no current values.

Evidence

AddModule, RemoveModule, SetModuleEnabled, SetStackInputData, SetParameters module ops; no reorder tool.

Evidence
  • NiagaraToolset_System.h:506 AddModule
  • NiagaraToolset_System.h:515 RemoveModule
  • NiagaraToolset_System.h:525 SetModuleEnabled
  • NiagaraToolset_System.h:572 SetStackInputData
  • NiagaraToolset_System.h:538 AddSetParametersModule

Via Epic toolset: AddModule/RemoveModule/SetStackInputData; VibeUE own module add is private helper only.

Evidence

add/remove/move/duplicate module, set_module_input_value, set_module_enabled, get_module_inputs.

Evidence
User parameters

add/set/remove/rename_parameter with user scope; effect.set_niagara_parameter sets them at runtime.

Evidence

Native: list system user params, set override on a placed component; adding params to asset only via Epic toolset 5.8.

Evidence

System Get/Add/RemoveUserVariables plus component level Get/SetVariable overrides.

Evidence
  • NiagaraToolset_System.h:290 GetUserVariables, :440 AddUserVariables, :450 RemoveUserVariables
  • NiagaraToolset_Component.h:48 GetUserVariables, :58 SetVariable, :69 GetVariable

Via Epic toolset: AddUserVariables/RemoveUserVariables; VibeUE skill warns add can crash (issue 464).

Evidence

add/remove/rename_user_parameter, get_user_parameters, set_parameter_default.

Evidence
HLSL module create

CustomHlsl node via niagara.graph.create_node in an existing graph; no RPC creates a new module script asset.

Evidence

create_module_from_hlsl, create_scratch_module, get_custom_hlsl and set_custom_hlsl read/rewrite node bodies.

Evidence

Only inline HLSL expressions on stack inputs via SetStackInputData; no custom HLSL module or script creation.

Evidence
  • Engine/Plugins/FX/Niagara/Source/NiagaraEditor/Public/NiagaraExternalSystemEditorUtilities.h:583 FNiagaraExt_StackInputData_HlslExpression
  • NiagaraToolsets/Content/Python/skills/custom_hlsl.py NiagaraCustomHLSLSkill (single rvalue rules)

Searched hlsl, CustomHlsl, UNiagaraNodeCustomHlsl; HLSL only appears in material custom expression code.

Evidence
  • rg -i hlsl|CustomHlsl over src and plugins: only material authoring files

NiagaraScratchPadService creates scratch modules, adds Custom HLSL nodes and sets their code.

Evidence

create_module_from_hlsl and create_function_from_hlsl; set_custom_hlsl_text edits Custom HLSL nodes.

Evidence
Spawn VFX in level

niagara.spawn_actor places an ANiagaraActor; effect.spawn_niagara also spawns systems.

Evidence

spawn (transient component) and spawn_actor (persistent labeled actor), plus reactivate.

Evidence

Generic EditorToolset add_to_scene_from_asset spawns an asset; Niagara level placement skill guides it.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:127 add_to_scene_from_asset
  • NiagaraToolsets/Content/Python/skills/level_placement.py NiagaraLevelPlacementSkill
  • NiagaraToolset_Component.h:38 SetSystem

No Niagara spawn op; skills route actor spawning to Python EditorActorSubsystem or engine toolsets.

Evidence

No Niagara spawn action; mesh.spawn_actor spawns a class but cannot set the system asset without run_python.

Evidence
Niagara emission validation

validate checks emitters, renderers, compile and placed component activation; no live particle count.

Evidence

validate: static check per emitter for enabled, a Spawn-named module and enabled renderer; no runtime particle count.

Evidence

Searched toolsets for particle count, activation, runtime emit checks; only compile state and stack issues.

Evidence
  • grep particlecount|GetNumParticles|Activate in NiagaraToolsets and NiagaraExternalSystemEditorUtilities.cpp: no hits
  • NiagaraToolset_Component.h: only SetSystem and user variable tools

validate_niagara_system checks stack issues and empty or disabled emitters; no particle count read.

Evidence

debug_activation reads validity, enabled flags, loop and spawn rate params; does not simulate or count particles.

Evidence

validate_system flags emitters with no spawn module; preview_system screenshots; no live particle count.

Evidence
Simulation stages / event handlers

add/remove_simulation_stage and add/remove_event_handler RPCs.

Evidence

add/remove simulation stage and add/remove event handler; stage/handler settings go through asset set_property.

Evidence

No add or edit tools for sim stages or event handlers; topology covers four stacks; only compile state lists them.

Evidence
  • NiagaraExternalSystemEditorUtilities.h:886 FNiagaraExt_EmitterTopology has only Emitter/Particle Spawn/Update stacks
  • NiagaraExternalSystemEditorUtilities.cpp:941 FindScriptGroup(Usage, FGuid()) cannot target a specific stage
  • NiagaraExternalSystemEditorUtilities.h:359 compile state lists event handler and sim stage scripts

Searched SimulationStage, EventHandler in VibeUE and Epic NiagaraToolsets; scratch stages are spawn/update only.

Evidence

add/remove/get simulation stages and event handlers, plus stage and handler property setters.

Evidence
Compiled GPU script inspection

GPU compute script compile status, errors and graph reported; generated HLSL or bytecode not exposed.

Evidence

get_compiled_hlsl returns only GPU script name and IsCompilable flag, no HLSL text; compile reports per-script events.

Evidence

GetSystemCompileState gives per script status and compile events incl GPU compute; no generated HLSL access.

Evidence
  • NiagaraToolset_System.h:584 GetSystemCompileState
  • NiagaraExternalSystemEditorUtilities.h:299 FNiagaraExt_ScriptCompileInfo
  • NiagaraExternalSystemEditorUtilities.cpp:3156 BuildScriptCompileInfo reads only status, ErrorMsg, compile events

Searched GetVMExecutableData, ByteCode, GetGPUComputeScript; only enable_gpu_simulation exists.

Evidence

Searched HLSL/GPU script readers; only get_compile_messages returns compiler diagnostics text.

Evidence

get_compiled_gpu_hlsl returns compiled GPU HLSL for an emitter.

Evidence
Level-wide Niagara crash-risk audit

niagara.audit_level flags live systems whose data interface counts mismatch and would crash on tick.

Evidence

Searched crash, audit, risk across src, plugin, docs; level handler only reports asset/active/visible per component.

Evidence
  • src/tools/level.ts:59 get_component_tree niagara{asset,active,visible}
  • grep crash|audit in Handlers/Niagara and Handlers/Level found only code comments

Searched NiagaraToolsets and EditorToolset for level wide Niagara scans or audits; none found.

Evidence
  • NiagaraToolset_System.h, NiagaraToolset_Component.h: per asset or per component tools only
  • EditorToolset scene.py: generic find_actors only

Searched TActorIterator of Niagara types, audit, crash; Niagara actor lookups are per action only.

Evidence
  • rg TActorIterator<ANiagara|audit|crash in Niagara domains and manage-effect records: no hits

Searched Niagara audit, crash, level scan in services and skills; profiling only has a niagara stat channel.

Evidence

Searched audit/level/crash actions; only audit_cross_asset_refs (stale C++ class refs), nothing per level.

Evidence
Niagara system as readable text

niagara.decompile_nir returns NIR text; asset dumps write nir.txt per Niagara asset.

Evidence

No text IR or T3D export for Niagara; only JSON info reads and Epic topology JSON. Searched ExportText, T3D, IR.

Evidence

Structured JSON via GetSystemSummary, GetEmitterTopology and input value calls; no single text dump.

Evidence
  • NiagaraToolset_System.h:218 GetSystemSummary
  • NiagaraToolset_System.h:247 GetEmitterTopology
  • NiagaraToolset_System.h:346 GetEmitterInputValues

get_niagara_info returns a JSON summary of emitters, modules, inputs, user params; no text IR.

Evidence

Via Epic toolset: GetSystemSummary and topology structs; VibeUE compare_systems diffs two systems.

Evidence

export_system_spec dumps a system as JSON spec that create_system_from_spec accepts; get_system_summary.

Evidence
Stack issues list and apply fix

No stack issue API; niagara.validate lists its own issue codes, fixes only via specific verbs for a few codes.

Evidence
  • grep StackIssue|GetStackIssues|UNiagaraStackEntry|FStackIssue|NiagaraValidation|ValidationRule|StackMessage in Plugins/PinWright/Source: no Niagara hits (only FDataValidationContext::GetIssues in Handlers/Level/LevelAuditUtils.cpp)
  • operation niagara.validate: structured errors/warnings/issues arrays (NO_EMITTERS, NIAGARA_SCRIPT_COMPILE_ERROR, NIAGARA_DATA_INTERFACE_MISMATCH, EMITTER_PARENT_STALE, SUBUV mismatch)
  • operation niagara.validate names remedies as separate verbs: niagara.remove_orphan_data_interfaces, niagara.refresh_emitter, niagara.compile; no issue carries an applicable fix
  • grep fix|remedy across Saved/PinWright/wiki/niagara*.md: only operation niagara.validate matches

Via wrapped Epic toolset, UE 5.8 only (epic_get_stack_issues, epic_apply_stack_issue_fix; Fix style only).

Evidence

GetStackIssues lists issues with fixes; ApplyStackIssueFix applies Fix style fixes and returns post fix issues.

Evidence
  • NiagaraToolset_System.h:593 GetStackIssues
  • NiagaraToolset_System.h:605 ApplyStackIssueFix

Stack Error and Warning issues listed by validate_niagara_system; no apply fix action (no GetFixes use).

Evidence

Via Epic toolset: GetStackIssues and ApplyStackIssueFix; no VibeUE own operation.

Evidence
  • Engine/Plugins/Experimental/Toolsets/NiagaraToolsets/Source/NiagaraToolsets/Private/NiagaraToolset_System.h:593,605

get_system_diagnostics and validate_system list issues; no stack issue API or fix apply found.

Evidence
Emitter and renderer CRUDAdds, edits and removes emitters and their renderers.

Emitter CRUD (Yes): create_emitter, add_emitter, remove_emitter, refresh_emitter, set_property cover emitter CRUD.

Renderer CRUD (Yes): add_renderer, remove_renderer, move_renderer; properties via niagara.set_property.

Emitter CRUD (Yes): create_emitter (template/inherit), add_emitter, remove_emitter, list_emitters, get_emitter_info, set_emitter_property.

Renderer CRUD (Yes): add_renderer (sprite/mesh/ribbon or class), list_renderers, set_renderer_property, remove_renderer by index.

Emitter CRUD (Yes): AddEmitter from template, RemoveEmitter, Get/SetEmitterData, GetEmitterTopology/Summary.

  • NiagaraToolsets/Source/NiagaraToolsets/Private/NiagaraToolset_System.h:463 AddEmitter
  • NiagaraToolset_System.h:472 RemoveEmitter
  • NiagaraToolset_System.h:315 GetEmitterData, :418 SetEmitterData
  • NiagaraToolset_System.h:247 GetEmitterTopology

Renderer CRUD (Yes): AddRenderer, RemoveRenderer, Get/SetRendererData, GetRendererSchema per renderer class.

  • NiagaraToolset_System.h:485 AddRenderer
  • NiagaraToolset_System.h:494 RemoveRenderer
  • NiagaraToolset_System.h:325 GetRendererData, :430 SetRendererData
  • NiagaraToolset_System.h:145 GetRendererSchema

Emitter CRUD (Partial): Create emitter, add to system, set properties; no remove or duplicate emitter subAction in any Niagara domain.

Renderer CRUD (Partial): Add sprite, mesh, ribbon, light renderers only; no list, edit or remove renderer subAction found.

Emitter CRUD (Partial): Via Epic toolset: AddEmitter/RemoveEmitter/SetEmitterData; VibeUE adds only set_sim_target and lifecycle read.

Renderer CRUD (Partial): Via Epic toolset: AddRenderer/RemoveRenderer/SetRendererData; no VibeUE renderer ops.

Emitter CRUD (Yes): add/remove/duplicate/rename/reorder emitter, create_emitter, set_emitter_property.

Renderer CRUD (Yes): add/remove/list renderers, set_renderer_property/material/mesh/binding.

Editor, build and C++ source

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Live Coding compile

system.live_coding_compile triggers in-process Live Coding and returns result plus LogLiveCoding tail.

Evidence

project.live_coding_compile via ILiveCodingModule plus live_coding_status; Windows only.

Evidence

CompileLiveCoding triggers Live Coding, waits, returns status plus compiler diagnostics.

Evidence
  • Engine/Plugins/Experimental/Toolsets/LiveCodingToolset/Source/LiveCodingToolset/Public/LiveCodingToolset.h:27 ULiveCodingToolset::CompileLiveCoding

No compile op; LiveCoding.Compile reachable only via console_command; read_log reads the Live Coding log.

Evidence

No VibeUE code for Live Coding; via Epic toolset LiveCodingToolset (CompileLiveCoding).

Evidence

editor.trigger_build / live_compile trigger a Live Coding compile, optional wait.

Evidence
PIE control

editor.play, stop, pause, resume, step_frame, possess, eject, status, pie_status.

Evidence

StartPIE, StopPIE, IsPIERunning with async wait for PIE start and shutdown.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:365 StartPIE, :372 StopPIE, :379 IsPIERunning

play, stop, pause, resume, eject, possess actions.

Evidence

PerformanceService StartPIE/StopPIE plus RunScenario start_pie/wait_for_pie/stop_pie steps.

Evidence

start_pie / stop_pie plus async run_pie_smoke / poll_pie_smoke / stop_pie_smoke sessions.

Evidence
Screenshot capture

editor.screenshot, editor.screenshot_window, render.capture_* and camera.* capture ops.

Evidence

capture_screenshot (pie, editor, window targets) and capture_scene_png at chosen size.

Evidence

CaptureViewport with optional grid and actor labels, CaptureEditorImage, CaptureAssetImage.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:246 CaptureViewport, :223 CaptureEditorImage, :216 CaptureAssetImage

capture_image tool (game incl. UMG, window, editor) and ViewportService CaptureScene from arbitrary camera.

Evidence

capture_scene_preview (asset preview), capture_pie_movement_clip (PIE frames); no plain level viewport shot.

Evidence
Viewport camera

editor.set_camera, focus_actor, bookmarks; system.inspect.get_viewport_info reads camera.

Evidence

set_viewport (pose, projection), set_viewport_view (fov, clip), focus_on_actor, get_viewport_state.

Evidence

GetCameraTransform, SetCameraTransform, FocusOnActors on the level viewport.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:270 GetCameraTransform, :277 SetCameraTransform, :285 FocusOnActors

set_camera sets editor viewport position/rotation/FOV; focus_actor and bookmarks too.

Evidence

ActorService SetViewportCamera and actor framing; ViewportService FOV, clip planes, camera speed.

Evidence

get_viewport_info reads camera; set only via mesh camera bookmarks or select_actors focus, no free set.

Evidence
Scalability + CVar bulk set

performance.set_scalability plus editor.set_preferences sets a map of CVars in one call.

Evidence

set_scalability plus set_cvars bulk set with old/new values, get_cvars.

Evidence

SearchCVars reads only; ConfigSettings writes ini settings without applying cvars; no Scalability or SetCVar.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:207 SearchCVars
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:96 SetSectionProperties

set_scalability per group, set_cvar single CVar, baseline profiles; no multi CVar batch.

Evidence

SetConsoleVariablesFromJson bulk cvar set; SetScalabilityLevel and SetOverallScalabilityLevel.

Evidence

No scalability or bulk CVar action; console commands via run_console_command or console_script array.

Evidence
Reflective UFUNCTION invocation

object.call_function invokes any UFUNCTION with JSON args and returns out params.

Evidence

invoke_object_function, invoke_function, invoke_static_function.

Evidence

Only UFUNCTIONs on UToolsetDefinition or MCP tool library subclasses are callable; no generic invoke.

Evidence
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetDefinition.h:32 IsFunctionAICallable
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolToolLibrary.h:33

No dedicated invoke tool; any BlueprintCallable is reachable only via execute_python_code.

Evidence

editor.pie_call_function invokes UFunctions via ProcessEvent, limited to live PIE objects.

Evidence
Live PIE actor manipulation

actor.* verbs resolve the PIE world first; property.set and object.call_function on PIE objects.

Evidence

teleport_runtime_actor, set_runtime_visibility, set_object_property on live PIE actors.

Evidence

Scene tools resolve the PIE world when PIE runs; find_actors, actor transform and property tools apply.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:476 _get_world, :66 find_actors
  • actor.py:122 set_actor_transform

PIEActorService spawn/destroy/list actors in server or client PIE worlds by selector; no move of existing.

Evidence
Engine class hierarchy / usage examplesAlso possible from the shell: grep over Engine/Source finds a class's declared parent and usage examples. The tools add a precomputed transitive subclass tree (and, for reflection-based ones, Blueprint and runtime-loaded classes) that grep only rebuilds by repeated searches.

search_classes filters by parent and inspect_class gives parent; no usage examples.

Evidence

class_hierarchy and find_example_usage over engine symbol index and sources.

Evidence

object.search_subclasses and list_properties give live hierarchy; no usage examples.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:16 search_subclasses, :51 list_properties

discover_python_class returns base_classes and docstrings; no subclass or usage example search.

Evidence

source.get_class_hierarchy and source.find_example_usage over indexed engine source.

Evidence
Headless scripted editor utilitiesAlso possible from the shell: UnrealEditor-Cmd <Project> -run=pythonscript -script=foo.py (or -ExecutePythonScript) runs an editor script headless from the shell. The tools add a persistent windowless editor so repeated calls skip the cold start, plus Editor Utility Blueprint runs with returned results.

editor.run_utility_blueprint and python.execute on a windowless editor from editor_start.

Evidence

run_utility_blueprint, run_python_file, YAML flows need a live editor; no commandlet runner found.

Evidence

No commandlet or headless editor tool; only internal ModelContextProtocolToolHashMappingCommandlet.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolHashMappingCommandlet.h

Bridge skips init under commandlets; Python only in a running editor; no editor utility ops.

Evidence

Module skips all services under commandlets; only a skill tip about -run=pythonscript.

Evidence

monolith_query.exe runs index queries offline without editor; no headless editor script runner.

Evidence
Frame-exact PIE pause and single-frame step

editor.pause freezes world and UI; editor.step_frame advances exactly one frame.

Evidence

Searched pause, step, SetPause, bDebugPauseExecution; only set_pie_time_scale and PIE start/stop/status.

Evidence

Searched Pause, SingleFrameAdvance, SetGamePaused; PIE tools only start, stop and query.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:365 StartPIE, :372 StopPIE

Searched SetPause, SetGamePaused, StepFrame, SingleFrame, bIsPaused; none found.

Evidence
  • grep over Source returned no matches

Searched SetPause, StepOneFrame, SetGamePaused; no PIE pause or single frame step.

Evidence
Memory report capture

performance.generate_memory_report runs memreport and returns the file path.

Evidence

get_perf_stats reads FPlatformMemory stats; memreport only via execute_command.

Evidence

Searched MemReport, LLM, FPlatformMemory, memory stats; no memory report tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep MemReport|FPlatformMemory: no hits)

Searched MemReport, LLM_, FPlatformMemory in Source; none found.

Evidence
  • grep memreport|LLM_|FPlatformMemory over Source returned no matches

Searched memreport, MemReport; no memory report capture action.

Evidence
Project C++ reflection index linked to assets

No project C++ index tied to assets; engine-wide reflection API index plus live native class to asset queries.

Evidence

No persisted index; live reflect_class plus search_call_sites finds Blueprint call sites.

Evidence

No indexed C++ reflection data; SemanticSearch index covers assets only, reflection is live per call.

Evidence
  • Engine/Plugins/Experimental/Toolsets/SemanticSearchToolset/Source/SemanticSearchToolset/Private/SemanticSearchToolset.h:41

Searched for a C++ reflection or source index linked to assets; none.

Evidence
  • rg index|cpp in capability records: only live inspect_class reflection

Searched for C++ reflection index tied to assets; journal only links optional GameIQ plugin snapshots.

Evidence
Console commands and Python executionRuns console commands and editor Python.

Console command (Yes): system.console_command and editor.console_command (PIE world selector), plus system.console.search.

Execute Python (Yes): python.execute runs code or a .py file in the editor Python interpreter.

Console command (Yes): editor.execute_command runs a console command.

Execute Python (Yes): execute_python (gated behind a tool search ruling) and run_python_file.

Console command (Partial): No console exec tool; reachable only by SlateInspector Type with Submit into the editor Cmd input box.

  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:142 Type(Ref, Text, Submit)
  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolset.cpp:330
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:207 SearchCVars (read only)

Execute Python (Partial): execute_tool_script runs sandboxed Python that only calls tools; imports limited to json, math, re etc.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script
  • programmatic.py:52 _SUPPORTED_MODULES (no unreal module)

Console command (Yes): console_command in control_editor and system_control, with a command safety policy.

Execute Python (Yes): execute_python runs inline code or a .py file; requires explicit consent.

Console command (Partial): No standalone exec tool; console_command only as a RunScenario step; cvar get/set in EngineSettingsService.

Execute Python (Yes): execute_python_code MCP tool with auto save of dirty packages and crash recovery.

Console command (Yes): editor.run_console_command routes to first PIE PlayerController, else GEngine->Exec.

Execute Python (Yes): editor.run_python via IPythonScriptPlugin::ExecPythonCommandEx, file/statement/evaluate modes.

Editor state read (open assets, dirty packages)Reports what the user has open and what is unsaved.

What the user has open (Yes): Content Browser selection/path, selected actors, selected graph nodes, open window list.

Dirty packages / world state read (Yes): editor.list_dirty_packages, asset.is_dirty, editor.status and system.inspect world reads.

What the user has open (Yes): get_open_asset_editors reports open editors, tabs and focus.

Dirty packages / world state read (Yes): list_dirty_packages and get_world_state.

What the user has open (Yes): GetOpenAssets, GetSelectedActors, GetSelectedAssets, GetContentBrowserPath, get_current_level.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:352 GetOpenAssets, :256 GetSelectedActors, :316 GetSelectedAssets
  • scene.py:45 get_current_level

Dirty packages / world state read (Partial): asset.is_dirty checks one asset; no list of all dirty packages.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:353 is_dirty

What the user has open (Partial): Selected actors, current level, viewport info; no list of open asset editors.

Dirty packages / world state read (Partial): World settings readable; dirty package list only via restart_editor validateOnly, a destructive-consent op.

What the user has open (Partial): IsAssetOpen per path and Content Browser selection only; open asset list via Epic toolset GetOpenAssets.

Dirty packages / world state read (Partial): execute_python_code reports saved_packages after auto save and resident_maps; no read-only dirty list.

What the user has open (Partial): Actor selection via mesh.select_actors and viewport info; no open asset editors list, no GetAllEditedAssets.

Dirty packages / world state read (Yes): editor.list_dirty_packages reports unsaved packages; save_packages; list_errored_blueprints.

Editor start/stop/restart (incl. windowless)Launches, stops and restarts the editor, optionally offscreen. Also possible from the shell: the shell launches UnrealEditor.exe <Project>.uproject (with -RenderOffScreen -unattended for windowless) and can terminate the process. The tools add readiness detection and a graceful quit that refuses to drop unsaved changes, which killing the process cannot give.

Editor start/stop/restart (Yes): Proxy tools editor_start and editor_restart plus editor.quit RPC.

Windowless (offscreen) editor launch (Yes): editor_start visible:false launches with -RenderOffScreen and unattended flags.

Editor start/stop/restart (Yes): start_editor, stop_editor, restart_editor scoped to the loaded project.

Windowless (offscreen) editor launch (No): start_editor spawns editor with only the .uproject arg; searched nullrhi, RenderOffScreen options.

Editor start/stop/restart (No): HTTP server runs inside the editor process; no tool to launch, stop or restart the editor.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:38 ServerPortNumber

Windowless (offscreen) editor launch (No): Server lives inside an already running editor; no launch options, offscreen or otherwise.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:38

Editor start/stop/restart (Partial): restart_editor relaunches a running editor; no op to cold start or stop an editor process.

Windowless (offscreen) editor launch (No): No editor launcher at all; only launch_build runs a packaged game with -RenderOffscreen.

Editor start/stop/restart (Partial): Shipped BuildAndLaunchGame.ps1/.sh stops, builds and relaunches editor; not an MCP tool.

Windowless (offscreen) editor launch (No): Launch script starts the GUI editor; searched RenderOffscreen, nullrhi, unattended; no match.

Editor start/stop/restart (No): No launch/stop/restart action; searched RestartEditor, RequestExit, CreateProc. Proxy only survives restarts.

Windowless (offscreen) editor launch (No): No editor launch at all; searched RenderOffscreen, nullrhi (only guards against no RHI).

Automation test runnerRuns automation tests, optionally in isolated processes. Also possible from the shell: UnrealEditor-Cmd <Project> -ExecCmds="Automation RunTests <Filter>;Quit" -unattended -ReportExportPath=... runs tests from the shell, one process per group, with results in index.json. The tools add running tests inside the already loaded editor without a cold start and returning structured status.

Automation test runner (Yes): system.run_tests runs automation tests as a job; proxy editor_prepare_tests plans CLI runs.

Process-isolated automation test groups (Yes): system.run_tests isolateGroups runs each filter group in a bounded child process.

Automation test runner (Yes): run_automation_tests in editor; also Epic AutomationTestToolset wrappers (UE 5.8 only).

Process-isolated automation test groups (No): Searched RunTests, ExecCmds; run_automation_tests runs on editor game thread, Epic toolset in process too.

Automation test runner (Yes): DiscoverTests, ListTests, RunTests, RunTestsByFilter, GetTestStatus, GetTestResults, StopTests.

  • Engine/Plugins/Experimental/Toolsets/AutomationTestToolset/Source/AutomationTestToolset/Public/AutomationTestToolset.h:40 DiscoverTests, :55 RunTests, :73 RunTestsByFilter

Process-isolated automation test groups (No): RunTests runs in the local editor worker; no process isolation or grouping by process.

  • Engine/Plugins/Experimental/Toolsets/AutomationTestToolset/Source/AutomationTestToolset/Public/AutomationTestToolset.h:55 RunTests

Automation test runner (Yes): run_tests issues automation RunTests/RunAll with a filter; results only in the Output Log.

Process-isolated automation test groups (No): Tests run in the live editor via automation RunTests; no separate process per group.

Automation test runner (Partial): No VibeUE test runner; via Epic toolset AutomationTestToolset RunTests. RunScenario is PIE assertions.

Process-isolated automation test groups (No): No test runner of its own; searched for isolated test process groups, none.

Automation test runner (Yes): list_automation_tests and run_automation_tests by prefix inside the running editor.

Process-isolated automation test groups (No): run_automation_tests runs in the editor process only, no separate process groups.

Unreal Insights trace, profiling and exportCaptures Insights traces and exports their tables. Also possible from the shell: traces can be captured by launching with -trace=... -tracefile=... from the shell and exported by UnrealInsights.exe -OpenTraceFile=... -ExecOnAnalysisCompleteCmd="TimingInsights.Export...". The tools add starting, stopping and bookmarking a trace on an already running editor or PIE session.

Unreal Insights trace / profiling (Yes): insights namespace: start/stop session, snapshot, channels, export; start_profiling refuses on UE 5.8.

Trace export to CSV tables (Yes): insights.export_trace writes .utrace data to CSV tables as a job.

Unreal Insights trace / profiling (Yes): start/stop/pause trace, channels, regions, bookmarks; records .utrace, does not analyze it.

Trace export to CSV tables (No): Searched csv, CsvProfile, trace export; stop_trace only reports .utrace path, bridge does not read traces.

Unreal Insights trace / profiling (No): Searched Trace, Insights, utrace, FTraceAuxiliary, stat; no trace or profiling tools.

  • Engine/Plugins/Experimental/Toolsets (grep Insights|utrace|FTraceAuxiliary: no tool hits)

Trace export to CSV tables (No): No trace tools at all; searched Trace, Insights, CSV export.

  • Engine/Plugins/Experimental/Toolsets (grep TraceServices|Insights: no hits)

Unreal Insights trace / profiling (Yes): start/stop/pause trace sessions via FTraceAuxiliary, trace status; analyze_trace only probes header.

Trace export to CSV tables (No): analyze_trace only reports file size and header bytes; searched csv in Insights and Performance.

Unreal Insights trace / profiling (Yes): PerformanceService Insights StartTrace/StopTrace, bookmarks, regions, Analyse and HTML Report.

Trace export to CSV tables (No): Searched csv/CSV in Source; Analyse returns JSON summary only.

Unreal Insights trace / profiling (Yes): trace_channels starts an Insights .utrace bracketing a PIE smoke session; csv_profile too.

Trace export to CSV tables (Partial): csv_profile writes CSV profiler output for PIE window; no .utrace to CSV export.

Editor window automation (drive, resize, capture)Clicks editor UI by element and resizes or captures whole windows.

Drive editor windows and dialogs by element (Yes): drive.* with surface editor_chrome observes and clicks elements in editor windows and dialogs.

Editor window resize and full-window capture (Yes): editor.resize_window, editor.set_window_state and editor.screenshot_window.

Drive editor windows and dialogs by element (Partial): Native: dialogs only; Slate click/type by ref via wrapped Epic toolset, UE 5.8 only.

Editor window resize and full-window capture (Partial): capture_screenshot target=window captures a whole Slate window; searched resize, none found.

Drive editor windows and dialogs by element (Yes): SlateInspectorToolset: widget tree Snapshot with refs, Click, Type, Drag, SelectOption, FillForm, Windows.

  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:92 Snapshot, :129 Click, :168 Windows

Editor window resize and full-window capture (Partial): CaptureEditorImage grabs all editor windows; Slate Windows lists, focuses, closes but cannot resize.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:223 CaptureEditorImage
  • SlateInspectorToolset.h:168 Windows (list/select/close)

Drive editor windows and dialogs by element (Partial): widget_click drives PIE UMG Button/CheckBox/Slider by name; editor Slate windows only by coordinates.

Editor window resize and full-window capture (Partial): full_editor_window capture of any editor window by title; restore only, no arbitrary window resize.

Drive editor windows and dialogs by element (Partial): No VibeUE editor UI driver; via Epic toolset SlateInspectorToolset click, drag, Windows.

Editor window resize and full-window capture (Partial): capture_image source=window captures the whole editor window; no window resize found.

Drive editor windows and dialogs by element (No): No Slate window or dialog driving; searched SWindow, ProcessMouseButtonDownEvent, IAutomationDriver.

Editor window resize and full-window capture (No): No window resize action; include_ui clip may catch whole editor window only as a side effect.

Frame timing analysis and hitch injectionMeasures frame time with a bottleneck verdict and injects hitches for testing.

Frame timing with bottleneck verdict (Partial): performance.run_benchmark returns measured frame time stats but no CPU/GPU bound verdict.

Hitch injection for testing (No): Searched hitch in handlers and wiki; no hitch injection op.

Frame timing with bottleneck verdict (Yes): get_frame_timing returns thread ms, GPU min/avg/max and bound gpu/cpu-game/cpu-render/cpu-rhi verdict.

Hitch injection for testing (Yes): trigger_hitch stalls game thread up to 5000 ms with trace bookmark.

Frame timing with bottleneck verdict (No): Searched stat unit, FrameTime, GAverageFPS, GPU time; no frame timing or bottleneck tool.

  • Engine/Plugins/Experimental/Toolsets (grep FrameTime|GAverageFPS|stat unit: no hits)

Hitch injection for testing (No): Searched Hitch across toolsets; no hitch injection tool.

  • Engine/Plugins/Experimental/Toolsets (grep Hitch: only Niagara skill text)

Frame timing with bottleneck verdict (Partial): get_performance_stats returns game, render, RHI, GPU ms and busiestThreadMs; no explicit verdict.

Hitch injection for testing (No): hitch and renderhitch console commands are explicitly blocked; no injection op.

Frame timing with bottleneck verdict (Yes): FrameTiming returns Game/Render/GPU/RHI ms, CPU vs GPU bound verdict and budget gate.

Hitch injection for testing (Yes): ForceHitch stalls game, render, both or GPU for N frames and checks the verdict.

Frame timing with bottleneck verdict (Partial): get_stat_group_values reads stat group timings; no bottleneck verdict; searched bottleneck, GameThreadTime.

Hitch injection for testing (No): Searched hitch, Hitch across Source; no hitch injection action.

Editor safety and session control

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Modal dialog detection

I/O thread probe reports EDITOR_BLOCKED_ON_MODAL with modal title and seconds blocked, via ping and calls.

Evidence

Plugin publishes the active modal from the modal loop tick; server watches it and probes on demand.

Evidence

No modal detection; searched modal/dialog/MessageDialog. Tools only pre-save to avoid dialogs (scene.py:398).

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:398

No modal detection; health file reports game thread stall seconds, which a blocking modal would raise.

Evidence

Passive watcher logs MODAL_OPEN/MODAL_CLOSE to the editor log; no MCP call reports modal state.

Evidence
Asset locking between agents

Searched source and wiki for asset/package lock, lease, claim between agents; none found.

Evidence
  • Grep asset.?lock|package.?lock|AcquireLock|ASSET_LOCKED over Plugins/PinWright/Source/PinWright/Private: no hits

asset lock, unlock, list_locks with TTL; automatic locking of mutating calls is opt in via ue-mcp.yml.

Evidence

No agent asset locks; only source control state queries can_edit/can_edit_asset. Searched lock/lease/claim.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:416
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:372

Searched lock/lease/another agent; none. BT and Blackboard edits only refuse while an asset editor is open.

Evidence

Searched lock/Lock in Source and proxy; only internal registry and DB mutexes, no per-asset agent locks.

Evidence
On-demand tool discovery (lean context)

Single call tool; namespace and method docs fetched on demand or read from the on disk wiki.

Evidence

Default micro strategy advertises one tools gateway (search, describe, call), about 2.1k tokens.

Evidence

bEnableToolSearch (default true) exposes only list_toolsets, describe_toolset, call_tool.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:46
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolSearch.cpp

Single 'unreal' tool with search, describe, execute operations over the capability catalog.

Evidence

Tool Search via Epic toolset; VibeUE adds discover_python_* tools and lazy skills via Epic AgentSkill.

Evidence

Namespace dispatch tools plus monolith_discover lists actions tersely; schema on demand.

Evidence
Includes Epic 5.8 toolsets

Searched source and docs for Epic native MCP, ModelContextProtocol, AI toolset wrappers; none found.

Evidence
  • Grep ModelContextProtocol|native mcp|epic.*mcp|ToolsetRegistry over Plugins/PinWright: no hits

Wraps 824 Epic toolset tools in 52 toolsets as declared actions via epic_call_tool; UE 5.8 only.

Evidence

This product is Epic's native 5.8 MCP itself, so wrapping it does not apply.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin

Searched for Toolset, ModelContextProtocol plugin, Epic native MCP; only its own handlers and own HTTP server.

Registers into Epic's native MCP server and ToolsetRegistry; Epic toolsets served alongside on one endpoint.

Evidence

Searched Epic, ModelContext, native MCP, toolset registry; own HTTP MCP server only.

Evidence
Read dialog text and buttons

Blocked modal reports only its title; drive.observe reads editor window buttons but not while a modal blocks.

Evidence

list_dialogs returns title, message, buttons and choices; modal safe on the bridge.

Evidence

No tool reads dialog text or buttons; searched dialog/modal/MessageDialog.

Evidence
  • rg dialog over ModelContextProtocol, ToolsetRegistry, Toolsets

Searched dialog, modal, FMessageDialog; no tool reads dialog text or buttons.

Evidence

Modal title and message text harvested into the log record; no button list, not readable via MCP.

Evidence
Dialog check on every call path

Modal block fails every tools/call fast; suppression scope wraps every dispatched handler.

Evidence

One DialogGuard gates GuardedBridge calls, in-process tool dispatch and the HTTP flow routes.

Evidence

No dialog gate on any call route; server dispatch has no modal check.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp

No dialog system to gate calls; bridge RunAsync calls ExecuteTool directly with no gate.

Evidence

No dialog gate in dispatch path; searched ExecuteAction and HTTP handlers.

Evidence
Multi-editor write safety

_expect_editor refuses writes to another editor; saves refuse on disk divergence; quit refuses shared use.

Evidence

With several editors registered, untargeted mutating calls are refused until an editor is named.

Evidence

No cross-editor write coordination; searched lock/instance/multiple editor.

Evidence
  • rg lock|instance over ModelContextProtocol/Source, ToolsetRegistry, Toolsets

Searched for cross-editor write coordination; revision pins are per editor process only.

No cross editor write coordination; only per PID signal files and port clash logging.

Evidence

Searched multi-editor, instance, lock; no cross-editor write coordination.

Evidence
Rejects browser-origin requests

Requests with a non loopback Origin header get HTTP 403; loopback page origins are allowed.

Evidence

WebSocket upgrade with any Origin header is refused with 403.

Evidence

ValidateOriginHeader rejects Origin not localhost, 127.0.0.1 or [::1] on POST, GET and DELETE.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:73
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:520

WebSocket handshake tears down any request carrying an Origin header with code 4403.

Evidence

Via Epic toolset: Epic MCP server rejects non-localhost Origin headers; VibeUE adds no check.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:68-79

CORS echoes only loopback origins; requests from other origins still execute, response unreadable.

Evidence
Protected engine roots

Only animation and skeleton create verbs refuse /Engine targets; other asset writes accept any mount.

Evidence

UE_MCP_PROTECTED_ENGINE_ROOTS deny list; server refuses a protected engine root.

Evidence

No /Engine write protection; searched /Engine path checks. Only script open() is limited to project dirs.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:145

Searched /Engine prefix checks; validator test states engine root is writable, no protected roots.

Evidence
Undo transactions + history

Handlers use FScopedTransaction; editor.undo and editor.redo exist; no undo history listing verb.

Evidence

undo, redo, get_undo_state, get_transaction_history, undo_redo_steps, begin/end_transaction.

Evidence

Library tools run in FScopedTransaction; UndoTransaction helper exists; no undo or history tool.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolToolLibrary.cpp:251
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetLibrary.h:129

TransactionService: undo/redo, begin/end/cancel transaction, GetHistory, ResetBuffer.

Evidence

FScopedTransaction used widely, material begin/end_transaction; no undo, redo or history action.

Evidence
Transport auth token (on by default)

Bearer token required by default, auto generated 64 hex token file, bRequireAuthToken switch.

Evidence

Editor bridge has no auth (loopback only); bearer token only on the optional flow HTTP server, off by default.

Evidence

No auth token; only Origin and Mcp-Session-Id checks. Searched Authorization/bearer/token.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:580

bRequireCapabilityToken defaults true; token auto-generated at Saved/MCP/capability-token.

Evidence

No auth token in VibeUE or Epic server; README says loopback only with no authentication.

Evidence

Searched token/auth/bearer in HTTP server and settings; server open on all interfaces.

Evidence
Scoped access tokens (read-only, paths, quota)

One project wide token with on/off switch; searched settings for read only, path or quota scopes.

Evidence

Searched read-only, quota, path scopes, token scopes; none. Only custom guard code could emulate.

Evidence

No scoped tokens; only global tool name block/allow lists in settings. Searched token/read only/quota.

Evidence
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetRegistrySubsystem.h:33

Searched token, auth, read-only mode, quota, allowlist; no scoped access tokens.

Evidence

No auth at all; searched token, auth, quota.

Evidence
Guards against Blueprint corruption on edit

Refuses LIVE_INSTANCES_WOULD_BE_REINSTANCED, defers compiles to safe point, rolls back failed BPIR.

Evidence

Inherited component writes go to child ICH, orphan node cleanup, validate action; no reinstancing guard.

Evidence

compile_blueprint raises with node errors after compile; no reinstancing guard found.

Evidence
  • Engine/Plugins/Experimental/ToolsetRegistry/Content/Python/toolset_registry/helpers.py:30

Compile helper resets undo buffer when reinstanced instances would pin worlds; reports compile diagnostics.

Evidence

Refuses BP loads during PIE, guards BP class delete crash, PIE spawn rejects REINST/stale classes.

Evidence

validate_blueprint action and targeted reinstance crash workarounds; no general integrity guard.

Evidence
Writes check the target world first

Every mutating verb accepts expectWorld; mismatch returns WORLD_MISMATCH before the handler runs.

Evidence

REQUIRE_EDITOR_WORLD null check on handlers; PIE refusal on some actions; no expected level param.

Evidence

Some scene writes (add, remove, merge actors) raise while PIE is active; no general precondition.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:163
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:505

World mutating Python refused until editor world and World Partition are ready; several services refuse in PIE.

Evidence

Only load_level refuses while a PIE smoke session runs; write calls have no world precondition.

Evidence
Dialog answer policyHow modal dialogs get answered: automatically, by pre-armed patterns, by the agent, or only by a human.

Dialog system: policy (auto / defer / ask) (Partial): One toggle suppresses dialogs during RPCs (engine default answer); no per dialog auto, defer or ask choice.

Dialog system: per-row checkbox answers (No): No dialog answering API at all; searched dialog answer, respond, checkbox handling in source.

  • Grep dialog.?answer|respond_dialog|answer_dialog|pre.?arm over Plugins/PinWright: no dialog API hits

Dialog system: human-only answers via in-client form (No): No MCP elicitation or client form for dialogs; unattended page says a human must use the editor window.

  • wiki page unattended:99 (only remedies are a human or killing the process)
  • Grep elicit over Plugins/PinWright/Source: no hits

Dialog system: pre-armed pattern answers (No): No caller-set answer patterns; only blanket suppression to engine defaults plus a fixed boot prompt disable.

Dialog system: policy (auto / defer / ask) (Yes): Modes interactive, defer, auto from env var or state.json; default never resolves to auto.

Dialog system: per-row checkbox answers (Yes): respond_to_dialog takes items[] to toggle each SCheckBox row before pressing the button.

Dialog system: human-only answers via in-client form (Yes): Interactive mode puts the dialog to the person in an MCP elicitation form; agent presses are refused.

Dialog system: pre-armed pattern answers (Yes): set_dialog_policy arms a title/message substring pattern with a button label or response.

Dialog system: policy (auto / defer / ask) (No): No dialog policy setting or tool; searched dialog/modal/unattended across MCP, registry and toolsets.

  • rg modal|dialog|unattended over ModelContextProtocol, ToolsetRegistry, Toolsets

Dialog system: per-row checkbox answers (No): No dialog answering at all, so no per-row checkbox answers; searched dialog/checkbox.

  • rg dialog over ModelContextProtocol, ToolsetRegistry, Toolsets

Dialog system: human-only answers via in-client form (No): Elicitation capability struct is parsed but never used; no in-client human answer form.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Public/ModelContextProtocolCapabilities.h:25

Dialog system: pre-armed pattern answers (No): No pre-armed dialog answers; searched dialog/modal/auto answer patterns.

  • rg dialog|modal over ModelContextProtocol, ToolsetRegistry, Toolsets

Dialog system: policy (auto / defer / ask) (Partial): Fixed policy: handlers run with GIsRunningUnattendedScript so prompts take defaults; open modal refuses calls.

Dialog system: per-row checkbox answers (No): Searched for dialog answer or checkbox APIs; none found, dialogs are auto-defaulted or block calls.

Dialog system: human-only answers via in-client form (No): MCP elicitation only fills missing args; not used to answer editor dialogs.

Dialog system: pre-armed pattern answers (No): Searched for pre-armed dialog patterns or rules; none, only global unattended default answers.

Dialog system: policy (auto / defer / ask) (No): No dialog answer policy; searched dialog/modal. Services avoid dialogs by headless save and unattended delete.

Dialog system: per-row checkbox answers (No): No dialog answering at all; searched dialog/modal/checkbox handling.

Dialog system: human-only answers via in-client form (No): No in-client form or human answer flow; searched dialog, confirm, approval, consent.

Dialog system: pre-armed pattern answers (No): No pre-armed dialog answers; searched dialog/modal handling code.

Dialog system: policy (auto / defer / ask) (Partial): No general policy; per-action suppression only (start_pie on_compile_errors, run_python unattended, delete_assets).

Dialog system: per-row checkbox answers (No): Searched modal/dialog code; watcher is log only, no answer or checkbox API.

Dialog system: human-only answers via in-client form (No): Searched modal/dialog/form code; no in-client human answer form.

Dialog system: pre-armed pattern answers (No): Searched modal/dialog code; no pre-armed pattern answers.

Pre-call guards and policy hooksUser-defined checks that run before a call, optionally scoped by what the call changes.

Pre-call guards / policy hooks (Partial): Fixed built in dispatcher prechecks (readiness, params, world, editor identity); no user configurable hooks.

Guard scopes by declared effect (Partial): Only a binary bMutating registration flag; it scopes the expectWorld precondition to write verbs.

Pre-call guards / policy hooks (Yes): Declared guards with before/after hooks around every bridge call; before can deny with WRITE_BLOCKED.

Guard scopes by declared effect (Yes): Guard scopes all, mutations, writes, reads, unknown derived from each action's declared effect.

Pre-call guards / policy hooks (Partial): Static config block/allow lists for tool names and SetObjectProperties classes; no per-call hook API.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetRegistrySubsystem.h:33
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetRegistrySubsystem.h:59

Guard scopes by declared effect (No): No declared effect metadata; searched readOnlyHint/destructiveHint/annotations in server and registry.

  • rg readOnlyHint|destructiveHint over ModelContextProtocol/Source, ToolsetRegistry

Pre-call guards / policy hooks (Yes): Pre-dispatch gates: scope, consent, path, quota, editor state, catalog and live revision pins.

Guard scopes by declared effect (Yes): Record requiredScope is set from declared effect; exact-set Read/Write/Destructive/Admin scope check.

Pre-call guards / policy hooks (Partial): Hardcoded prechecks in execute_python_code (unsafe patterns, world ready); no configurable policy hook.

Guard scopes by declared effect (No): Tool metadata has no effect or read-only/destructive annotation; searched readOnlyHint, destructive, annotations.

Pre-call guards / policy hooks (No): ExecuteAction does alias, param and path checks only; searched guard/hook/deny/precondition.

Guard scopes by declared effect (No): Read-only and destructive hints exist but only feed tools/list annotations, no guard uses them.

Save and shutdown safetyChecks unsaved work on shutdown, confirms saves reach disk, and refuses to overwrite external changes.

Safe editor shutdown (dirty check) (Yes): editor.quit refuses UNSAVED_CHANGES unless save or discard; also EDITOR_IN_USE for other clients.

Verified save outcome (durable vs deferred) (Yes): asset.save reports saveState written, deferred, failed, blockedByPie; saved true only if file hit disk.

Refuses save over external disk changes (Yes): asset.save refuses SAVE_DISK_STATE_DIVERGED on hash mismatch unless overwriteDiskChanges is set.

Safe editor shutdown (dirty check) (Yes): request_editor_shutdown refuses on dirty packages and names them; stop_editor aimed by project lockfile.

Verified save outcome (durable vs deferred) (Partial): Reads dirty flag back; reports written, deleted, stillDirty per package; no deferred save state.

Refuses save over external disk changes (No): Save precheck covers protected mounts and read-only files only; no disk timestamp or hash comparison.

Safe editor shutdown (dirty check) (No): No editor quit or restart tool; searched RequestExit/quit/shutdown/restart.

  • rg RequestExit|quit_editor|shutdown over Toolsets, ToolsetRegistry, ModelContextProtocol

Verified save outcome (durable vs deferred) (Partial): save_assets returns a bool; empty list saves all dirty and returns True unchecked. No durable vs deferred.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:330

Refuses save over external disk changes (No): No disk change check before save; searched external/modified on disk in save paths.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:330

Safe editor shutdown (dirty check) (Yes): restart action refuses with UNSAVED_CHANGES listing dirty packages unless discardUnsaved is set.

Verified save outcome (durable vs deferred) (Partial): McpSafeAssetSave checks the package file exists on disk after save; returns bool, no deferred state.

Refuses save over external disk changes (No): Searched for disk timestamp or external change checks before save; none in Safety or save paths.

Safe editor shutdown (dirty check) (No): No editor quit tool; searched RequestExit, QuitEditor, quit_editor, shutdown in source and skills.

Verified save outcome (durable vs deferred) (Partial): Python auto_save reports saved_packages or save_failed; landscape edits report per file written_to_disk.

Refuses save over external disk changes (No): Searched timestamp, changed on disk, external modification; saves never compare disk state first.

Safe editor shutdown (dirty check) (No): No quit or shutdown action (searched RequestExit, quit); dirty check exists only in load_level.

Verified save outcome (durable vs deferred) (Partial): save_packages returns per-package status and dry_run; no durable versus deferred distinction.

Refuses save over external disk changes (No): Searched timestamp, external change, changed on disk in save paths; none found.

Script execution gatingBlocks or gates raw console and Python execution.

Dangerous console/script input blocking (No): Console verbs refuse only scalability CVar sets; docs state commands are not made safe; Python unfiltered.

Python escape hatch gated by tool search (No): python.execute runs any code with no search gate; wiki only advises checking typed verbs first.

Dangerous console/script input blocking (No): execute_command runs any console string unfiltered; searched deny lists, dangerous, quit/exit blocking.

Python escape hatch gated by tool search (Yes): execute_python refused until the caller rules out each tool search candidate with a reason.

Dangerous console/script input blocking (Yes): execute_tool_script sandbox: import allowlist, safe builtins, read-only open under project. No console tool.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:81
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:704

Python escape hatch gated by tool search (No): No raw Python tool; execute_tool_script is an allowlisted sandbox, not gated by tool search.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906

Dangerous console/script input blocking (Yes): Console command block policy shared by TS validator and native IsBlockedCommand; COMMAND_BLOCKED.

Python escape hatch gated by tool search (Partial): execute_python requires an explicit consent grant; not tied to a prior tool search.

Dangerous console/script input blocking (Partial): Python blocks input(), modal dialog calls, endless while True; os/subprocess/eval only logged.

Python escape hatch gated by tool search (No): execute_python_code is a top-level tool registered directly, promoted as the default workhorse, ungated.

Dangerous console/script input blocking (No): run_console_command and run_python pass input through; searched quit/exit/deny lists.

Python escape hatch gated by tool search (No): editor.run_python is callable directly with no gating; searched handler for checks.

Approval prompts for risky actionsAsks for confirmation before destructive calls or before starting PIE with Blueprint errors.

Per-action consent for destructive calls (No): No user consent gate; refusals clear via agent set force/discard flags, and dialogs are auto suppressed per RPC.

Approval for PIE with Blueprint errors (No): editor.play auto answers the Blueprint compile error modal and starts PIE anyway; no approval step.

Per-action consent for destructive calls (Partial): No built-in consent on deletes; only PIE bypass and feedback ask. A user-written guard can prompt.

Approval for PIE with Blueprint errors (Yes): PIE ignoring Blueprint errors needs an elicitation approval or pie.allowIgnoreBlueprintErrors config.

Per-action consent for destructive calls (No): No consent prompt for destructive tools; elicitation declared but unused. Searched confirm/elicit.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Public/ModelContextProtocolCapabilities.h:42

Approval for PIE with Blueprint errors (No): StartPIE only checks editor and running session; no Blueprint error check or approval step.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:365
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:958

Per-action consent for destructive calls (Yes): Consent grant must name the exact capability id; else CONSENT_REQUIRED, rechecked in plugin.

Approval for PIE with Blueprint errors (No): Play handler calls RequestPlaySession with no Blueprint error check; searched ControlEditorPlay.cpp.

Per-action consent for destructive calls (Partial): No consent prompt; bulk maintenance is dry run unless apply=true, delete needs force flag if referenced.

Approval for PIE with Blueprint errors (Partial): RunScenario preflight compiles listed Blueprints and fails before PIE on errors; no approval step.

Per-action consent for destructive calls (Partial): Only destructiveHint annotations in tools/list; delete_assets offers allowed_prefixes sandbox.

Approval for PIE with Blueprint errors (Partial): start_pie refuses on errored Blueprints by default; agent can pass suppress, no human approval.

Multi-editor detection and targetingFinds every running editor, including several on one project, and routes calls to a chosen one.

Multi-editor targeting (Partial): Port derives per project; system.identity plus _expect_editor refuses a wrong editor, but cannot pick among several.

Detect multiple editors on one project (Yes): Built for this case: system.identity plus _expect_editor refuse a wrong editor; PortInUse banner; spawn guard.

Multi-editor targeting (Yes): Several .uproject sessions; list_editors, add_editor, use_editor, and an editor param on every tool.

Detect multiple editors on one project (Yes): get_status runs detectProjectHolders: lists every editor pid holding the project and which one answers.

Multi-editor targeting (Partial): One server per editor; port set via -ModelContextProtocolPort=N. No instance discovery or routing.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolSettings.cpp:19
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:38

Detect multiple editors on one project (No): Searched for instance or port collision detection; none. Second editor on the same port just fails to bind.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:432 GetHttpRouter(ActiveServerPort) with no collision check
  • grep editor_instance|list_editors|already in use over plugin and toolset sources: no match

Multi-editor targeting (Partial): One editor per server process, chosen by MCP_AUTOMATION_PORT or UE_PROJECT_PATH ListenPorts; no runtime switch.

Detect multiple editors on one project (No): Searched for instance or busy port detection; busy ListenPorts token silently dropped, no warning to client.

Multi-editor targeting (Partial): Per PID readiness files list each editor's MCP port and map, plus port clash detection; no routing.

Detect multiple editors on one project (Partial): Per PID signal files in Saved/VibeUE/Signals and a port bind probe that logs when another editor holds it.

Multi-editor targeting (Partial): One editor per proxy via MONOLITH_URL env and port setting; no runtime selection between editors.

Detect multiple editors on one project (No): Second editor just fails to bind port after retries; sentinel file is overwritten, never read for detection.

Agent context and discovery

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Offline capability report

Wiki and registry.json on disk stay readable with editor off; proxy answers tools/list locally; none before first launch.

Evidence

project(list_available_actions) says per action whether it runs without an editor (always/editor/unknown).

Evidence

Headless commandlet writes tool and toolset names to JSON, meant for analytics hash decoding.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolHashMappingCommandlet.h UModelContextProtocolToolHashMappingCommandlet
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolHashMappingCommandlet.cpp:173 SaveStringToFile

search/describe and ue://capability/catalog answer from TS manifest without editor; no dedicated report op.

Evidence

Searched capability/offline report; only a readiness signal file with version, map and MCP port.

Evidence

Offline monolith_query.exe lists offline-servable namespaces vs live-only ones in usage/error text only.

Evidence
Per-client MCP compatibility fixes

Codex .well-known probe answered 404, Gemini httpUrl key, per-client config writers; no clientInfo adaptation.

Evidence

Keyed on clientInfo: Claude Code progress collapse note, elicitation relay for clients that truncate.

Evidence

Writes per-client config files for 5 clients; no runtime per-client behaviour; searched clientInfo usage.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolClientConfig.h EModelContextProtocolClient, WriteClientConfiguration
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolEngineModule.cpp:41 ModelContextProtocol.GenerateClientConfig

Adapts to declared client capabilities with fallback pointers; by design never keys on client name.

Evidence

Per client guide file writer, Gemini array item types, capitalized param fallback; no protocol quirk layer.

Evidence

Parses stringified params (Claude Code), no dots in tool names, cached tool list for clients ignoring list_changed.

Evidence
Progress notifications on long calls

Editor streams notifications/progress over SSE when a progressToken is sent; proxy relays frames.

Evidence

notifications/progress wired, but only editor start and session start report it; bridge calls send none.

Evidence

With a progressToken, tool calls stream notifications/progress heartbeats every 1s; counter only, no total.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:1087 Tick progress loop, SendProgressUpdate
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocol.cpp:57 ProgressIntervalSeconds

progressToken honored; bridge progress forwarded as notifications/progress on both transports.

Evidence

Epic MCP server sends heartbeat progress on any call with progressToken; VibeUE emits none itself.

Evidence

Searched notifications/progress, progressToken in server and both proxies: none; long jobs use poll actions.

Evidence
Per-operation docs generated to disk

One markdown page per namespace and per operation regenerated at editor startup, about 1500 pages.

Evidence

Build script writes a single docs/tool-reference.md; no per-action files at runtime; describe_action on demand.

Evidence

No per-tool doc files; only disk writes are client configs and the hash mapping JSON; docs come via describe_toolset.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolClientConfig.cpp:108 SaveStringToFile
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolsetRegistryAdapter.cpp:323 GetToolsetSchemaText

One generated repo doc table of all capabilities; no per-operation pages written at runtime.

Evidence

No generator; skills and Help pages are hand written markdown, GenerateAgentConfig copies one static guide.

Evidence

Shipped curated Docs/API_REFERENCE.md, not generated per operation; live schema via describe_query action_schema.

Evidence
Oversized results spilled to a file

Results over a character threshold are written to a file and the response points to it.

Evidence

No automatic spill; some actions take an opt-in outputPath (read_datatable, bulk_read_properties).

Evidence

Searched truncat, too large, spill; read_file errors above 80 KB and suggests a script instead.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:487 _MAX_READ_FILE_BYTES, :515 too large error

Oversized results refused with RESULT_TOO_LARGE; only a few ops take an explicit outputPath.

Evidence

Terrain water features saves full JSON to file and returns a summary; Python runs logged to Saved for recovery.

Evidence

No automatic spill; a few actions take opt-in output_path to write results to disk.

Evidence
MCP resources, prompts and completions

Only initialize, ping, tools/list, tools/call handled; searched resources/, prompts/, completion/: none.

Evidence

index.ts registers tools only; searched for registerResource, registerPrompt, completion handlers, none found.

Evidence

resources/list and read exist but no provider ships, so list is empty; no prompts or completion methods.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:40 GetPostInitMethods (no prompts/completion)
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolTests/Private/Mocks/MockModelContextProtocolResourceProvider.h (only implementer)

Resources plus templates, six workflow prompts, completion/complete on stdio and native transports.

Evidence

No AddResourceProvider, prompts or completions; skills are served as tools via Epic AgentSkillToolset.

Evidence

Only initialize, tools/list, tools/call, ping handled; searched resources/, prompts/, completion/complete: none.

Evidence
Live scripting-API introspection

Live UE reflection: reflect_class/struct/enum/instance, list_classes, editor(list_function_libraries).

Evidence

UObject reflection tools (get_class, list_properties, search_subclasses); no Python API or function introspection.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:16 search_subclasses, :51 list_properties
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:887 get_execution_environment

describe_reflected_api lists live UFunctions of a class from the installed build.

Evidence

discover_python_module, discover_python_class, discover_python_function, list_python_subsystems tools.

Evidence

describe.schema walks live UProperty reflection; cppreflect UFUNCTION lists come from index; Python via run_python.

Evidence
Did-you-mean suggestions for unknown names

Unknown actions refused with closest names; describe_action and reflect_class also list close matches.

Evidence

Unknown toolset in describe_toolset lists all toolset names; no fuzzy match; searched difflib, did you mean.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolsetRegistryAdapter.cpp:342 Available toolsets
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/Toolset.cpp:44 Tool not found

closestMatches suggestions for unknown capability, tool and action, with nextCall.

Evidence

Did you mean hints only for UMG slot property names; MetaSound fuzzy pin names; unknown tools get plain not found.

Evidence

Top 3 fuzzy suggestions for unknown namespaces and actions on dispatch errors, also offline CLI.

Evidence
Read-only / destructive tool annotations

Searched readOnlyHint, destructiveHint, annotations; tool descriptor has none, bMutating is internal.

Evidence

No MCP readOnlyHint or destructiveHint set; per action read/mutate class only via project(describe_action).

Evidence

tools/list emits only name, description, inputSchema, outputSchema; searched readOnlyHint, destructiveHint.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:731 ProcessListToolsJsonRpcCall

No MCP readOnlyHint/destructiveHint; each capability declares effect read/write/destructive plus consent.

Evidence

Searched readOnlyHint/destructiveHint/annotations; adapter sets only name, description, input schema.

Evidence

tools/list emits readOnlyHint, destructiveHint, idempotentHint annotations per tool.

Evidence
Batch many calls in one sandboxed script

python.execute runs a multi-step script with no sandbox; per-op batch verbs like actor.spawn_batch.

Evidence

flow(run) runs named YAML flows, not a sandbox; execute_tool_script via wrapped Epic toolset, UE 5.8 only.

Evidence

execute_tool_script runs Python calling other tools, import allowlist, restricted open, undo on failure.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:880 ProgrammaticToolset, :906 execute_tool_script

No sandboxed multi-call script; only unsandboxed execute_python (explicit consent) and per-domain batch ops.

Evidence

execute_python_code batches calls in one script; only pattern guards (input, modal, while True), no sandbox.

Evidence
Tool-set selection (context modes, per-category toggles)Chooses which tools the client sees, from a single gateway tool to per-category switches.

Selectable context modes (incl. single gateway) (Partial): Single gateway tool 'call' plus proxy lifecycle tools; no setting to choose another context mode or layout.

Per-category enable/disable (No): Searched settings and Source for namespace/category enable, allow or deny lists; none found.

Selectable context modes (incl. single gateway) (Yes): micro (single tools gateway, default), lean and full strategies, set in ue-mcp.yml or with ue-mcp context.

Per-category enable/disable (Yes): disable: [category, ...] in ue-mcp.yml removes those category tools from the advertised surface.

Selectable context modes (incl. single gateway) (Yes): bEnableToolSearch (default on) exposes only list_toolsets, describe_toolset, call_tool; off registers all tools.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:46 bEnableToolSearch
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolsetRegistryAdapter.cpp:156 RegisterTools gateway vs eager branch

Per-category enable/disable (Yes): Toolset and tool allow/block lists with substring or regex patterns; each toolset is also its own plugin.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetRegistrySubsystem.h:34 BlockedNames, :40 AllowedNames
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/Toolset.cpp:67 SetEnabled(IsNameAllowed)

Selectable context modes (incl. single gateway) (Partial): Single unreal gateway tool is the only surface; MCP_GATEWAY_MODE opt-out removed, so no mode choice.

Per-category enable/disable (Yes): configure op: enable_category/disable_category over core, world, gameplay, utility, per session.

Selectable context modes (incl. single gateway) (Partial): Via Epic toolset: endpoint gateway call_tool/describe_toolset; VibeUE adds no selectable mode.

Per-category enable/disable (Partial): Per tool DisabledTools list in Saved/Config/VibeUE.ini, bridge tools only; no per category switch.

Selectable context modes (incl. single gateway) (Partial): Fixed per-namespace dispatch tools; only proxy env MONOLITH_SPLIT_EDITOR_QUERY splits editor_query in two.

Per-category enable/disable (Yes): Settings module toggles bEnableBlueprint, bEnableMaterial, bEnableGAS etc; proxy editor allow/deny lists.

Large-result shaping (field selection, pagination)Trims result fields and pages through large reads.

Result field selection (select/omit) (Partial): Per-operation 'fields' allow-list on about 15 read ops (actor.list, asset.search...); no generic select/omit.

Cursor pagination on large reads (Partial): Cursor only on recorder.find_events/get_series and drive.events_since; other listing ops use offset/limit.

Result field selection (select/omit) (Yes): Every category takes select and omit dotted paths; a path that matches nothing is reported back.

Cursor pagination on large reads (Yes): Opaque nextCursor paging via shared C++ HandlerPagination.h, included by 28 bridge source files.

Result field selection (select/omit) (No): No select/omit param on results; searched fields/select/omit. Only object.get_properties takes a name list.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolsetRegistryAdapter.cpp:66 results returned as plain text
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:66 get_properties

Cursor pagination on large reads (Partial): Cursor paging only on tools/list and resources/list, off by default (PaginationPageSize=0); tool reads unpaged.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:334 ApplyPagination
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocol.cpp:63 PaginationPageSize = 0

Result field selection (select/omit) (No): Searched select/omit/fields/projection params in gateway schema and src; output fixed per capability schema.

Cursor pagination on large reads (Yes): Opaque cursor paging on gateway search and manage_asset list (nextCursor).

Result field selection (select/omit) (No): Searched select/omit/fields params; only name_filter, max_items and include_* toggles on discovery.

Cursor pagination on large reads (Partial): Cursor only on Fab catalog search, offset on Fab library; other reads use MaxResults caps.

Result field selection (select/omit) (Yes): Universal _fields / _omit / _compact_json response shaping on every action.

Cursor pagination on large reads (Yes): Base64 cursor pagination on source_query and Reflection Intelligence namespaces, not all reads.

Multiple projects and sessions

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Per-project engine selection

editor_start resolves the project's EngineAssociation to its engine root; PINWRIGHT_ENGINE_ROOT override.

Evidence

selectEngine resolves per project: editor.path/buildToolPath config, EngineAssociation, registry, last launch.

Evidence

Server is compiled into the engine that runs the editor, so there is no separate engine to select.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin (engine plugin, Experimental)

UBT lookup only: UE_ENGINE_PATH or .uproject EngineAssociation version against hardcoded roots.

Evidence

Only the build/launch script resolves engine from .uproject EngineAssociation or -UnrealEnginePath.

Evidence

Server is embedded in whichever editor loads the plugin; it never launches an editor or picks an engine.

Evidence
Layered config cascade (global to local)

Relies on UE ini layering (project Editor.ini, per user per project settings); no global PinWright config file.

Evidence

Deep merged stack: ~/.ue-mcp/config.yml, ue-mcp.yml, ue-mcp.{env}.yml, ue-mcp.local.yml, env vars.

Evidence

Uses stock UE ini layering (EditorPerProjectUserSettings) plus a command line port override; no MCP cascade.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:17 UCLASS config=EditorPerProjectUserSettings
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolSettings.cpp:16 GetServerPortNumber checks -ModelContextProtocolPort= then settings

One .env loaded, first hit wins (MCP_ENV_FILE, package root, cwd); env vars override; no merged layers.

Evidence

Global API key setting plus separate project Saved/Config/VibeUE.ini for disabled tools; no layering.

Evidence

One UDeveloperSettings in project Monolith ini plus MONOLITH_URL env; no global to local cascade of its own.

Evidence
Zero-config unique port per project

bAutoDerivePort defaults on: port derived from project path hash, published to Saved/PinWright/gateway-port.

Evidence

SHA1 of project root mapped into 49152-65535 by server and C++ bridge; bound port published to port.json.

Evidence

Fixed default port 8000 for every project; manual override via setting or -ModelContextProtocolPort.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Public/ModelContextProtocol.h:45 DefaultServerPort = 8000
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolSettings.cpp:16 GetServerPortNumber

Default ports 8090,8091 for all projects; per project needs ListenPorts in project ini, read by server.

Evidence

Uses Epic's default port 8000; override only via -ModelContextProtocolPort; code documents port fights.

Evidence

Fixed default port 9316, changed only by editing ServerPort setting; no per project port derivation found.

Evidence
Switch projects and add editors at runtimeChanges the target project or editor set without restarting the server.

Runtime project switch (No): Proxy is bound at launch to one project via --port-file/--uproject; no RPC or proxy tool switches project.

  • Content/Python/mcp_proxy.py:2940-2963 _build_argument_parser (single --port-file, --uproject)
  • grep switch_project|set_project|use_project in Source, Content\Python, docs\wiki-src: only project-settings hits

Add/drop editors at runtime (No): Proxy forwards to one project endpoint; only local tools are editor_start/restart/prepare_tests. No editor registry.

Runtime project switch (Yes): project(set_project) moves path resolution and bridge connection to another .uproject at runtime.

Add/drop editors at runtime (Yes): project add_editor (optional start), drop_editor, use_editor, list_editors; editor param routes any tool call.

Runtime project switch (No): Server runs inside one editor and serves only its project; searched for project switch/open tools, none.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:416 StartServer (in-editor HTTP server)
  • grep open_project|switch_project|OpenProject|load_project over ModelContextProtocol, ToolsetRegistry, Toolsets: no tool found

Add/drop editors at runtime (No): No hub or proxy; one server per editor process, each added by hand to the client config.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolClientConfig.cpp:149 WriteClientConfiguration writes one fixed server URL
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolModule.cpp:33 StartServer console command controls only the local server

Runtime project switch (No): Project fixed at startup via UE_PROJECT_PATH/projectPath; searched for switch/open_project actions, none.

Add/drop editors at runtime (No): Client dials one clientHost:clientPort socket; no WS server mode; searched connect/list_editors actions, none.

Runtime project switch (No): Server lives inside one editor process; searched Source for OpenProject/switch project, no tool found.

Add/drop editors at runtime (No): No registry of editors; each editor is its own endpoint. Searched Source and docs for editor list or attach.

Runtime project switch (No): Proxy forwards to one MONOLITH_URL fixed at startup; searched for project switch/set_project, none found.

Add/drop editors at runtime (No): Single embedded server per editor, proxy targets one URL; searched proxy for instance/editor registry.

Reliability and diagnostics

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Timed-out calls report an unknown outcome instead of retrying

Generic TIMEOUT has no outcome unknown flag and work commits; job tickets and idempotent verbs mitigate.

Evidence

Timeout error carries outcome unknown plus operationId; late editor replies are reconciled in abandonedCalls.

Evidence

No server-side tool timeout or outcome-unknown status; searched timeout in MCP server and registry.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:949 RunAsync has no deadline
  • ModelContextProtocolServer.cpp:878-882 late results for cancelled requests silently discarded

Timeout sends cancel_request that drops queued work; error says timed out, no outcome unknown flag.

Evidence

Python runs only: run_id result persisted, recover lost result via vibeue.last_python_result() not rerun.

Evidence

30s proxy timeout is reported as 'Editor not running, try again'; outcome unknown not signalled.

Evidence
Out-of-process engine state probe

Stdio proxy pings before each call and classifies alive, not_ready, unresponsive, modal, stale, not_running.

Evidence

editor(get_engine_state) reads process table, editor log, plugin status.json writer thread, native windows.

Evidence

Only an in-editor HTTP endpoint; no external process probes engine state. Searched server and toolsets.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:416-454

ue://health reads plugin session snapshot files from disk; bridge counters, last request, pid, no editor state.

Evidence

Background thread writes Saved/VibeUE/Signals health JSON every 5s with game thread stall seconds.

Evidence

Proxy polls plugin HTTP /health every 5s but uses it only as up/down; no process or loading-state probe.

Evidence
Asset registry health diagnostics

Searched wiki and Source for asset registry scan state or health verbs; IsLoadingAssets used only internally.

Evidence

asset diagnose_registry compares disk vs AssetRegistry and counts ghost entries.

Evidence

Searched IsLoadingAssets, WaitForCompletion, registry status; tools only query assets and tags.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:190-239

Searched asset registry status, IsLoadingAssets, redirector and broken reference diagnostics; none.

Evidence
  • grep over Source found no asset registry diagnostic operation

project refresh_assets forces a registry rescan and lists missing files; no registry health or scan-state report.

Evidence
Client session survives editor restarts

Stdio proxy owns the client session, follows gateway-port file; HTTP endpoint is stateless.

Evidence

MCP server is a separate Node process; background reconnect loop and ensureConnected on each call.

Evidence

Sessions are in memory; after restart server returns 404 and relies on client reinitialize per spec.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:590-595 unknown session 404, client should reinitialize
  • ModelContextProtocolServer.cpp:664-671 new in-memory session

TS stdio server outlives editor and lazily reconnects on each call via ensureConnected.

Evidence

No client proxy; clients hit Epic HTTP endpoint directly. Searched reconnect, session id; skill says restart client.

Evidence

Stdio proxy stays up across editor restarts, polls health and sends tools/list_changed.

Evidence
Client cancellation drops queued editor requests

No notifications/cancelled handling or disconnect cancel in transport or proxy; proxy only stops relaying.

Evidence

Searched cancel, notifications/cancelled, AbortSignal in dispatch and bridge: none; only timeout abandons work.

Evidence

notifications/cancelled drops the reply; only async action tools abort, toolset tools keep running.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:697-729
  • ModelContextProtocolEngine/Private/ModelContextProtocolToolAsyncAction.cpp:347 CancelAsync
  • ModelContextProtocolEditor/Private/ModelContextProtocolToolsetRegistryAdapter.h:17-20 no CancelAsync override

MCP cancel forwards cancel_request; plugin removes queued requests, in-flight ones run to completion.

Evidence

Tool adapter ignores request id; searched cancel, notifications/cancelled, queue in bridge.

Evidence

Proxy stdin loop is synchronous; notifications/cancelled is forwarded and the server ignores it.

Evidence
Editor readiness and hang reportingSignals when the editor is ready and reports hung or loading states instead of timing out.

Hung or loading editor reported, not timeout (Yes): EDITOR_NOT_READY, EDITOR_UNRESPONSIVE, EDITOR_BLOCKED_ON_MODAL and EDITOR_GAME_THREAD_STALLED codes.

Editor-ready signal with port-conflict check (Yes): ping editorReady bit; bind collision refuses to serve, retries bind, shows port conflict banner.

Hung or loading editor reported, not timeout (Yes): Editor down errors name startup phase, crash or modal; dialog guard refuses calls while a modal is up.

Editor-ready signal with port-conflict check (Yes): start_editor blocks until ready; bridge walks ports on collision, publishes port lockfile, writes bind failure.

Hung or loading editor reported, not timeout (No): HTTP server is ticked in the editor, so a hung game thread gives no reply; no busy or loading status.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:449-453 FTSTicker core ticker
  • ModelContextProtocolServer.cpp:637-644 ping always empty result

Editor-ready signal with port-conflict check (No): No ready signal or port check; bind failure is only an engine HttpListener log line.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:431-447 GetHttpRouter then StartAllListeners, no result check
  • Engine/Source/Runtime/Online/HTTPServer/Private/HttpListener.cpp:102 unable to bind log

Hung or loading editor reported, not timeout (Partial): Loading reported for some actions (ASSET_REGISTRY_SCANNING, VIEWPORT_NOT_READY) and stalled progress; else timeout.

Editor-ready signal with port-conflict check (Partial): /ready endpoint and plugin readiness flag exist; busy listen port is only logged, not in ready signal.

Hung or loading editor reported, not timeout (Partial): Stall visible only out of band in health file; the MCP call itself still hangs to client timeout.

Editor-ready signal with port-conflict check (Yes): Readiness JSON per PID with mcpPort, mcpListening; loopback bind probe logs port 8000 conflict.

Hung or loading editor reported, not timeout (No): Hung or busy editor yields a 30s timeout reported as editor not running; no busy or loading check.

Editor-ready signal with port-conflict check (Partial): Proxy notifies on /health up; bind retries 20x then only logs failure; no port owner or conflict report.

Version parity and capability handshakeDetects mismatched or stale plugin and server builds and negotiates capabilities.

Plugin/server parity + stale build detection (Partial): Proxy flags a compiled plugin older than the proxy as EDITOR_PLUGIN_OUTDATED; identity reports plugin_build.

Protocol/ABI capability handshake (Partial): Standard MCP initialize only; system.identity plus _expect_editor pins pid and plugin_build, no version negotiation.

Plugin/server parity + stale build detection (Yes): Handshake action list compared to advertised surface; build time, handler spec drift and pluginBuildStale reported.

Protocol/ABI capability handshake (Yes): get_bridge_capabilities handshake returns protocolVersion, action list, builtAt; mismatch is explained.

Plugin/server parity + stale build detection (Not applicable): Server runs inside the editor process, so no separate server build can drift from the plugin.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:416-454 StartServer binds HTTP route in editor

Protocol/ABI capability handshake (Partial): Standard MCP initialize negotiates protocol version and checks Mcp-Protocol-Version header; no ABI layer.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Public/ModelContextProtocol.h:19-33 GetSupportedProtocolVersions, NegotiateProtocolVersion
  • ModelContextProtocolServer.cpp:597-603 header vs negotiated version check

Plugin/server parity + stale build detection (No): Ack sends fixed protocolVersion 1 and serverVersion 'unreal-engine'; parity checked only by repo tests.

Protocol/ABI capability handshake (Partial): bridge_hello/ack carry protocolVersion, opcodes, capabilities, scopes; TS uses only scopes, no version check.

Plugin/server parity + stale build detection (Partial): In-process, no separate server; get_environment flags last build stale by source mtimes, not loaded binary.

Protocol/ABI capability handshake (Partial): Via Epic endpoint MCP initialize; VibeUE adds only pluginVersion in readiness file, no ABI check.

Plugin/server parity + stale build detection (Partial): Stale check only for offline monolith_query.exe via source hash; proxy never compares its version to plugin.

Protocol/ABI capability handshake (No): Only standard MCP protocolVersion echo in initialize; no proxy/plugin ABI or capability check.

Privacy and feedback

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Credential + identifier scrubbing on outbound text

No scrubbing of keys, tokens or paths in report drafts. Searched scrub, redact, sanitiz, mask, secret.

Evidence
  • wiki page support lines 14-30 (drafting rules only forbid fabrication)
  • Grep (?i)scrub|redact|sanitiz over Saved\PinWright\wiki and Plugins\PinWright: hits are Sequencer scrubbing and asset name sanitizing only

Credential scrub and privacy scrub of paths, project name and username run on feedback text before posting.

Evidence

Analytics hash tool and toolset names with Blake3; no credential or free text scrubbing found.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolAnalytics.cpp:21-26 HashToolIdentifier
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolAnalytics.cpp:86-97 RecordToolCallEvent

Secret masking on receipts and envelopes; plugin redacts host paths and UserId/AccountId/LoginId keys.

Evidence

No outbound text scrubbing; only key-based [REDACTED] masking of run metadata in the local workflow journal.

Evidence

No outbound report text; searched scrub, redact, sanitiz, secret masking in Source, Scripts, Docs: none.

Evidence
  • Grep (?i)redact|scrub|sanitiz over Source/MonolithCore: only FString::SanitizeFloat and FRegisteredAction
No telemetry or outbound calls by default

No HTTP client or telemetry code in Source; server binds loopback; proxy host hardcoded to 127.0.0.1.

Evidence

No telemetry found, but startup queries registry.npmjs.org for updates by default; UE_MCP_DISABLE_UPDATE_CHECK=1 stops it.

Evidence

ToolCall and session events go to FEngineAnalytics by default; cvar ModelContextProtocol.EnableAnalytics=true.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolAnalytics.cpp:15-19 bEnableAnalytics = true
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolEngineModule.cpp:109-128 RegisterDefaultAnalyticsProvider
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEngine/Private/EngineAnalyticsProviderProxy.h:34-44 FEngineAnalytics::GetProvider().RecordEvent

No HTTP client in src; /metrics is loopback and off without MCP_METRICS_PORT; Fab fetches only on Fab actions.

Evidence

No telemetry; only outbound call is GitHub update check, gated by bAutoUpdateEnabled=false by default.

Evidence
Built-in feedback reportingFiles tool-gap or bug reports from inside the tool, with review before sending.

Auto-filed tool-gap feedback (Partial): Internal RPC errors auto-append a report hint; support page drafts a prefilled issue. User submits, never auto filed.

  • Source/PinWright/Private/Transport/McpRequestCore.cpp:854-863 McpRequestCore::WrapToolResult adds ReportHint 'call("support")' on INTERNAL/AUTOMATION_ERROR failures only
  • docs/wiki-src/support.md: agent drafts bug/critical-gap/feature report, opens prefilled GitHub issues/new URL with labels; hard rules: needs user approval, never submit, no gh issue create
  • wiki page index:143-145 Support section, 'never submits on its own'
  • Grep issues/new|report_gap|tool.?gap|file.?issue over Source and Content/Python: no code that files or posts an issue

Deferred report review queue (No): No stored report queue. Agent shows a draft, needs approval, opens a GitHub prefill page; user submits.

Issue-to-PR automation (No): No issue to PR automation found; support page forbids gh issue create. Searched .github, gh pr, issue.

Auto-filed tool-gap feedback (Yes): feedback(submit) files GitHub issues with Python workarounds attached; approval prompt unless auto-approve.

Deferred report review queue (Yes): defer mode queues reports on disk; CLI list/show/approve/discard plus an experimental review loop.

Issue-to-PR automation (Yes): npx ue-mcp resolve fetches an issue, runs Claude Code on a branch, opens a PR; needs gh and claude CLIs.

Auto-filed tool-gap feedback (No): No gap reporting tool; searched feedback/report_issue/missing tool. Only usage analytics exist.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolAnalytics.cpp

Deferred report review queue (No): Searched MCP, ToolsetRegistry, Toolsets for feedback, bug report, issue queue; none found.

  • rg -i 'scrub|redact|sanitiz|pull.?request|github|bug.?report|feedback|telemetry' over ModelContextProtocol, ToolsetRegistry, Toolsets: only FFeedbackContext and unrelated hits

Issue-to-PR automation (No): Searched for pull request, github, issue automation in all MCP and Toolsets sources; none found.

  • rg -i 'pull.?request|github' over ModelContextProtocol, ToolsetRegistry, Toolsets: no hits

Auto-filed tool-gap feedback (No): Searched src for tool gap, capability gap, report_issue, file_issue, feedback; no auto-filed gap reports.

Deferred report review queue (No): Searched src and plugin for feedback, bug report, report queue and review tooling; only GitHub issue templates.

Issue-to-PR automation (No): No issue-to-PR tooling in server or plugin; searched github.com, api.github, pull request in src.

Auto-filed tool-gap feedback (No): Searched feedback, issue filing, tool gap, report_issue in source and agent guide; nothing found.

Deferred report review queue (No): Searched for bug report, feedback, issue queue code; no deferred report review queue exists.

  • grep (?i)bug.?report|feedback|create_issue across VibeUE: only animation visual feedback comments

Issue-to-PR automation (No): No issue or PR automation; .github holds only FUNDING.yml, no gh or GitHub API calls in Source.

Auto-filed tool-gap feedback (No): Searched feedback, tool_gap, missing_feature, report gap; MISSING_FEATURES.md is manual, no auto filing.

Deferred report review queue (No): No feedback or bug report tool or queue; searched report_bug, report_issue, feedback, submit tools.

  • Grep for report_bug|report_issue|submit_feedback|create_issue over Source: no matches

Issue-to-PR automation (No): No issue-to-PR pipeline; .github has only macos-build.yml, PR template and FUNDING.yml.

Config and INI

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Typed Project Settings edit with schema

Typed checked edit for RendererSettings only; rejects unknown or non-config props; no schema listing.

Evidence

epic_get_section_schema and epic_set_section_properties via wrapped Epic toolset, UE 5.8 only.

Evidence

ConfigSettingsToolset lists container/category/section, returns JSON Schema, sets values from JSON.

Evidence
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:59 GetSectionSchema
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:96 SetSectionProperties

Values parsed into typed UProperty via ImportText with INVALID_VALUE errors; schema is only section/key/value strings.

Evidence

Own code only lists settings classes and property counts; typed get/set_setting via Epic toolset.

Evidence

set_developer_setting parses typed values via ImportText and returns type; no settings schema listing.

Evidence
INI layer resolution and diffResolves a key through every config layer and diffs project config against engine defaults.

Resolve any INI key across layers (Partial): Effective values only via property.get on a settings CDO and console.search currentValue; no layer attribution.

Diff project INI vs engine defaults (No): Searched source and wiki for ini diff, Base*.ini compare, FConfigFile, GetConfigBranch; nothing found.

  • Source (grep GConfig|FConfigFile|GetConfigBranch: no diff handler)
  • the generated PinWright wiki (grep .ini|DefaultEngine: BaseScalability only mentioned in prose notes)

Resolve any INI key across layers (Partial): read_config reads one project file, no layer merge; effective values only via CDO reads, cvars or Epic settings.

Diff project INI vs engine defaults (No): Searched diff/compare/BaseEngine/hierarchy in src and plugin; no INI vs engine default diff found.

Resolve any INI key across layers (Partial): Effective value only for settings section properties plus SearchCVars; no raw keys, no per layer attribution.

  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:75 GetSectionPropertyValues
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:207 SearchCVars

Diff project INI vs engine defaults (No): Searched Toolsets, ToolsetRegistry, MCP for config diff; schema has no defaults; only ResetSectionToDefaults.

  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:125 ResetSectionToDefaults
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.cpp:212 GetSectionSchema returns ListStructProperties only

Resolve any INI key across layers (Partial): CDO read gives effective value for property keys; raw keys read only project Default*.ini; no layer attribution.

Diff project INI vs engine defaults (Partial): No dedicated diff action; reachable only by system_control execute_python reading Base and Default INI files.

Resolve any INI key across layers (Partial): INI reads target one named project file, no layer merge; registered settings resolve via Epic toolset.

Diff project INI vs engine defaults (No): Searched services, skills and docs for ini/config diff or compare vs defaults; none found.

Resolve any INI key across layers (Yes): explain_setting lists Base, Default, Saved layer values and raw lines plus GConfig effective value.

Diff project INI vs engine defaults (Yes): diff_from_default compares merged GConfig vs Base<Category>.ini; reports added, modified, removed keys.

Project and asset management

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Full-text asset search

asset.search does substring/wildcard name match over the Asset Registry; no FTS5 or full-text index found.

Evidence

search_fts is a linear token-scored scan of the asset registry, not an SQLite FTS5 index.

Evidence

No FTS index; find_assets does substring name, class and tag filtering over the Asset Registry.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:177 AssetTools.find_assets

search_assets filters asset registry by class/path plus case-insensitive name substring; no FTS index.

Evidence

No FTS5 or SQLite index in VibeUE; asset search only via Epic toolset AssetTools.find_assets.

Evidence

project.search runs FTS5 queries over the SQLite asset index, with an asset_class filter.

Evidence
Find references

asset.dependencies (referencers), asset.references (outbound), asset.get_asset_graph BFS, classified deps.

Evidence

asset get_referencers and get_dependencies over the asset registry.

Evidence

get_referencers and get_dependencies tools query the Asset Registry.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:408 get_referencers
  • asset.py:427 get_dependencies

Gateway exposes dependencies and struct-only usage search; generic get_asset_references is not in the catalog.

Evidence

Via Epic toolset AssetTools.get_referencers; own code only returns referencers from unattended delete.

Evidence

project.find_references lists referencers and dependencies of an asset.

Evidence
Asset CRUD (move/rename/delete)

asset.move, rename, delete, duplicate, bulk_rename, bulk_delete, fixup_redirectors with readback.

Evidence

rename, bulk_rename, move, move_folder, delete, delete_batch, duplicate.

Evidence

move (rename), duplicate, delete, create_folder tools for assets and folders.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:140 move
  • asset.py:159 delete
  • asset.py:121 duplicate

move, rename, duplicate, delete, bulk_delete, bulk_rename; destructive ones require elevated consent.

Evidence

Own dialog-free DeleteAssetUnattended and bulk asset_move (rename); duplicate via Epic AssetTools.

Evidence

Rename with fixup (batch_rename_assets) and delete_assets exist; renames are name only, no move to another folder.

Evidence
DataTable row CRUD

data_table.create, add_row, set_row, remove_row, list_rows, set_row_struct with save reporting.

Evidence

add/set/update/get/remove/rename datatable row actions.

Evidence

DataTable create, add_rows, remove_rows, rename_rows, get_rows, set_rows, get_schema.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/data_table.py:111 add_rows, :128 remove_rows, :144 rename_rows, :200 set_rows

add, update, get, list, delete, clear and bulk import of DataTable rows, plus create table and row struct.

Evidence

DataTableService was cut; row CRUD via Epic toolset DataTableTools.

Evidence

Bulk upsert, remove, rename, duplicate rows plus JSON/CSV export and import.

Evidence
Structured asset diff

asset.dump diff=true writes per-aspect unified diffs of text sidecars against the baseline mirror.

Evidence

diff covers only Blueprint, Skeleton and SkeletalMesh; other asset classes report unsupported.

Evidence

Searched diff in toolset tool definitions; only unrelated comments, no asset diff tool.

Evidence
  • grep -i diff over Experimental\Toolsets *.py *.h: only comments in blueprint.py, data_table.py, PluginToolset.cpp

compare_structs diffs two user structs only; no general asset diff. Searched diff, compare_assets.

Evidence

Type specific pair diffs only: DiffBlueprints, CompareMaterialGraphs, Niagara CompareSystems.

Evidence

Per type structured diffs: compare_blueprints, niagara.diff_systems, compare_meshes, compare_behavior_trees.

Evidence
Content hygiene audit + fix

Per-domain audits (static meshes, level, Niagara orphans, BP orphans) plus redirector fixup; no project-wide sweep.

Evidence

audit_hygiene (unreferenced, broken refs, duplicates, naming, redirectors) plus bulk_fix_hygiene.

Evidence

Searched DataValidation, validator, unused, redirector, fixup; no audit or fix tool found.

Evidence
  • grep redirector|fixup|DataValidation|EditorValidator over Experimental\Toolsets: no tool hits

validate, validate_assets, generate_report and fixup_redirectors; no unused or naming audit with auto fix.

Evidence

Bulk cleanup_review is report only, never fixes; unused detection needs separate GameIQ plugin.

Evidence

Read-only audits (orphans, naming, unused audio); fixes need separate rename or delete calls.

Evidence
Migrate assets to another project

No migrate operation (searched migrat, MigratePackages); reachable only via python.execute escape hatch.

Evidence

asset migrate copies assets and dependencies into another project's Content dir, dryRun supported.

Evidence

Searched migrat in Toolsets, ToolsetRegistry, ModelContextProtocol; no migrate tool.

Evidence
  • grep -i migrat over Engine/Plugins/Experimental/Toolsets: no hits

Searched Migrat in Source and Skills; no asset migration to another project.

Evidence

Searched Migrate, MigratePackages and migrate actions; only index DB schema and UI settings hits.

Evidence
Bulk create-or-update of data assets in one transaction

No batch data-asset upsert op found; per-object property.set or python.execute only, not atomic.

Evidence

bulk_upsert_data_assets validates all items on transient copies before writing up to 500 assets.

Evidence

data_asset.create plus object.set_properties; execute_tool_script batches calls but is not transactional.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/data_asset.py:16 create
  • object.py:81 set_properties
  • programmatic.py:941 uses _ScriptRunner, _TransactionalScriptRunner (line 834) unused

import_data_table_rows validates all rows before mutating one DataTable; no bulk UDataAsset upsert.

Evidence

Searched upsert and data asset bulk ops; DataAssetService cut, bulk plan has no data asset op.

Evidence

seed_data_asset creates and fills one asset with dry_run; no multi asset atomic upsert batch.

Evidence
CurveTable / StringTable authoring

No CurveTable or StringTable ops (searched UCurveTable, UStringTable); only via python.execute.

Evidence

CurveTable create/import/rows/keys and StringTable create/entries/CSV import actions.

Evidence

CurveTable create, rows and keys editing; StringTable create, set_entry, remove_entry.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/curve_table.py:49 create, :143 set_keys
  • string_table.py:63 create, :142 set_entry

Searched stringtable, UStringTable, curvetable, UCurveTable: only widget text bindings reference string tables.

Evidence

No own code; via Epic toolset CurveTableTools and StringTableTools.

Evidence

Curve keys and rows, StringTable entries editable; no create action for these table assets found.

Evidence
User enum / struct authoring

blueprint.create_enum, set_enum_entries, create_struct, add/remove_struct_field, set_struct_field_default.

Evidence

create/edit user defined enum and struct, rename_struct_field.

Evidence

Searched UserDefinedEnum, UserDefinedStruct, factories; only a name resolution helper, no authoring tools.

Evidence
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/ToolsetLibraryImpl.cpp:225 (member name handling only)

UserDefinedEnum and UserDefinedStruct create, member edit, rename, reorder, delete.

Evidence

EnumStructService creates and edits user enums and structs (values, properties, types, defaults).

Evidence

create_user_defined_enum, create_user_defined_struct, plus add/remove/rename/retype struct fields.

Evidence
UV inspection and editing

Dedicated UV edit ops plus static mesh round trip; inspection limited to channel counts and hasUVs.

Evidence

read_uv_channels, check_uvs, unwrap_uvs, transform_uvs, lightmap UVs, export_uv_layout.

Evidence

Searched uv, UVChannel, lightmap in toolsets; only an internal uv_channel_data copy, no UV tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:252 (internal field copy)

UVMappingService: channel list/health, add/copy, unwrap, pack, transform, islands, layout image.

Evidence

get_mesh_uvs inspects always; compute_uvs needs GeometryScripting plugin and is compiled out of release builds.

Evidence
Asset export to files

Type-specific exports only: level.export T3D, actor.export, geometry.export_obj/stl, sequencer.export_fbx.

Evidence

asset export via engine exporters (PNG, FBX, etc.) plus export_texture.

Evidence

Only Sequencer FBX export of level sequence bindings; no generic asset export tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:18 export_fbx

Exposed: export_level, export_struct, export_heightmap, actor export; export_asset handler not in catalog.

Evidence

Texture, heightmap, weightmap and UV layout image export only; no generic mesh or FBX export.

Evidence

mesh.export_mesh writes static or skeletal mesh to FBX on disk.

Evidence
Offline greppable text mirror of assets

asset.dump_folder writes a text mirror (properties.json, bpir.txt, tree.xml, mgir.txt) meant for grep and git.

Evidence

blueprint export_batch writes per Blueprint JSON/T3D to Saved; Blueprints only, one shot, no sync.

Evidence

Searched for asset dump or text mirror tools; none, assets are read live via tools only.

Evidence
  • asset.py tool list (create_folder..get_plugin_content_paths, read_file, write_file): no dump/mirror

No on-disk text dump of assets found; searched mirror, dump, asset export to text cache.

Evidence

No on-disk text mirror; only per-call JSON exports like ExportMaterialGraph and ExportAnimationToJson.

Evidence

project.export_asset_text returns on demand T3D dump with grep; no disk mirror; offline tool queries SQLite index.

Evidence
Dry-run-first bulk refactor plans

No asset op (rename, move, duplicate, delete, fixup) offers a dry run; preflight only refuses bad batches.

Evidence

bulk_fix_hygiene dryRun defaults true for naming and unreferenced fixes; bulk_rename has no dry run.

Evidence

Searched dry_run, DryRun, validate_only, preview; no preview or dry run mode for bulk changes.

Evidence
  • grep dry_run|DryRun|dry-run over Experimental\Toolsets: no hits

Gateway refuses options.preview for all capabilities; only migrate_assets has dryRun, not a refactor.

Evidence

RunBulkMaintenance defaults to dry run, path scoped, rollback per target, resumable report.

Evidence

Per action dry_run flags (batch rename, table rows, bulk_fill, cleanup); no refactor plan engine.

Evidence
Import and reimport (mesh, texture, anim)Imports source files, authors import pipelines, and detects changed source textures.

Import mesh / texture / anim (Partial): asset.import imports by extension with default settings; no import options or target skeleton for anim FBX.

Import pipeline assets (Partial): No Interchange pipeline asset ops (searched interchange, pipeline); asset.import uses default factory; python only.

Texture change detection (Partial): No texture watcher; asset.dump_folder fingerprint cache reports dumped vs unchanged, diff mode shows changes.

Import mesh / texture / anim (Yes): import_static_mesh, import_skeletal_mesh, import_texture(_batch), import_animation.

Import pipeline assets (Yes): create_interchange_pipeline makes a UInterchangeGenericAssetsPipeline asset with options.

Texture change detection (Yes): compare_textures checks dimensions, format and FTextureSource id to detect changes.

Import mesh / texture / anim (Yes): import_file tools for static mesh, skeletal mesh (with import_animations flag) and texture.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:15 import_file
  • skeletal_mesh.py:16 import_file (import_animations param line 21)
  • texture.py:15 import_file

Import pipeline assets (No): Searched InterchangePipeline, pipeline asset tools; none, import_asset only takes factory and options.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:22 import_asset

Texture change detection (No): Searched reimport, source file change, texture tools; texture toolset has only import_file and get_size.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/texture.py:15 import_file, :35 get_size

Import mesh / texture / anim (Yes): asset.import via automated import; FBX animation take onto an existing skeleton supported.

Import pipeline assets (No): Searched InterchangePipeline, UInterchange, import_pipeline: none; import uses FBX factory options.

Texture change detection (No): Searched reimport, AssetImportData, source file hash or timestamp: no change detection op.

  • rg reimport|AssetImportData|SourceFileTimestamp over plugins/McpAutomationBridge/Source and src/tools/catalog: no op

Import mesh / texture / anim (Partial): Own ImportAsset is image only plus generic ReimportAsset; mesh import via Epic toolset StaticMeshTools.

Import pipeline assets (No): Searched InterchangePipeline; ReimportAsset uses Interchange handlers but no pipeline asset authoring.

Texture change detection (No): Searched hash, timestamp, reimport-needed checks; none for textures.

  • grep Checksum|MD5|SHA|GetTimeStamp|needs reimport: only tests, bulk plan id, landscape snapshots

Import mesh / texture / anim (Yes): mesh.import_mesh imports FBX/glTF static or skeletal meshes plus animations; editor.import_texture.

Import pipeline assets (No): Searched Interchange and import pipeline assets; imports use AutomatedAssetImportData only.

Texture change detection (No): Searched Reimport, SourceFileHash, FAssetImportInfo, GetSourceData; only generic saved asset mtime exists.

Source control integration (Perforce, Git)Status, checkout, submit and checkout-before-write through the editor source control providers. Also possible from the shell: git and p4 CLIs cover status, checkout (p4 edit), revert and submit. The tools add routing through the editor's source control provider so the running editor sees checkout state and checks out packages it saves itself.

Source control (Perforce) integration (Yes): source_control namespace plus asset checkout/submit run on the UE provider; connect accepts Perforce.

Provider-agnostic source control (incl. Git) (Yes): source_control.* uses the editor provider (Git, Perforce, SVN): connect, status, log, revert, mark_for_add.

Checkout-on-write guard (Partial): No automatic checkout before writes; explicit checkout verb and opt-in checkoutFiles on bulk_rename/fixup only.

Source control (Perforce) integration (Partial): Only in separate ue-mcp-perforce npm plugin; core ships a generic guard pipeline and no p4 actions.

Provider-agnostic source control (incl. Git) (Partial): Perforce checkout guard only in ue-mcp-perforce plugin; core has wrapped Epic is_checked_out; no Git.

Checkout-on-write guard (Partial): ue-mcp-perforce plugin guard checks files out or refuses on lock before writes; core only has the hook.

Source control (Perforce) integration (Partial): Generic SC state queries only (can_edit_asset, is_checked_out); no Perforce submit, revert or sync tools.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:370-404 can_edit_asset, is_checked_out via unreal.SourceControl.query_file_state
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:465-469 _sc_state for actors
  • No execute_python or console tool found in Toolsets/MCP/ToolsetRegistry (grep def execute_python|execute_console)

Provider-agnostic source control (incl. Git) (Partial): Only is_checked_out, can_edit_asset and silent checkout via engine SourceControl; no submit, revert, history.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:372 can_edit_asset, :391 is_checked_out, :632 _check_out_file

Checkout-on-write guard (Partial): Auto checkout in write_file and plugin descriptor edits; config set refuses unchecked ini; not a global guard.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:544,632-633 write_file calls unreal.SourceControl.check_out_file
  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.cpp:72-80 FCheckOut on .uplugin
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.cpp:47-58 errors if default ini not checked out

Source control (Perforce) integration (Yes): manage_asset source_control checkout, submit, enable via editor provider; enable takes provider name e.g. Perforce.

Provider-agnostic source control (incl. Git) (Yes): Uses ISourceControlModule provider by name for checkout, submit, state; git init and commit_all via git CLI.

Checkout-on-write guard (No): No automatic checkout before writes; saves use engine PromptForCheckoutAndSave; redirector fixup has opt-in checkoutFiles.

Source control (Perforce) integration (Partial): No source control tool; perforce/ISourceControl absent. Only via execute_python_code (unreal.SourceControl).

Provider-agnostic source control (incl. Git) (No): Searched SourceControl, ISourceControl, Perforce, git in Source and Skills; only git status advice.

Checkout-on-write guard (No): No checkout-on-write hook; searched CheckOut, ISourceControl, SourceControlHelpers in Source.

Source control (Perforce) integration (Partial): No source control actions; only editor.run_python could call UE SourceControl Python helpers.

Provider-agnostic source control (incl. Git) (No): Searched ISourceControl, SourceControl, checkout actions; none. Git is only mined read-only for churn stats.

Checkout-on-write guard (No): Searched checkout, SourceControl, perforce; write actions do no checkout; hits are git worktree comments only.

  • grep checkout: only .github workflow and MonolithReflectionIntel git worktree comments
Fab / marketplace asset search and importSearches Fab or other marketplaces and imports assets.

Free marketplace asset search and import (No): Searched fab, marketplace, quixel, megascan in wiki and Source; no marketplace search or import.

  • wiki page index

Fab library import (No): Searched Fab, Quixel, FabImport; only packaging comments, no import op.

Fab in-editor browser integration (No): Fab appears only as PinWright's own distribution channel (packaging scripts); no Fab browser operations.

Free marketplace asset search and import (Partial): fab category syncs owned library and imports cached or local files; no marketplace catalog search.

Fab library import (Partial): sync_library lists owned items; import_file only imports a local or cached file, no download by listing.

Fab in-editor browser integration (Partial): Core fab tool: login, library sync, cache, import; no catalog browse or purchase, those stay in the web window.

Free marketplace asset search and import (No): Searched Fab, marketplace; only a MarketplaceURL field in plugin descriptor info.

  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:59 MarketplaceURL

Fab library import (No): Searched Fab across ModelContextProtocol, ToolsetRegistry and Toolsets; no Fab import tool.

  • Engine/Plugins/Experimental/Toolsets (grep Fab: no tool hits)

Fab in-editor browser integration (No): Searched for fab across Toolsets, MCP and ToolsetRegistry; no Fab browser or import tools.

  • grep -riE '\bfab\b' over Engine/Plugins/Experimental/Toolsets, ModelContextProtocol, ToolsetRegistry: no hits

Free marketplace asset search and import (Yes): search_fab_listings with freeOnly, add_fab_asset_to_project, Fab download and Megascans import.

Fab library import (Yes): Fab search, details, library listing and add to project via McpAutomationBridgeFab module.

Fab in-editor browser integration (Yes): Fab tab open, search, details, library, download, add to project via McpAutomationBridgeFab module.

Free marketplace asset search and import (Yes): FabService searches free Fab catalog and imports free or owned listings (gltf/fbx), async status.

Fab library import (Yes): FabService ListLibrary, ImportAsset, ImportFreeAsset, ImportStatus.

Fab in-editor browser integration (Yes): Built-in FabService: owned library list, free catalog search, import, status; needs engine Fab plugin.

Free marketplace asset search and import (No): Searched Fab, Marketplace, Quixel, Sketchfab; hits only index installed marketplace plugins.

Fab library import (No): No Fab import; searched Fab, only a setting to index marketplace plugin content.

Fab in-editor browser integration (No): Fab mentioned only for plugin install paths and indexing Fab plugin content; no Fab browser control.

Levels and actors

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Place / delete / move actors

actor.spawn, actor.delete, actor.set_transform, actor.nudge are dedicated ops.

Evidence

Dedicated place_actor, delete_actor, move_actor, plus aim_actor_at; delete refuses ambiguous labels.

Evidence

add_to_scene_from_class/asset, remove_from_scene, set_actor_transform; look_at too.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:102 add_to_scene_from_class, :127 add_to_scene_from_asset, :154 remove_from_scene
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:122 set_actor_transform, :156 look_at

control_actor spawn, delete, set_transform, duplicate actions.

Evidence

Editor spawn/destroy/move via Epic toolset (SceneTools, ActorTools); own PIEActorService spawns in PIE only.

Evidence

mesh.spawn_actor, mesh.move_actor, mesh.delete_actors and mesh.duplicate_actor.

Evidence
Actor details / bounds

actor.describe returns identity, components, properties; actor.get_bounding_box returns bounds.

Evidence

get_actor_details (optional UPROPERTY dump) and get_actor_bounds returning AABB origin and extent.

Evidence

get_actor_bounds, get_actor_transform, get_components, get_properties; find_actors filters by AABB.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:341 get_actor_bounds, :106 get_actor_transform, :356 get_components
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:66 find_actors(bounds=...)

get_actor_bounds/get_bounding_box, inspect_object get_actor_details, get_transform.

Evidence

ActorService.GetAllProperties dumps all actor properties; CalculateActorView returns bounds center/extent.

Evidence

mesh.get_actor_info returns class, transform, components, bounds; also get_scene_bounds.

Evidence
Bulk batch spawn / translate

actor.spawn_batch spawns up to 512 per call; no batch move for actors, set_transform and nudge take one actor.

Evidence

place_actors_batch, spawn_actors_batch (instances, components, along spline), spawn_grid, batch_translate.

Evidence

No bulk op; execute_tool_script batches single spawn/transform calls in a sandboxed script.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:102 add_to_scene_from_class (single actor)

No batch actor spawn/translate op; only via execute_python_code or Epic ProgrammaticToolset scripts.

Evidence

Batch blockout spawn, batch BP spawn, batch_execute of 200 ops in one undo, align and randomize.

Evidence
Line trace / snap to floor

spatial.raycast line trace; spatial.ground_actors and ground_instances seat actors or instances on ground.

Evidence

line_trace, bulk_line_trace, snap_actor_to_floor, snap_instances_to_surface for HISM instances.

Evidence

trace_world returns hit distance; snap_to_ground flag on spawn only, no standalone snap.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:295 trace_world
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:104 snap_to_ground param, :628 _snap_to_ground

BatchLineTrace and BatchLineTraceGrid exist in LandscapeService; no snap-to-floor operation.

Evidence

query_raycast, query_multi_raycast, snap_to_floor and snap_to_surface.

Evidence
Level CRUD

level.create, load, save, save_as, duplicate, rename, delete, list.

Evidence

level create, load, save, list, get_current; no level delete action, asset deletion is separate.

Evidence

load_level, get_current_level; save/duplicate/delete via generic asset tools; no create new level.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:28 load_level, :45 get_current_level
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:121 duplicate, :159 delete, :330 save_assets

manage_level create, load, save, save_as, duplicate, rename, delete, list, export, import.

Evidence

Load/current level via Epic toolset SceneTools; new/save level only as documented Python recipes.

Evidence

create_empty_map, load_level, save_packages; delete through generic editor.delete_assets.

Evidence
World settings / sublevels

Sublevels dedicated (level.add_sublevel, level.stream); world settings only via property.set or dump.

Evidence

get/set_world_settings (game mode, killZ, gravity) plus add/remove/list streaming sublevels and props.

Evidence

No world settings or sublevel tools; WorldSettings reachable only via raw set_properties.

Evidence
  • grep WorldSettings|sublevel|LevelStreaming in Toolsets, ToolsetRegistry, ModelContextProtocol: no tools (only a comment in EditorAppToolset.cpp:1029)
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

manage_level set_world_settings, add_sublevel, stream; inspect get_world_settings.

Evidence

No world settings or sublevel operation or doc; reachable only through execute_python_code.

Evidence

Sublevel create/add/remove/move_actors exists; world settings limited to GameMode override.

Evidence
Build lightingAlso possible from the shell: UnrealEditor-Cmd <Project> -run=ResavePackages -BuildLighting -AllowCommandletRendering -Map=... builds and saves lighting headless. The tools add building the level currently open in the editor, including unsaved edits, and returning results without closing it.

level.build_lighting, lighting.build_lighting and level.build_all.

Evidence

build_lighting only runs the BUILD LIGHTING console command and returns triggered; no completion or results.

Evidence

Searched build_light, BuildLighting, LightingBuild, console exec in all toolsets; none found.

Evidence
  • grep BuildLighting|build_light|LightingBuild|ExecuteConsoleCommand|console_command over Toolsets, ToolsetRegistry, ModelContextProtocol: no matches

build_environment.build_lighting and manage_level.build_lighting, plus lightmass config.

Evidence

No lighting build op; only via Python LevelEditorSubsystem.BuildLightMaps in the engine.

Evidence
  • Engine/Source/Editor/LevelEditor/Public/LevelEditorSubsystem.h:222 BuildLightMaps
  • searched VibeUE for BuildLight, Lightmass: no hits

No build lighting action (searched BuildLighting, FEditorBuildUtils); only via editor.run_python.

Evidence
Spline editing

spline namespace: create actor, add/remove points, set position, tangents, type, spline meshes.

Evidence

get_spline_info and set_spline_points with typed points, tangents, closed loop, undo transaction.

Evidence

PCGToolset DrawSpline asks the user to draw a spline in the viewport; no point-level spline editing.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PCGToolset/Source/PCGToolset/Public/PCGToolset.h:386 DrawSpline

edit_spline add/set point position, rotation, scale, tangents, type; remove_spline_point.

Evidence

Landscape spline point/segment CRUD only; no SplineComponent editing API.

Evidence

place_spline creates a spline actor with points and mesh segments; no edit of existing splines.

Evidence
Instanced mesh (HISM) instance CRUD

ISM/HISM read and batch transform update; add/remove instances only for foliage actors.

Evidence

No instance tools; add_component an ISM then raw set_properties on its editable PerInstanceSMData array.

Evidence
  • grep InstancedStaticMesh|add_instance|AddInstance over Engine/Plugins/Experimental/Toolsets: no matches
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:392 add_component; object.py:81 set_properties
  • Engine/Source/Runtime/Engine/Classes/Components/InstancedStaticMeshComponent.h:167 PerInstanceSMData UPROPERTY(EditAnywhere)

Only foliage instances: add, get, remove; no generic ISM/HISM component instance ops found.

Evidence

Foliage instance add, query and remove only; no generic ISM or HISM component instance CRUD.

Evidence

convert_to_hism builds a HISM from actors; no add/remove/update of single instances.

Evidence
Actor motion telemetry

recorder reads PIE series only after host C++ LogVariable calls; sequencer.measure_motion covers tracks.

Evidence

read_actor_motion snapshots location, velocity, angular velocity, grounded; caller must loop to sample.

Evidence

Searched velocity, telemetry in toolsets; only PIE start/stop and transform reads exist.

Evidence
  • grep -i velocity|telemetry over Toolsets: only Niagara skill text
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:365 StartPIE

Searched Source and Skills for velocity, telemetry, trajectory; scenario runner has asserts, no sampling.

Evidence

PIE time series sampling of dotted member paths on an actor, with input provocations.

Evidence
Weather and time-of-day systems

Time of day via environment.control.set_time_of_day (sun rotation); searched weather, rain, snow: no ops.

Evidence

No weather or time of day system; only directional light rotation as sun angle via set_light_properties.

Evidence

No weather or time-of-day system; lighting skill documents sun pitch and sunset values only.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/skills/default_outdoor_lighting.py:76 sunset guidance
  • grep weather|time_of_day|TimeOfDay over Toolsets: no tools

Searched Source and Skills for TimeOfDay, SunPosition, weather; only a level template name found.

Evidence

Searched TimeOfDay, weather, SkyAtmosphere, VolumetricCloud in Source; no matches in level code.

Evidence
Level-wide placement defect sweep

level.audit sweeps all actors for bad scale, missing mesh, floating, underground, duplicates.

Evidence

No sweep action; reads MapCheck via editor get_message_log and pairwise test_component_overlap only.

Evidence

Searched for floating, overlap, or placement validation sweeps; none. Only find_actors overlap filter.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:66 find_actors

Searched for floating, overlap, interpenetration, placement validation of level actors; none found.

Evidence
  • searched Source and Content\Skills for floating|interpenetrat|overlap|defect: no level sweep

No level-wide sweep; validate_building checks procedural buildings, validate_interactive_reach checks interactables.

Evidence
Gameplay volume authoring (trigger, kill-Z, nav)

volume.create_trigger_volume, create_kill_z_volume, create_nav_mesh_bounds_volume and more.

Evidence

spawn_volume: trigger, blocking, pain, navmesh bounds, post process, audio, cull; killZ via set_world_settings.

Evidence

No volume tools; volume classes spawn via generic add_to_scene_from_class, no brush shaping.

Evidence
  • grep TriggerVolume|KillZ|NavMeshBounds|BlockingVolume over Toolsets: no matches (Brush only in PCGToolset.cpp for PCG volumes)
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:102 add_to_scene_from_class

create_volume: trigger, blocking, kill Z, pain, physics, nav mesh bounds, nav modifier and more.

Evidence

No volume ops; skill notes volumes spawn via Python spawn_actor_from_class or Epic SceneTools.

Evidence

spawn_volume covers trigger, blocking, kill, pain, nav_modifier; nav bounds via ai namespace.

Evidence
Data layers, level instances, packed actors

Level instances via wrapped Epic toolset, UE 5.8 only; data layers read only; no packed level actors.

Evidence

Level instances: create, edit, commit. No data layer or packed level actor tools.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:342 create_level_instance, :370 edit_level_instance, :388 commit_level_instance
  • grep DataLayer|PackedLevel over Toolsets: no matches

No data layer, level instance or packed actor ops; only engine subsystems via execute_python_code.

Evidence

create_prefab makes LevelInstance or PackedLevelActor (opens Save As dialog); no data layer support.

Evidence
Merge actors into a single mesh

performance.merge_actors merges 2+ static mesh actors into one mesh, optional source replace.

Evidence

epic_merge_actors via wrapped Epic toolset, UE 5.8 only; no native merge handler.

Evidence

merge_actors merges StaticMeshActors into one mesh asset, optional source deletion.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:312 merge_actors

No merge op; only via Python calling engine StaticMeshEditorSubsystem.MergeStaticMeshActors.

Evidence
  • Engine/Source/Editor/StaticMeshEditor/Public/StaticMeshEditorSubsystem.h:629
  • searched VibeUE for MergeActor|MeshMerge: no hits

generate_proxy_mesh merges actors into one simplified proxy mesh via IMeshMergeUtilities.

Evidence
Gameplay-space analysis (sightlines, chokepoints, pacing)

Searched wiki and ops for sightline, line of sight, chokepoint, pacing; only guide prose, no op.

Evidence

Searched sightline, chokepoint, line of sight, pacing; only raw line_trace and nav_project_point exist.

Evidence

Searched sightline, chokepoint, pacing, visibility analysis; none. Only single trace_world.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:295 trace_world (single ray only)

Searched sightline, chokepoint, line_of_sight, pacing in src and plugin; only unrelated hits.

Evidence

Map blockout gates check road connectivity and POI spacing on generated plans; no sightline analysis.

Evidence

analyze_sightlines, analyze_choke_points, analyze_level_pacing_structure, analyze_pacing_curve.

Evidence
Blockout volumes with asset replacement

Blocking volumes and geometry primitives exist; no op swaps blockout for final assets.

Evidence

convert_brushes_to_static_mesh turns BSP blockout into meshes; no replace blockout with chosen asset.

Evidence

PrimitiveTools add cube/sphere/cylinder/cone components; no blockout volume or asset replacement.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/primitive.py:22 add_cube, :54 add_sphere, :78 add_cylinder, :106 add_cone

Searched blockout, greybox; primitives and blocking volumes exist but no blockout to asset swap.

Evidence

MaterializePoisAsActors spawns placeholder blockout actors; swapping for final assets is manual.

Evidence

setup_blockout_volume, match_asset_to_blockout and atomic apply_replacement.

Evidence
Lighting and post-process authoringPlaces and tunes lights, sky, fog and post-process volumes.

Lighting rig authoring (lights, sky, fog) (Yes): lighting.spawn_light, spawn_sky_light, environment.spawn_sky_atmosphere, lighting.setup_volumetric_fog.

Post-process settings (Yes): post_process namespace (bloom, color grading, AA, Lumen, motion blur) plus post process volume ops.

Lighting rig authoring (lights, sky, fog) (Yes): spawn_light (point, spot, directional, rect, sky), set_light_properties, set_fog_properties; sky atmosphere via place_actor.

Post-process settings (Yes): get/set_post_process_settings, add_post_process_blendable, set_fixed_exposure.

Lighting rig authoring (lights, sky, fog) (Partial): DefaultOutdoorLightingSkill gives sun/sky/fog/cloud rules; actors made with generic spawn and set_properties.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/skills/default_outdoor_lighting.py:255 DefaultOutdoorLightingSkill

Post-process settings (Partial): No post-process tool; spawn PostProcessVolume and raw set_properties; lighting skill gives guidance.

  • grep PostProcess|post_process over Toolsets code: no tools
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/skills/default_outdoor_lighting.py:44 Post Process Volume section

Lighting rig authoring (lights, sky, fog) (Yes): create_light, create_sky_light, configure_atmosphere (sky, sun, height fog, clouds), shadows.

Post-process settings (Yes): configure_post_process covers bloom, exposure, DOF, tonemapper, AO, etc; post process volume.

Lighting rig authoring (lights, sky, fog) (Partial): No light, sky or fog ops; viewport skill documents sun, SkyLight, SkyAtmosphere setup via Python.

Post-process settings (Partial): ViewportService sets editor viewport exposure only; PostProcessVolume edits documented as Python.

Lighting rig authoring (lights, sky, fog) (Partial): place_light and set_light_properties for point/spot/rect/directional; no sky light, atmosphere or fog.

Post-process settings (Partial): spawn_volume post_process sets unbound, blend and priority only; no PostProcessSettings fields.

World Partition tools (unloaded actor query, rename)Queries actors in unloaded cells and renames World Partition maps safely.

World Partition unloaded actor query (Partial): No query op; map asset.dump lists unloaded external actors from actor descs as references.

World Partition rename (Partial): level.rename is a plain UEditorAssetLibrary::RenameAsset on the map; no World Partition specific handling.

World Partition unloaded actor query (Yes): list_actor_descs and load_actor_descs read on disk descriptors incl unloaded cells; UE 5.5 or newer.

World Partition rename (Yes): rename detects WP maps and moves __ExternalActors__/__ExternalObjects__ with the .umap.

World Partition unloaded actor query (No): Searched WorldPartition, DataLayer, unloaded in toolsets; queries use loaded level actors only.

  • grep WorldPartition|world_partition|unloaded over Toolsets: no matches
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:66 find_actors

World Partition rename (No): Searched WorldPartition, world_partition in Toolsets, ToolsetRegistry, MCP source; only binary pdb hits.

  • grep WorldPartition|world_partition over Engine/Plugins/Experimental/Toolsets: only .pdb/.dll matches

World Partition unloaded actor query (No): Searched ActorDesc, unloaded, WorldPartition; only load_cells and data layer ops, no actor desc query.

World Partition rename (Partial): rename_level copies map plus __ExternalActors__/__ExternalObjects__ folders as files; no reference rewrite.

World Partition unloaded actor query (Partial): No own op; only via Python calling engine WorldPartitionBlueprintLibrary.GetActorDescs.

  • Engine/Source/Runtime/Engine/Public/WorldPartition/WorldPartitionBlueprintLibrary.h:144 GetActorDescs
  • searched VibeUE for ActorDesc: no hits

World Partition rename (No): Searched WorldPartition in Source and Skills; only landscape grid and WP save notes, no rename op.

World Partition unloaded actor query (No): Searched WorldPartition, ActorDesc, external actors; WP only touched for HLOD layer and index teardown.

World Partition rename (No): Searched WorldPartition, rename_actor, set_actor_label actions; WP only appears in level indexer and HLOD include.

Actor properties, tags, folders and attachmentSets any actor property by path and manages tags, folders and attachment.

Set UPROPERTY (dotted path) (Yes): property.set resolves dotted struct, subobject and array index paths on any UObject.

Actor tags / folders / attach (Yes): actor.add_tag, remove_tag, find_by_tag, set_folder, attach, detach.

Set UPROPERTY (dotted path) (Yes): set_actor_property takes dotted paths like Foo.Bar and fixed array indices; WorldSettings as target.

Actor tags / folders / attach (Yes): add/remove/set/list actor tags, bulk set_actor_folder_path, attach/detach actor and component.

Set UPROPERTY (dotted path) (Yes): set_properties takes a JSON object (nested JSON for structs), not a dotted path; reset_properties too.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties, :98 reset_properties
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetLibrary.h UToolsetLibrary::SetObjectProperties

Actor tags / folders / attach (Yes): add/remove/has/get tags, folder get/set/rename/delete, set_parent_component attaches across actors.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:73 add_tag, :90 remove_tag, :257 set_parent_component
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:214 set_actor_folder, :229 rename_folder, :263 delete_folder

Set UPROPERTY (dotted path) (Partial): Own set_property was removed; property writes via Epic toolset (ObjectTools set_properties) or Python.

Actor tags / folders / attach (Partial): Tags and reparent via Epic toolset ActorTools; folders, attach, tags as Python recipes.

Set UPROPERTY (dotted path) (Partial): Actor setter covers fixed fields only; dotted path setter targets CDOs and assets, not placed actors.

Actor tags / folders / attach (Partial): Tags and outliner folders supported; no attach action (searched AttachToActor, AttachToComponent).

Level cost and lighting coverage analysisEstimates per-region rendering cost and finds under- or over-lit areas.

Per-region performance cost analysis (No): Searched per region cost ops; performance.run_benchmark measures current view frame time only.

Lighting coverage analysis and suggestions (No): Searched lighting coverage, dark areas, underlit, luminance; captures report frame luminance only.

Per-region performance cost analysis (No): No spatial cost breakdown; frame timing and mesh usage are whole world or current view; searched region, heatmap.

Lighting coverage analysis and suggestions (No): Searched light coverage, underlit, dark spot, luminance analysis; none found, only light CRUD.

Per-region performance cost analysis (No): Searched perf, stat, draw call, cost tools in toolsets; none. Only SearchCVars.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:207 SearchCVars

Lighting coverage analysis and suggestions (No): No coverage analysis; lighting skill gives static lux and exposure rules, not scene analysis.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/skills/default_outdoor_lighting.py (guidance text only)

Per-region performance cost analysis (No): Only global scene/perf stats and profiling; searched region, radius, per area; no per region cost.

Lighting coverage analysis and suggestions (No): Searched lighting coverage, analyze_lighting, illuminance; only light creation and config ops.

Per-region performance cost analysis (No): Perf trace regions are time spans, not spatial areas; no per-area cost breakdown found.

Lighting coverage analysis and suggestions (No): Searched for lighting coverage, dark spot, illuminance analysis; none found.

  • searched Source, Content, docs for lighting coverage|dark spot|illuminance|lux: no hits

Per-region performance cost analysis (Yes): get_region_performance estimates triangles, draw calls, lights, shadow casters per region.

Lighting coverage analysis and suggestions (Yes): get_light_coverage, find_dark_corners and mood based suggest_light_placement.

Spatial queries and verification

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Attachment/socket-aware inspection

actor.describe reports per component attachParent, attachSocket and relativeTransform.

Evidence

nudge dryRun reports attach parent, socket, absolute flags, bounds; get_component_tree also.

Evidence

get_parent_component and get_components report hierarchy; attach socket name not exposed.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:226 get_parent_component
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:257 set_parent_component (no socket arg)

inspect.get_component_details returns relative and world transform, attachParent and attachSocket.

Evidence

No own attach/socket query; Epic get_parent_component has no socket; GetAllProperties raw dump.

Evidence

get_actor_info omits attach parent; BP component tree lists attach socket, PIE anim query gives socket transforms.

Evidence
Relative transform between actors

measure_distance gives center/pivot distance, edge gap and per axis gap; no relative rotation or transform.

Evidence

level(get_relative_transform) actor vs actor by path or label; returns rotator only, no quaternion.

Evidence

No dedicated tool; computable by composing get_actor_transform calls in execute_tool_script.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:106 get_actor_transform
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script

Searched actor to actor relative transform, GetRelativeTransform, relativeTo; only component to parent.

Evidence
  • grep GetRelativeTransform|relativeTo in ControlActor and Inspection domains: only InspectComponent
  • docs/action-reference.generated.md control_actor list has no relative query

Searched GetRelativeTransform and relative transform in VibeUE and Epic actor/scene toolsets.

Evidence
  • grep GetRelativeTransform|relative transform over Source: no hits
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:106 get_actor_transform (single actor only)

get_spatial_relationships gives labels (on_top_of, left_of) and distance; measure_distance; no relative transform.

Evidence
Aim actor at target

Searched look at/aim verbs and FindLookAtRotation; only render camera code uses it, no actor aim verb.

Evidence

actor.look_at rotates an actor to face a world-space point.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:156 look_at

Searched lookAt, aim, FindLookAtRotation, face target in TS and C++; none found.

Evidence
  • grep FindLookAtRotation|LookAt over plugins/McpAutomationBridge: no matches
  • grep look_at|aim_at in src/tools/catalog: no action names

Via Epic toolset: ActorTools.look_at; VibeUE skill gives an atan2 Python recipe only.

Evidence

Searched look_at, aim, orient, FindLookAtRotation actions; look-at math only used internally for cameras and decals.

Evidence
Viewport pixel hit-test

spatial.raycast_screen deprojects a capture pixel to a world ray and first blocking hit.

Evidence

editor(hit_test_viewport_pixel) ray from live viewport projection; not for headless captures.

Evidence

ScreenCoordsToWorld traces normalized coords and returns hit location only, no actor or component.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:308 ScreenCoordsToWorld
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:450

Searched Deproject, HitProxy, screen to world, pixel pick, line_trace action; none found.

Evidence
  • grep DeprojectScreenToWorld|HitProxy over plugins/McpAutomationBridge: no matches
  • grep screen_to_world|pick_actor|line_trace in src/tools/catalog: none

Via Epic toolset: EditorAppToolset.ScreenCoordsToWorld; no Deproject or hit proxy in VibeUE.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:309 ScreenCoordsToWorld
  • grep Deproject|HitProxy over VibeUE Source: no hits

Searched Deproject, ProjectWorldToScreen, HitProxy across Source; no pixel to world hit test.

Evidence
  • rg Deproject|ProjectWorldToScreen|HitProxy in Source: no matches
Temporary verification actors (never saved)

No transient actor spawn verb; effect.draw_debug_shape draws unsaved in-world markers, cleared by a verb.

Evidence

spawn/list/destroy_transient_actor: RF_Transient, tagged, destroy refuses real actors.

Evidence

Searched for transient/non-savable spawn options; spawn tools create normal level actors.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:501 _add_actor

Searched spawn handlers for transient or non-savable flags; RF_Transient only used for packages and merges.

Evidence
  • grep RF_Transient in plugins: LevelStructure, ActorMerge, DirtyPackages, AssetSave only
  • grep bIsEditorOnlyActor: no matches

PIEActorService spawns RF_Transient actors into PIE worlds only, tracked by handle; none in editor world.

Evidence

highlight_room spawns a normal StaticMeshActor in the level; searched RF_Transient and editor-only flags on actors.

Evidence
Component overlap / penetration test

measure_overlap gives actor AABB penetration and separating axis, not per component geometry.

Evidence

level(test_component_overlap) OBB or AABB bounds with penetration depth; bounds only, not mesh geometry.

Evidence

find_actors bounds plus collision_channels runs an AABB box overlap; no component penetration test.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:66 find_actors
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:575 _actors_in_bounds box_overlap_actors

Placement check reports actor AABB overlaps with penetration depth; not per component or collision shape.

Evidence

No overlap op; skill documents sweep and line_trace_single Python recipes for collision checks.

Evidence
  • Content/Skills/level-actors/SKILL.md:376 Sweep Moves and Collision Checks
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:597 box_overlap_actors in actor query

query_overlap tests a box/sphere/capsule at a point; prop placement push-out; no component penetration test.

Evidence
Exact actor paths (duplicate labels refused)

Duplicate labels refused with AMBIGUOUS_ACTOR_NAME listing candidates; objectPath/actorPath accepted.

Evidence

Shared MCPResolveActor: actorPath wins; ambiguous label refused listing candidate paths.

Evidence

Actor arguments resolve by full object path (refPath); labels are never used as identifiers.

Evidence
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/ReferenceConverter.cpp:236-311 refPath resolution

Own lookup takes first label match then substring match; Epic toolset takes actor object refs.

Evidence

Ambiguous labels refused with match list; internal FName accepted, but full object paths are not resolved.

Evidence
Footprint ground-contact verification

verify_grounding samples footprint columns, reports coverage, contact points and max gap.

Evidence

snap_actor_to_floor is one center line trace from bounds top, no footprint check; corners need bulk_line_trace.

Evidence

snap_to_ground uses one downward trace from bounds center; no footprint contact verification.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:628 _snap_to_ground

One center line trace flags sunk, floating, unsupported with suggestedZ; not a footprint test.

Evidence

BatchLineTraceGrid gives downward trace grid over a region; no actor footprint check op.

Evidence

sample_terrain_grid and analyze_building_site cover building footprints; actor snaps use one trace.

Evidence
Frame-aware transforms (world/actor/parent)Applies moves and rotations in a chosen reference frame without Euler drift.

Frame-aware transforms (world/actor/parent) (Partial): set_transform is world only; nudge takes world or camera basis; ISM instances take world/local space.

Viewpoint-aware rotation (clockwise from X) (No): Searched rotation params; only world pitch/yaw/roll. deltaCamera covers translation, not rotation.

Quaternion deltas (no Euler drift) (No): nudge adds FRotator deltas (Euler addition); no quaternion delta param found in actor or spatial verbs.

Frame-aware transforms (world/actor/parent) (Yes): level(nudge_component) frame=world|actor|parent|component on any SceneComponent incl. root; move_actor is world only.

Viewpoint-aware rotation (clockwise from X) (Yes): viewRotation {viewFrom front..below, clockwise|counterclockwise}; sign resolved natively, tested.

Quaternion deltas (no Euler drift) (Yes): nudge_component composes FQuat axis deltas; restore takes quaternion. Components only, not actors.

Frame-aware transforms (world/actor/parent) (Partial): set_actor_transform takes worldspace or parent-relative; no actor-local frame option.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:122 set_actor_transform(worldspace)
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:102 add_to_scene_from_class(parent) parent-local xform

Viewpoint-aware rotation (clockwise from X) (No): Searched actor/scene tools and skills; rotation is absolute FRotator only, no viewpoint convention.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/TransformConverter.h:23 TOptional<FRotator> Rotation

Quaternion deltas (no Euler drift) (No): Transforms serialize rotation as FRotator Euler; no delta or quaternion tool found (grep quat).

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/TransformConverter.cpp:100 Rotation = GetRotation().Rotator()

Frame-aware transforms (world/actor/parent) (Partial): set_transform writes world transform only; component relative transform only via raw property set or SCS edits.

Viewpoint-aware rotation (clockwise from X) (No): Searched for viewpoint or camera relative rotation params; rotation is absolute pitch/yaw/roll only.

Quaternion deltas (no Euler drift) (No): Searched delta/quaternion transform params and AddActor*Rotation; set_transform takes absolute Euler only.

Frame-aware transforms (world/actor/parent) (Partial): Own SetAbsoluteTransform toggles world vs parent channels; Epic set_actor_transform worldspace flag.

Viewpoint-aware rotation (clockwise from X) (No): Searched clockwise, viewpoint, yaw helpers; skill only documents Rotator arg order and atan2 yaw.

Quaternion deltas (no Euler drift) (Partial): No own quaternion op; skill documents add_actor_local_rotation delta via execute_python_code only.

Frame-aware transforms (world/actor/parent) (Partial): move_actor sets world transform or adds a world-space offset (relative=true); no actor or parent frame option.

Viewpoint-aware rotation (clockwise from X) (No): Rotations are raw [pitch,yaw,roll]; searched look_at, viewpoint, clockwise conventions in Source and Skills.

Quaternion deltas (no Euler drift) (No): Relative rotation adds FRotator Euler values (GetActorRotation()+Rotation); no quaternion delta API found.

Spatial edit preview and rollbackPreviews transform edits and reports before/after values with rollback.

Spatial dry-run preview (Partial): ground_instances apply:false returns proposed transforms; set_transform and place_relative have no dry run.

Before/after transforms + rollback on edits (Partial): ground verbs echo previousTransform with revertOnFailure; snapshot verbs exist; set_transform echoes no before.

Spatial dry-run preview (Yes): nudge_component dryRun returns requested world transform and quaternion, operationApplied=false; nudge only.

Before/after transforms + rollback on edits (Yes): nudge_component returns before/after and rollback to restore action; move_actor returns rollback.

Spatial dry-run preview (No): Searched for dry_run/preview in toolsets; transform and spawn tools apply immediately.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:122 set_actor_transform

Before/after transforms + rollback on edits (Partial): execute_tool_script undoes the transaction on failure; no before/after transform report.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:764 _TransactionScope
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetLibrary.h:129 UndoTransaction

Spatial dry-run preview (No): options.preview is refused for every capability; set_transform record says no dry run path exists.

Before/after transforms + rollback on edits (Partial): set_transform returns after readback, TRANSFORM_MISMATCH, editor transaction; no before values; snapshot restore.

Spatial dry-run preview (No): Searched DryRun, dry_run, preview on actor edits; CalculateActorView only precomputes camera framing.

Before/after transforms + rollback on edits (Partial): TransactionService gives begin, cancel, undo; no before/after transform report on edits.

Spatial dry-run preview (No): Searched dry_run/preview; only renames, material or mesh swaps and data fills preview; no transform preview.

Before/after transforms + rollback on edits (Partial): move_actor returns new_transform only and wraps edit in an editor undo transaction; no before state or rollback.

Placement helpers (free-spot search, relational)Finds free space and places actors relative to others.

Collision-aware free-spot search (Yes): find_clear_placement sweeps XY and yaw with physics box overlap, ranks clear poses, names blockers.

Relational placement (on top of, against) (Yes): place_relative supports on_top_of, below, left_of, right_of, in_front_of, behind, against_wall.

Collision-aware free-spot search (No): Searched FindTeleportSpot, EncroachingBlocking, free spot, Sweep*, Overlap* queries in plugin and src; none.

  • searched plugin/ and src/ for FindTeleportSpot|EncroachingBlocking|free.?spot|SweepSingle|SweepMulti|OverlapMulti|OverlapBlockingTest

Relational placement (on top of, against) (Partial): spawn_actors_batch fromComponents places at a fraction of a component's local bounds; no against or contact.

Collision-aware free-spot search (No): Searched for free spot or placement search; only trace_world and bounds overlap queries exist.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:295 trace_world

Relational placement (on top of, against) (Partial): Only snap_to_ground on spawn and parent-relative placement; no on-top-of or against operations.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:102 add_to_scene_from_class(snap_to_ground)

Collision-aware free-spot search (No): Searched free spot, sweep, FindTeleportSpot, empty space search; none found.

  • grep SweepSingle|SweepMulti|FindTeleportSpot over plugins: no matches (Sweep only in geometry modeling)

Relational placement (on top of, against) (No): No on top of or against placement op; only suggestedZ hint and foliage snapToSurface.

Collision-aware free-spot search (Partial): PIE spawn accepts AdjustIfPossible collision handling; PIE only, no editor free-spot search.

Relational placement (on top of, against) (Partial): Via Epic toolset: add_to_scene snap_to_ground drops onto surface below; no against or on top op.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:104 snap_to_ground
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:628 _snap_to_ground

Collision-aware free-spot search (Partial): Scatter actions take collision_mode reject or adjust (push-out); no standalone free-spot search action.

Relational placement (on top of, against) (Partial): scatter_on_surface places new props on a named actor; snap_to_surface traces any direction; no move X against Y.

Captures with camera metadata + fixed settingsReproducible captures with camera data, including top-down map tiles.

Captures with camera metadata + fixed settings (Yes): capture_open_level returns measured camera pose; pins exposure, view mode, size, FOV, sprite hiding.

Georeferenced ortho map tiles and markup (Yes): capture_ortho_tiles writes georeferenced tiles plus manifest; image.annotate and image.tile read it.

Captures with camera metadata + fixed settings (Yes): capture_scene_png fixed size, FOV, texture streaming; captureMetadata has camera basis, FOV, world, time.

Georeferenced ortho map tiles and markup (No): No ortho map tile capture or markup; capture is perspective only; viewport orthoZoom only; geo math for landscape.

Captures with camera metadata + fixed settings (Partial): CaptureViewport returns camera pose and FOV, optional pose, hides gizmos; size follows the viewport.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:245 CaptureViewport
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:1097 uses Viewport->GetSizeXY()

Georeferenced ortho map tiles and markup (No): Searched toolsets for georef, ortho and map tile tools; none found.

  • Engine/Plugins/Experimental/Toolsets (grep georef/orthographic/tile)

Captures with camera metadata + fixed settings (Partial): Viewport screenshot returns camera location and rotation plus resolution; no FOV or fixed exposure settings.

Georeferenced ortho map tiles and markup (No): Searched georeference, geo, ortho tile, map markup; only orthoZoom in viewport info.

Captures with camera metadata + fixed settings (Partial): CaptureScene fixes camera, FOV, ortho, manual EV100; result returns no camera metadata.

Georeferenced ortho map tiles and markup (Partial): get_map_image fetches lat/lng satellite tiles via vibeue.com API key; MapBlockout PNGs draw roads and key.

Captures with camera metadata + fixed settings (Partial): capture_scene_preview takes fixed camera and resolution but is asset preview only; output lacks camera data.

Georeferenced ortho map tiles and markup (Partial): capture_floor_plan and capture_building_views do ortho PNGs with world bounds per building; no tiles or markup.

Gameplay systems

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Collision / physics

actor.set_collision, static_mesh.set_collision_complexity, geometry collision gen, physics.* ragdoll ops.

Evidence

set_collision, set_collision_profile, set_simulate_physics, set_physics_properties, add_impulse.

Evidence

Physics asset toolset, static mesh convex collision gen/remove, world line trace, channel overlap search.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PhysicsToolsets/Source/PhysicsToolsets/Private/PhysicsToolsets/PhysicsAssetToolset.h:158 CreateFromMesh
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:266 generate_convex_collisions
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:66 find_actors collision_channels, :295 trace_world

control_actor.set_actor_collision, setup_physics_simulation, geometry collision generation actions.

Evidence

set_collision_settings sets profile, enabled state, object type and channel responses on BP components.

Evidence

mesh.set_collision_preset, set_mesh_collision, generate_collision, configure_physics_props, query_raycast.

Evidence
Navigation (rebuild/query)

navigation.rebuild_navigation and nav settings exist; no path, projection or reachability query op.

Evidence

rebuild_navigation, find_nav_path, project_to_nav, list_nav_invokers, spawn_nav_modifier, navmesh info.

Evidence

Searched Toolsets for navmesh, NavigationSystem, pathfind; only content browser navigation hits; no console exec tool.

Evidence
  • grep -iE 'navmesh|NavigationSystem|navigation|pathfind' over Engine/Plugins/Experimental/Toolsets: only unrelated hits

Rebuild navigation and navmesh info exist; searched FindPath, ProjectPoint, pathfind: no query action.

Evidence

No nav service; searched NavMesh/RebuildNav/FindPath. Only via execute_python_code on NavigationSystemV1.

Evidence

ai.rebuild_navigation, find_path, test_path, project_point_to_navigation, navmesh config actions.

Evidence
Behavior Tree full read and authoring

behavior_tree.create/add_node/connect/attach_decorator/service plus decompile to BTIR text.

Evidence

AIModuleToolset reads BT nodes, children, decorators, subtrees; no node create or wiring tools.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AIModuleToolset/Content/Python/aimodule_toolset/toolsets/behavior_tree.py:73 list_nodes
  • behavior_tree.py:119 get_children, :136 get_subtree

BehaviorTreeService: GetTree JSON, AddNode/Decorator/Service, BuildTree, Validate, Repair.

Evidence

ai BT actions: get_behavior_tree, get_bt_graph, add_bt_node, decorators/services, build_behavior_tree_from_spec.

Evidence
Blackboard CRUD

Create, add key, set default, set synced, read via decompile; no remove or rename key op.

Evidence

create_blackboard, add/remove_blackboard_key, read_blackboard, set_blackboard_parent.

Evidence

Only get_blackboard from a BT; keys editable only via generic data_asset.create and object set_properties.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AIModuleToolset/Content/Python/aimodule_toolset/toolsets/behavior_tree.py:49 get_blackboard
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

BlackboardService: create, add/remove/rename keys, key references, parent, instance sync.

Evidence

create/get/list/delete/duplicate blackboard, add/remove/rename bb keys, set_bb_parent.

Evidence
EQS

eqs.create, add_generator, add_test, set_context_class, set_test_filter, set_test_scoring.

Evidence

create/read EQS query, add generator/test, remove, reorder, list types, run_eqs_query live.

Evidence

Searched Toolsets for EnvQuery and EQS; none. EnvQuery Options is a non editable UPROPERTY built by graph.

Evidence
  • grep -iE 'EnvQuery|EQS' over Engine/Plugins/Experimental/Toolsets: no hits
  • Engine/Source/Runtime/AIModule/Classes/EnvironmentQuery/EnvQuery.h:35 UPROPERTY() Options

EnvQueryService: create, options/tests CRUD, BuildQuery from JSON, validate, RunQuery against an actor.

Evidence

EQS query CRUD, generators, tests, scoring, spec build, plus runtime_run_eqs_query.

Evidence
StateTree

ai.create_state_tree, add state/transition, state_tree.add_task/condition/evaluator/bind_property.

Evidence

statetree category: states, tasks, conditions, transitions, bindings, evaluators, compile, validate.

Evidence

StateTreeToolset is read only: states, tasks, conditions, transitions, evaluators; no authoring.

Evidence
  • Engine/Plugins/Experimental/Toolsets/StateTreeToolset/Content/Python/state_tree_toolset/toolsets/state_tree.py:32 get_root_states
  • state_tree.py:93 get_transitions

StateTreeService ~98 methods: states, tasks, conditions, transitions, bindings, compile.

Evidence

StateTree create, states, tasks, transitions, bindings, compile, spec build; needs WITH_STATETREE.

Evidence
GAS (abilities / effects)

28 gas.* ops: abilities, effects, modifiers, cues, attribute sets, exec calcs, costs, cooldowns.

Evidence

gas category: ASC, attribute sets, abilities, effects, cues, live grant/apply/remove.

Evidence

GASToolsets inspect granted abilities, effects, attributes and author cues; no ability or effect authoring.

Evidence
  • Engine/Plugins/Experimental/Toolsets/GASToolsets/Source/GASToolsets/Private/AbilitySystemInspectorToolset.h:121 GetGrantedAbilities
  • AbilitySystemInspectorToolset.h:112 GetActiveEffects
  • GameplayCueToolset.h:115 CreateCueNotifyAsset

No GAS service; gas skill routes to Epic GASToolsets and BlueprintTools. via Epic toolset.

Evidence

gas namespace ~135 actions: abilities, effects, attribute sets, ASC, cues; needs GameplayAbilities plugin.

Evidence
Networking / replication

23 networking.* ops: replicated vars, RepNotify, conditions, RPCs, relevance, dormancy, prediction.

Evidence

networking category: replicates, property replication, dormancy, relevancy, frequency, priority.

Evidence

Only Blueprint variable replication get/set (None, Replicated, RepNotify).

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:1290 get_variable_replication, :1309 set_variable_replication

PIE net mode settings, server/client world selectors, read var replication; no replication authoring op.

Evidence

network namespace lists replicated classes, RPCs, OnReps; blueprint.add_replicated_variable.

Evidence
GameMode and PlayerController authoring

game_framework.* configures GameMode rules, teams, rounds, spawn, spectating; class props via property.set.

Evidence

create_game_mode/game_state/player_controller/player_state/hud, set_world_game_mode.

Evidence

Generic Blueprint create with any parent class plus set_properties; no GameMode specific tools.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:177 create
  • object.py:81 set_properties

No GameMode ops (searched GameMode); BP create via Epic toolset, default mode via SetIniValue.

Evidence

author_map_settings sets map GameMode override and PlayerStarts; class defaults only via set_cdo_property.

Evidence
Enhanced Input asset CRUD

input.create_input_action, create_input_mapping_context, add_mapping, remove_mapping, get_input_info.

Evidence

create InputAction and IMC, add/remove/rebind mappings, modifiers, triggers, read back.

Evidence

No Enhanced Input tools; InputAction and mapping context only via generic data_asset.create and set_properties.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/data_asset.py:16 create
  • object.py:81 set_properties
  • grep InputAction|EnhancedInput in Toolsets source: only test files

InputService: create actions and mapping contexts, key mappings, modifiers, triggers.

Evidence

IA/IMC read plus modifier/trigger edits; create only via scaffold_locomotion_input; no delete or add key map.

Evidence
Chooser tables

chooser.create, add_column, add_row, set_cell, set_result, compile; needs Chooser plugin.

Evidence

chooser category: create, describe, add_column, add/set/delete rows, remap object references.

Evidence

Searched Toolsets for Chooser and ChooserTable; none. ChooserTable is not a DataAsset, so no generic create.

Evidence
  • grep -i 'chooser' over Engine/Plugins/Experimental/Toolsets: no hits

Searched plugin and server source for Chooser; 0 hits.

Evidence
  • grep -ri chooser plugins/ src/: no matches

Searched Chooser across Source, skills, docs and Epic Toolsets; no matches.

Evidence

chooser namespace: create table, columns, rows, cells, validate, inspect.

Evidence
Mass Entity / ZoneGraph

Mass entity config create/configure only; ai.add_mass_spawner is a stub; no ZoneGraph ops.

Evidence

Mass entity config create, read, trait reorder/remove, validate; ZoneGraph is query only, no authoring.

Evidence

No Mass or ZoneGraph tools; MassEntityConfigAsset is a DataAsset, so generic create plus set_properties only.

Evidence
  • grep -iE 'MassEntity|ZoneGraph' over Engine/Plugins/Experimental/Toolsets: no hits
  • Engine/Plugins/Runtime/MassGameplay/Source/MassSpawner/Public/MassEntityConfigAsset.h:96 Traits EditAnywhere Instanced
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/data_asset.py:16 create

Mass entity config and spawner actions exist; ZoneGraph not found.

Evidence

Searched MassEntity, Mass, ZoneGraph in VibeUE and Epic Toolsets; no matches.

Evidence
  • rg -i MassEntity|ZoneGraph VibeUE: 0 files

Mass entity config CRUD, traits, processors, stats; ZoneGraph list and lane queries (read only).

Evidence
Live Behavior Tree execution path

ai.get_runtime_state returns active BT node, root first node path and task status in PIE.

Evidence

BT tools read assets only; searched for BehaviorTreeComponent or active node queries, none.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AIModuleToolset/Content/Python/aimodule_toolset/toolsets/behavior_tree.py

Only run/stop BT; searched GetActiveNode, BrainComponent, BehaviorTreeComponent: 0 hits.

Evidence

Searched BrainComponent, GetActiveNode, BTDebugger; BT service is asset only, refuses edits in PIE.

Evidence

ai.runtime_get_bt_execution_path: active branch, current task, decorator states in PIE.

Evidence
Live input action value

editor.simulate_input injects raw key events into PIE; no input action value read or injection.

Evidence

get_action_value reads live value, triggerEvent and mapped keys per PIE player.

Evidence

Searched Toolsets for InputAction, EnhancedInput, action value; no tools found.

Evidence
  • grep -iE 'InputAction|EnhancedInput' over Engine/Plugins/Experimental/Toolsets: only test files

simulate_input injects an action value into PIE; no readback of current action value.

Evidence

InjectAction pushes a typed value into PIE for one tick; no readback of current action value.

Evidence

editor.pie_inject_input_action injects values; no action to read a live action value.

Evidence
Enhanced Input validation audit

Searched input.* and Source for IMC or action validation audit; only get_input_info asset readback.

Evidence

validate_input audits unmapped actions, bad keys, duplicates, null triggers, missing swizzle.

Evidence

No Enhanced Input tools of any kind in Toolsets.

Evidence
  • grep -iE 'InputMappingContext|EnhancedInput' over Engine/Plugins/Experimental/Toolsets: only test files

Searched validate/audit/unused/orphan in InputService and enhanced-input skill; only existence checks.

Evidence

input.validate_input_mappings reports missing actions, invalid keys, duplicate key warnings.

Evidence
GAS cue coverage / attribute audit

Searched gas.* and Source for cue coverage or attribute audit; none found.

Evidence

validate_cue_coverage and audit_attributes (clamping, replication, OnRep, Max pairs).

Evidence

FindCueTagsWithoutNotifies audits cue coverage; FindAttributeSetClasses and ListAttributes list attributes.

Evidence
  • Engine/Plugins/Experimental/Toolsets/GASToolsets/Source/GASToolsets/Private/GameplayCueToolset.h:145 FindCueTagsWithoutNotifies
  • AttributeSetToolset.h:61 FindAttributeSetClasses, :70 ListAttributes

Searched GAS domain for cue coverage or attribute audit; only cue authoring actions.

Evidence

Epic GameplayCueToolset FindCueTagsWithoutNotifies; nothing in VibeUE. via Epic toolset.

Evidence

gas.validate_cue_coverage finds unhandled and orphan cues; validate_attribute_set audits sets.

Evidence
SaveGame slot inspection

Searched USaveGame, LoadGameFromSlot, DoesSaveGameExist in Source; none, only CPF_SaveGame flag handling.

Evidence

reflection inspect_save_game loads a slot read only and returns SaveGame properties.

Evidence

Searched Toolsets for SaveGame and save slot; no tools found.

Evidence
  • grep -i 'SaveGame' over Engine/Plugins/Experimental/Toolsets: no hits

Searched USaveGame, SaveGame, LoadGameFromSlot, DoesSaveGameExist: 0 hits.

Evidence
  • grep -ri SaveGame plugins/ src/: no matches

Searched SaveGame; no op. Only via execute_python_code on GameplayStatics load_game_from_slot.

Evidence

Only C++ SaveGame scaffolding (ui.scaffold_save_game); slot reads only via run_python.

Evidence
Collision profile resolution

set_view_mode collision report gives per actor channel response; BodyInstance readable; no profile resolver.

Evidence

resolve_collision_profile gives per channel responses; get_component_collision per component.

Evidence

get_collision_channels lists object channels only; searched CollisionProfile, no profile lookup found.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:56 get_collision_channels
  • grep CollisionProfile in Toolsets: no hits

Profile can be set, not resolved to channel responses; reads only via execute_python_code.

Evidence

No profile resolver; set_collision_preset only checks name exists; raw ini via config.resolve_setting.

Evidence
Player-mappable input settings

Searched PlayerMappable, UEnhancedInputUserSettings, MappableKey in Source and wiki; none.

Evidence

set_player_mappable_settings authors PlayerMappableKeySettings on InputAction; no runtime user remap.

Evidence

No mappable key tools; InputAction PlayerMappableKeySettings editable only via generic set_properties.

Evidence
  • Engine/Plugins/EnhancedInput/Source/EnhancedInput/Public/InputAction.h:152 PlayerMappableKeySettings EditAnywhere Instanced
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

Searched EnhancedInputUserSettings and PlayerMappable: 0 hits.

Evidence
  • grep -r EnhancedInputUserSettings|PlayerMappable plugins/ src/: no matches

Searched PlayerMappable, Mappable, EnhancedInputUserSettings; ConfigureAction lacks mappable settings.

Evidence

get_input_action reports player mappable flags; ui.scaffold_input_remapping emits setup guidance only.

Evidence
Physics asset bodies and constraints authoring

skeleton.create_physics_asset, configure_physics_body, add_physics_constraint, configure_constraint_limits.

Evidence

Own read only (get_physics_asset_info); bodies/shapes/constraints via wrapped Epic toolset, UE 5.8 only.

Evidence

PhysicsAssetToolset creates asset, adds bodies, sets sphere/capsule/box, mass, constraints and limits.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PhysicsToolsets/Source/PhysicsToolsets/Private/PhysicsToolsets/PhysicsAssetToolset.h:249 AddBody, :206 SetCapsule, :320 AddConstraint, :329 SetConstraintLimits

edit_physics_asset: create asset, add/configure bodies, add constraints, set limits.

Evidence

SkeletonService only reports physics asset path; bodies and constraints via Epic PhysicsToolsets.

Evidence

Read physics asset, edit existing body and constraint props; no add/remove bodies or constraints.

Evidence
Gameplay tag add/rename/remove with referencersAlso possible from the shell: tags are +GameplayTagList lines in Config/DefaultGameplayTags.ini or Config/Tags/*.ini and renames are +GameplayTagRedirects entries, all plain INI text. The tools add finding and updating referencing .uasset content and tags defined in DataTable assets.

gameplay_tags.add and remove on INI sources; no rename and no referencer check.

Evidence

Own create_gameplay_tag; rename, remove, find referencers via wrapped Epic toolset, UE 5.8 only.

Evidence

GameplayTagsToolset AddTag, RemoveTag, RenameTag (updates references), FindReferencersByTag.

Evidence
  • Engine/Plugins/Experimental/Toolsets/GameplayTagsToolset/Source/GameplayTagsToolset/Private/GameplayTagsToolset/GameplayTagsToolset.h:64 AddTag, :72 RemoveTag, :81 RenameTag, :89 FindReferencersByTag

add_tag_to_asset needs pre-registered tags; no tag registry add, rename or remove.

Evidence

VibeUE has bulk add_tags only; add/remove/rename and FindReferencersByTag via Epic toolset.

Evidence

gas add_gameplay_tags, rename_tag across assets (dry_run), remove_gameplay_tags with reference check.

Evidence
Gameplay tag query builder

gameplay_tags.build_query builds FGameplayTagQuery from JSON tree and can write it to an asset.

Evidence

Searched TagQuery, tag_query in src, plugin, docs, skills; only internal StateTree use; epic query is WorldCondition.

Evidence

Searched for TagQuery; WorldConditions toolset only describes world condition queries.

Evidence
  • grep -iE 'TagQuery|tag_query' over Engine/Plugins/Experimental/Toolsets: no hits
  • Engine/Plugins/Experimental/Toolsets/WorldConditionsToolset GetQueryDescription

Searched FGameplayTagQuery and GameplayTagQuery: 0 hits.

Evidence
  • grep -r GameplayTagQuery plugins/ src/: no matches

No query builder (searched TagQuery); request_tag_container builds tag values for Python calls.

Evidence

Searched FGameplayTagQuery and tag_query actions; only internal use and a UI text param.

Evidence
AI archetype scaffold library

Searched ai.*, behavior_tree.* and wiki for archetype or template scaffolds; none.

Evidence

Searched archetype, patrol, enemy AI templates in docs, src, skills; only per-asset BT/EQS ops.

Evidence
  • no matches in docs/, src/, skills/

No AI archetype or AI template scaffolding tools found.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AIModuleToolset has BT read tools only

Searched AI domain for archetype, template, preset, patrol; only create_ai_controller.

Evidence

Searched archetype, template, scaffold, preset in AI skills and services; none.

Evidence

21 AI scaffolds: boss, companion, turret, stealth, flying, horror stalker, patrol, etc.

Evidence
Static replication audit (RPCs, OnRep)

networking.get_networking_info lists RPCs, reliability, validation, OnRep per Blueprint; no project wide audit.

Evidence

Per variable replication query on Blueprints only; no RPC or OnRep audit across project.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:1290 get_variable_replication

GetVariableInfo reports per variable Replicated or RepNotify; no RPC listing or project audit.

Evidence

network.list_rpc_functions, list_onrep_handlers, audit_unbalanced_onreps from UHT reflection index.

Evidence
Third-party state-machine / combo graph authoring

Searched Source and wiki for third party state machine or combo graph plugins; none.

Evidence
  • wiki page index

Searched LogicDriver, ComboGraph, SMStateMachine, FlowGraph in src, plugin, docs, skills.

Evidence
  • no matches in src/, plugin/, docs/, skills/

No toolsets for third party state machine or combo graph plugins.

Evidence
  • ls Engine/Plugins/Experimental/Toolsets: engine toolsets only

Searched LogicDriver, SMInstance, ComboGraph: 0 hits; configure_combo_system is native.

Evidence

No third party graph plugins; searched combo, state machine. Only engine AnimBP and montage sections.

Evidence

logicdriver (66 actions) and combograph (13 actions); need Logic Driver Pro and ComboGraph plugins.

Evidence
Game Feature plugin activation control

game_features.list reads Game Feature plugin states; activation calls exist only in test fixtures.

Evidence

Activate/deactivate/state of Game Features via wrapped Epic toolset, UE 5.8 only.

Evidence

GameFeaturesToolset lists plugins, reads state, requests activate and deactivate.

Evidence
  • Engine/Plugins/Experimental/Toolsets/GameFeaturesToolset/Source/GameFeaturesToolset/Private/GameFeaturesToolset.h:79 GetGameFeatureState, :91 RequestActivateGameFeature, :102 RequestDeactivateGameFeature

Searched GameFeaturesSubsystem and GameFeatureData: 0 hits.

Evidence
  • grep -r GameFeaturesSubsystem|GameFeatureData plugins/ src/: no matches

No VibeUE code (searched GameFeature); Epic GameFeaturesToolset activate/deactivate. via Epic toolset.

Evidence
  • Engine/Plugins/Experimental/Toolsets/GameFeaturesToolset/Source/GameFeaturesToolset/Private/GameFeaturesToolset.h:91 RequestActivateGameFeature

No dedicated action; searched UGameFeaturesSubsystem; only via run_console_command or run_python.

Evidence
Chaos Vehicle setup

vehicle.* wheel assets, wheel setups, suspension on Chaos wheeled vehicles; needs ChaosVehicles plugin.

Evidence

Searched ChaosVehicle, WheeledVehicle, VehicleMovement in src, plugin, docs, skills.

Evidence
  • no matches in src/, plugin/, docs/, skills/

Searched Toolsets for ChaosVehicle and WheeledVehicle; no tools found.

Evidence
  • grep -iE 'ChaosVehicle|WheeledVehicle' over Engine/Plugins/Experimental/Toolsets: no hits

Searched ChaosVehicle, Vehicle; only the ECC_Vehicle collision channel.

Evidence

Searched ChaosVehicle, WheeledVehicle: none; only generic blueprint.add_component and set_cdo_property.

Evidence
Multi-client PIEConfigures net mode and client count and runs multi-client PIE.

Multi-client PIE (Yes): editor.play numClients and netMode listen/client; per-world targeting client:N in other ops.

PIE configuration (net mode, clients) (Yes): editor.play takes numClients, netMode and networkEmulation without changing saved prefs.

Multi-client PIE (Yes): configure_pie sets numClients, netMode, separate server; list_pie_instances and pieInstance target clients.

PIE configuration (net mode, clients) (Yes): configure_pie: numClients, netMode, single process, separate server, window size.

Multi-client PIE (Partial): StartPIE has no client count, but it uses editor PlayIn settings; PlayNumberOfClients settable via ConfigSettings.

  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:96 SetSectionProperties
  • Engine/Source/Editor/EditorSettingsViewer/Private/EditorSettingsViewerModule.cpp:203 Editor/LevelEditor/PlayIn
  • Engine/Source/Editor/UnrealEd/Private/PlayLevel.cpp:991 default EditorPlaySettings used when unset
  • EditorAppToolset.cpp:899 StartPIE leaves Params.EditorPlaySettings unset

PIE configuration (net mode, clients) (Partial): StartPIE has no net options; net mode and clients settable via ConfigSettings Editor/LevelEditor/PlayIn.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:27 FPIESessionOptions
  • EditorAppToolset.cpp:899 FRequestPlaySessionParams without EditorPlaySettings (defaults used)
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:96 SetSectionProperties

Multi-client PIE (Yes): set_pie_settings sets net mode and 1 to 10 clients; PIEActorService targets server or client:N worlds.

PIE configuration (net mode, clients) (Yes): EngineSettingsService Get/SetPIESettings with net mode, client count, single process.

Multi-client PIE (Partial): start_pie is single in-viewport session only; client count only via run_python on PIE settings.

PIE configuration (net mode, clients) (No): start_pie is in-viewport only; searched PlayNetMode, NumberOfClients, LevelEditorPlaySettings.

Smart Objects and AI perception authoringAuthors Smart Object definitions and AI perception configs.

Smart Objects (Yes): Definition, slot, slot behavior and component ops; gated on SmartObjects engine plugin.

AI perception authoring (Yes): ai.set_ai_perception sets sight, hearing, damage senses and dominant sense on AI controller BP.

Smart Objects (Yes): create definition, add/set/remove/list slots, slot and default behaviors, add component.

AI perception authoring (Yes): add_perception, configure_sense, remove_sense, read_perception with problem checks.

Smart Objects (Partial): No SmartObject tools; SmartObjectDefinition is a DataAsset, so generic data_asset.create plus set_properties.

  • Engine/Plugins/Runtime/SmartObjects/Source/SmartObjectsModule/Public/SmartObjectDefinition.h:258 USmartObjectDefinition : UDataAsset
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/data_asset.py:16 create
  • object.py:81 set_properties (instanced sub-objects supported)

AI perception authoring (Partial): No perception tools; add AIPerceptionComponent via actor.add_component, SensesConfig via set_properties.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:392 add_component (actor or blueprint)
  • object.py:81 set_properties (instanced sub-objects)
  • Engine/Source/Runtime/AIModule/Classes/Perception/AIPerceptionComponent.h:218 SensesConfig Instanced

Smart Objects (No): Searched SmartObject across Source, skills, docs and Epic Toolsets; no matches.

  • rg -i SmartObject VibeUE: 0 relevant
  • rg SmartObject Engine/Plugins/Experimental/Toolsets: 0 files

AI perception authoring (No): Searched AIPerception, Perception, sense config in VibeUE and Epic Toolsets; no matches.

  • rg -i Perception VibeUE: 0 relevant

Smart Objects (Yes): Smart Object definition CRUD, slots, behaviors, placement, validation.

AI perception authoring (Yes): add_perception_component, configure sight/hearing/damage/touch senses, stimuli sources.

GAS live debugging (attributes, activation trace, snapshots)Reads and sets attributes, traces ability activation, and diffs ability-system state during play.

GAS live attribute get/set (Partial): gas.set_attribute_base_value edits AttributeSet BP defaults; live PIE values only via python.execute.

GAS ability activation trace (No): Searched gas.* and Source for TryActivateAbility, ability trace or runtime ASC ops; none.

GAS state snapshot + diff (No): Searched for runtime ASC snapshot or diff (GetActiveAbilities, active effects); none, gas is asset only.

GAS live attribute get/set (Yes): get/set_attribute and get/set_live_attribute_value on registered set instance.

GAS ability activation trace (Yes): trace_ability_activation reports grant, tag, cooldown and cost blockers, optional activate.

GAS state snapshot + diff (Yes): capture_gas_state, compare_gas_states with named change kinds, snapshot list/delete.

GAS live attribute get/set (Partial): GetAttributeValues reads base and current values; no attribute set tool.

  • Engine/Plugins/Experimental/Toolsets/GASToolsets/Source/GASToolsets/Private/AbilitySystemInspectorToolset.h:102 GetAttributeValues

GAS ability activation trace (No): Only an is-active flag per granted ability; no activation trace or event log tool.

  • Engine/Plugins/Experimental/Toolsets/GASToolsets/Source/GASToolsets/Private/AbilitySystemInspectorToolset.h:78 bIsActive

GAS state snapshot + diff (Partial): Snapshot via attribute values, active effects, abilities and tags per actor; no diff tool.

  • Engine/Plugins/Experimental/Toolsets/GASToolsets/Source/GASToolsets/Private/AbilitySystemInspectorToolset.h:102 GetAttributeValues, :131 GetActiveTags

GAS live attribute get/set (Partial): set_attribute_base_value edits AttributeSet CDO; live get/set only via execute_python.

GAS ability activation trace (No): GAS domain is asset authoring only; searched TryActivateAbility, PlayWorld: 0 hits.

  • plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/Domains/GAS/ (grep TryActivateAbility|PlayWorld|GetPIE: 0 hits)

GAS state snapshot + diff (No): No runtime ASC snapshot or diff; get_gas_info reports asset class data only.

GAS live attribute get/set (Partial): Get only via Epic GetAttributeValues; no attribute set op in VibeUE. via Epic toolset.

GAS ability activation trace (No): No activation trace; skill only shows try_activate_ability_by_class via Python then inspector reads.

GAS state snapshot + diff (Partial): Snapshot via Epic AbilitySystemInspectorToolset; no diff. via Epic toolset.

GAS live attribute get/set (Yes): gas.get_attribute_value and gas.set_attribute_value on live PIE actors, current or base.

GAS ability activation trace (Yes): gas.trace_ability_activation dry runs CanActivateAbility and reports tag, cost, cooldown checks.

GAS state snapshot + diff (Yes): gas.snapshot_gas_state and gas.compare_gas_states diff two snapshots.

Gameplay scaffolding (genre systems, online sessions)Generates starter gameplay systems and multiplayer session setup.

Genre scaffolding (weapons, inventory, interactables) (Partial): interaction.* doors, chests, switches, destruction; game_framework rounds/teams; no weapon or inventory ops.

Online sessions, split-screen and voice setup (Partial): session.host_lan_server and split screen add/remove local player; no online sessions or voice setup.

Genre scaffolding (weapons, inventory, interactables) (No): Searched weapon, inventory, interactable, scaffold in docs, src, skills; no genre templates.

Online sessions, split-screen and voice setup (No): Searched OnlineSubsystem, CreateSession, splitscreen, VoiceChat, VOIP in src, plugin, docs, skills.

  • no matches in src/, plugin/, docs/, skills/

Genre scaffolding (weapons, inventory, interactables) (No): No weapon, inventory or interactable scaffolding tools in any toolset.

  • Tool listing of Engine/Plugins/Experimental/Toolsets/*: no genre templates

Online sessions, split-screen and voice setup (No): Searched Toolsets for OnlineSubsystem, session, split screen, voice; no tools found.

  • grep -iE 'OnlineSubsystem|SplitScreen|VoiceChat' over Engine/Plugins/Experimental/Toolsets: no hits

Genre scaffolding (weapons, inventory, interactables) (Yes): manage_combat weapons/projectiles, manage_inventory items/crafting, doors, chests, levers.

Online sessions, split-screen and voice setup (Yes): configure_session, LAN host/join, split screen local players, voice chat configuration.

Genre scaffolding (weapons, inventory, interactables) (No): Searched weapon, inventory, interactable; only doc examples. MapBlockoutService is level blockout.

Online sessions, split-screen and voice setup (No): Searched OnlineSubsystem, CreateSession, SplitScreen, Voice; no matches.

  • rg -i OnlineSubsystem|CreateSession|SplitScreen|Voice VibeUE: 0 relevant

Genre scaffolding (weapons, inventory, interactables) (Partial): Basic only: scaffold_weapon_ability, interactable_actor BP template, inventory grid widget; no inventory system.

Online sessions, split-screen and voice setup (No): Searched OnlineSession, CreateSession, split screen, VoiceChat; only PIE smoke session ids found.

Live AI state writes (blackboard, StateTree events)Changes blackboard keys and sends StateTree events during play.

Live blackboard write (notifying) (Partial): Live blackboard dump is read only; live writes only via python.execute or object.call_function SetValueAs*.

Live StateTree events/transitions (Partial): No live StateTree op; get_runtime_state marks StateTree brains absent; events only via python or call_function.

Live blackboard write (notifying) (Yes): set_live_blackboard uses typed SetValueAs so key change observers fire.

Live StateTree events/transitions (Yes): statetree read_runtime, send_event, request_transition on running trees.

Live blackboard write (notifying) (No): No runtime blackboard component read or write tools found in AIModuleToolset.

  • Engine/Plugins/Experimental/Toolsets/AIModuleToolset/Content/Python/aimodule_toolset/toolsets/behavior_tree.py

Live StateTree events/transitions (No): StateTreeToolset reads editor data only; no runtime event send or transition tools.

  • Engine/Plugins/Experimental/Toolsets/StateTreeToolset/Content/Python/state_tree_toolset/toolsets/state_tree.py:14 get_editor_data

Live blackboard write (notifying) (Partial): set_blackboard_value edits asset defaults only; runtime write only via execute_python or call_function.

Live StateTree events/transitions (Partial): No StateTree event action (SendStateTreeEvent 0 hits); reachable only via execute_python.

Live blackboard write (notifying) (Partial): No live blackboard op; only via execute_python_code on BlackboardComponent set_value_as_*.

Live StateTree events/transitions (Partial): No live StateTree op; SendStateTreeEvent reachable only via Python or BP graph wiring.

Live blackboard write (notifying) (Yes): ai.runtime_set_bb_value uses UBlackboardComponent SetValueAs* which notifies observers.

Live StateTree events/transitions (Partial): runtime_send_st_event and runtime_get_st_active_states; no transition trace or history.

PIE record and replay

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Disable background CPU throttlingAlso possible from the shell: bThrottleCPUWhenNotForeground=False under [/Script/UnrealEd.EditorPerformanceSettings] in the EditorPerProjectUserSettings INI disables throttling before launch. The tools add toggling it on a running editor for a session without a restart.

Searched ThrottleCPU, UseLessCPU, IdleWhenNotForeground in plugin Source, Content, docs; no hits.

Evidence
  • rg -il ThrottleCPU|LessCPU|IdleWhenNotForeground Plugins/PinWright: no hits

pie-studio plugin only: CPU throttle suppressed during sessions; core does it only for automation tests.

Evidence

No CPU throttle handling; searched throttle, UseLessCPU, foreground; no console exec tool exists either.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep throttle|UseLessCPU|foreground: only SlateInspector tick)

PerformanceService.set_background_throttling toggles bThrottleCPUWhenNotForeground for session.

Evidence

No background CPU throttle override; searched UseLessCPU, IdleWhenNotForeground, ThrottleCPU.

Evidence
  • rg 'UseLessCPU|IdleWhenNotForeground|ThrottleCPU|bThrottle' Source Docs Skills wiki Config: no hits
PIE session error capture

editor.play lists blueprintsWithErrors at start; runtime errors only if code logs journal events.

Evidence

Core get_message_log reads the PIE Message Log and get_log reads output; no per-session capture.

Evidence

LogsToolset.GetLogEntries filters session log by category and regex; not scoped to a PIE session.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/LogsToolset.h:29 GetLogEntries

Scenario report stores log delta since start; errors only via assert_log not_contains.

Evidence

PIE smoke counts post marker log hits; defaults include Blueprint Runtime Error and Accessed None.

Evidence
Gameplay telemetry recorded from game code

FJournalRecorder LogVariable/LogEvent and PW_JOURNAL_LOG; editor-only module, host code must call it.

Evidence

Searched telemetry, journal in src/tools and bridge; only read_actor_motion one-shot polled snapshots.

Evidence

No gameplay telemetry journal API; only log file reading via LogsToolset.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/LogsToolset.h:29

No gameplay telemetry journal; telemetry files are server metrics, Insights is profiling. Searched journal.

Evidence

Workflow journal logs agent runs, notes and artifacts, not gameplay telemetry from game code.

Evidence

No runtime macro or subsystem for gameplay code to journal events; searched telemetry, journal in Source.

Evidence
  • rg -i 'telemetry|journal' Source: no runtime journal API
Query recorded sessions (state, min and max values, events)

recorder.get_state, summarize_change (extrema), get_series, find_events, list_segments, query.

Evidence

pie-studio plugin only: pie_record_read/pie_observe_read return raw artifacts; no extrema or event query.

Evidence

No recorded sessions to query; searched for session, record, journal tools.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep record|journal|replay: none)

No query over recorded sessions; demo replays can be played or seeked but not queried for state.

Evidence

get_scenario and list_runs return step reports only; no state, extrema or event query.

Evidence

poll_pie_smoke returns per var min/max/last and samples for in-memory sessions; no event query.

Evidence
Network replay (demo) recording in PIE

editor.start_recording and stop_recording run a GameInstance demo replay recording in the PIE world.

Evidence

Searched DemoNetDriver, demorec, ReplaySubsystem, StartRecordingReplay in src and bridge; none found.

Evidence
  • src/tools (no demo replay refs)
  • plugin/ue_mcp_bridge/Source (no demo net driver refs)

No demo recording tool and no console command tool to run demorec; searched demorec, replay.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep demorec|replay: none)
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:207 SearchCVars only

No demo recording API; demorec reachable only via scenario console_command escape hatch.

Evidence

No demo recording; searched DemoNetDriver, demorec, ReplaySubsystem, StartRecordingReplay.

Evidence
  • rg -il 'DemoNetDriver|demorec|StartRecordingReplay' Source Docs Skills wiki: no hits
Input record and replay with drift reportRecords play input, replays it through Enhanced Input, and reports per-frame drift from a reference run.

Input recording (per-frame, 60 Hz) (No): Searched InputRecord, RecordInput, InputTape in Source and wiki; only single injected events via simulate_input.

Replay through Enhanced Input (No): No input replay. simulate_input proves PlayerInput delivery only, not Enhanced Input action replay.

Per-frame drift report (JSON) (No): Searched for drift/replay comparison; no replay so no drift report (drift hits are geometry code only).

  • rg -il drift Plugins/PinWright/Source: only PinWrightGeometry files

Multi-client record / replay (No): Multi-client PIE exists (editor.play numClients) but no input record/replay per client.

Take Recorder lockstep (No): Searched TakeRecorder in plugin Source, Content, docs; no hits.

  • rg -il TakeRecorder Plugins/PinWright: no hits

Monitor mode (manual vs ref) (No): No monitor mode comparing manual play against a reference recording found in wiki or source.

Offline diff (no PIE) (No): recorder.* reads sessions without PIE but each call takes one session; no cross-recording diff.

Determinism contract documented (No): No replay determinism contract; only fixed-delta notes for editor.step_frame and pause.

Input recording (per-frame, 60 Hz) (Partial): pie-studio plugin only: pie_record_arm samples Enhanced Input and pawn state, sample_hz default 60.

Replay through Enhanced Input (Partial): pie-studio plugin only: pie_replay_arm plays back through the Enhanced Input pipeline.

Per-frame drift report (JSON) (Partial): pie-studio plugin only: replay writes drift.json with per-frame deltas and frames over threshold.

Multi-client record / replay (Partial): pie-studio plugin only: client_id on record, replay and inject; one arm call per client.

Take Recorder lockstep (Partial): pie-studio plugin only: take_record=true drives Take Recorder via UFunction reflection.

Monitor mode (manual vs ref) (Partial): pie-studio plugin only: pie_replay_arm mode=monitor skips injection and keeps drift sampling.

Offline diff (no PIE) (Partial): pie-studio plugin only: pie_record_diff compares two recording CSVs without PIE.

Determinism contract documented (Partial): Guaranteed and not guaranteed lists in core docs, but they cover the pie-studio plugin only.

Input recording (per-frame, 60 Hz) (No): No input recording tool; searched Toolsets/MCP/ToolsetRegistry for record, PlayerInput, EnhancedInput.

  • Engine/Plugins/Experimental/Toolsets (grep record|PlayerInput|EnhancedInput: no tool hits)

Replay through Enhanced Input (No): No replay tool; only SlateInspector.PressKey sends one key tap via Slate. Searched replay, EnhancedInput.

  • Engine/Plugins/Experimental/Toolsets (grep replay|EnhancedInput: only MVVM build defines)
  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:148 PressKey

Per-frame drift report (JSON) (No): No replay feature, so no drift report; searched for replay, drift across toolsets.

  • Engine/Plugins/Experimental/Toolsets (grep replay|drift: none)

Multi-client record / replay (No): No record/replay; StartPIE options have no client count and force in-process single viewport PIE.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:27 FPIESessionOptions

Take Recorder lockstep (No): No Take Recorder tool; searched TakeRecorder and take_recorder in all toolsets and MCP plugin.

  • Engine/Plugins/Experimental/Toolsets (grep takerecorder|take_recorder: none)

Monitor mode (manual vs ref) (No): No monitor or reference comparison mode; searched toolsets for monitor, reference run, replay.

  • Engine/Plugins/Experimental/Toolsets (grep replay|monitor: no PIE tool)

Offline diff (no PIE) (No): No recordings exist to diff; searched for replay, recording, diff tools.

  • Engine/Plugins/Experimental/Toolsets (grep record|replay: none)

Determinism contract documented (No): No determinism documentation; no record/replay feature exists in the toolsets.

  • Engine/Plugins/Experimental/Toolsets (grep determinis|replay: none)

Input recording (per-frame, 60 Hz) (No): No per-frame input recorder; start_recording only issues DemoRec (network demo). Searched record_input, InputRecord.

Replay through Enhanced Input (No): No recording to replay; simulate_input can inject one Enhanced Input action with holdSeconds.

Per-frame drift report (JSON) (No): No drift or divergence report; searched drift, divergence, per-frame across src and plugins.

  • searched: drift|divergence|per-frame in src/ and plugins/

Multi-client record / replay (No): No multi-client input record or replay; searched record/replay handlers, only single-world demo replay.

Take Recorder lockstep (Partial): Take Recorder start/stop and source config exist, but nothing couples it to an input recording.

Monitor mode (manual vs ref) (No): No monitor mode comparing manual play to a reference; searched monitor, reference, compare.

  • searched: monitor|reference run|compare in plugins/McpAutomationBridge and src

Offline diff (no PIE) (No): No offline recording diff; no input recording format exists to diff.

  • searched: diff|drift|compare recording in src/ and plugins/

Determinism contract documented (No): No determinism contract for play replay; only a fixed_delta_time option; searched determinis in docs.

Input recording (per-frame, 60 Hz) (No): No input recorder; searched record/replay/tape/InputRecord in Source, Skills, docs.

  • rg 'record|replay|demorec|drift|telemetry' over Source and Content/Skills: only unrelated hits

Replay through Enhanced Input (No): No recording to replay; only single-shot InputService.inject_action into Enhanced Input exists.

Per-frame drift report (JSON) (No): No replay drift report; searched drift/replay/record in Source and Skills.

  • rg 'drift|replay' over Source and Content/Skills: only unrelated comments (viewport SKILL.md:349)

Multi-client record / replay (No): No record/replay at all; PIEActorService resolves client worlds for spawning only.

Take Recorder lockstep (No): Searched TakeRecorder in Source, Skills and docs; no hits.

  • rg 'TakeRecorder' over VibeUE: no hits

Monitor mode (manual vs ref) (No): No monitor or reference comparison mode; searched monitor/reference/replay in PIE code.

Offline diff (no PIE) (No): No recordings exist to diff offline; searched diff/replay in Workflow and PIE services.

Determinism contract documented (No): No replay determinism contract; pie-testing skill documents only scenario evidence freshness hashing.

Input recording (per-frame, 60 Hz) (No): No input capture; searched record_input, InputRecord, recording, input_tape in Source, Docs, Skills, wiki.

  • rg -i 'record_input|inputrecord|recordinput|input_tape|recording' Source Docs Skills wiki: only unrelated comments

Replay through Enhanced Input (Partial): No recording replay; pie_inject_input_action injects one Enhanced Input value, optional repeat_frames.

Per-frame drift report (JSON) (No): No drift or replay divergence report; searched drift, replay, diff in Source/MonolithEditor.

  • rg -in 'drift|replay' Source/MonolithEditor: no report action

Multi-client record / replay (No): No multi client record or replay; run_console_command says multi client PIE is not disambiguated.

Take Recorder lockstep (No): No Take Recorder integration; searched TakeRecorder across Source, Docs, Skills, wiki.

  • rg -il 'TakeRecorder' Source Docs Skills wiki: no hits

Monitor mode (manual vs ref) (No): No reference recording to compare manual play against; compare_to_actor only diffs two live actors.

Offline diff (no PIE) (No): No play recording diff; only compare_gas_states diffs two GAS state snapshots, not play data.

Determinism contract documented (No): No determinism contract; pie_set_control_rotation states exact determinism in PIE is not guaranteed.

Per-frame actor property tracking during playSamples chosen actors or property paths every frame while playing.

Tracked reflection paths (No): No per-frame sampling of arbitrary property paths; property.get and inspect_object are one-shot reads.

Tracked actor sampling (Partial): Per-frame actor values only if host C++ calls FJournalRecorder::LogVariable(UObject*); no RPC to pick actors.

Tracked reflection paths (Partial): pie-studio plugin only: observation profiles take tracked_values reflection paths with thresholds.

Tracked actor sampling (Partial): pie-studio plugin only: profile tracked_actors sampled per frame into tracked.jsonl.

Tracked reflection paths (Partial): Only via execute_tool_script polling object.get_properties with time.sleep; wall clock, not per frame.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script (time module allowed, runs on worker thread)
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:66 get_properties

Tracked actor sampling (Partial): Only via execute_tool_script looping get_actor_transform on PIE actors; wall clock polling, no sampler.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/actor.py:106 get_actor_transform
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:478 PIE world used when running

Tracked reflection paths (No): No tracked property paths during play; pie_report and get_property are one-shot reads.

  • searched: track_actor|watch_property|sample in plugins/McpAutomationBridge

Tracked actor sampling (No): No per-frame actor sampling; pie_report returns a one-shot actor list and player state.

Tracked reflection paths (No): No tracked property path sampling during PIE; searched record/sample/track in PIE services.

Tracked actor sampling (No): No per-frame actor sampling; scenario python_assert_number reads a value only at one step.

Tracked reflection paths (Yes): sample_pie_timeseries samples dotted UPROPERTY member paths on a resolved PIE target each tick.

Tracked actor sampling (Partial): One resolved target per session; sample_pie_anim_instance compares two actors in a single sample.

Scripted play scenarios and assertionsDrives play from a script or input tape and asserts on what happened over time.

Declarative play scenarios (No): No scenario file or batch play script verb; drive and editor verbs are called one at a time.

  • wiki page drive method list
  • rg -il scenario docs/wiki-src: only level and inspection pages

Timed input tape injection (Partial): editor.simulate_input and drive.key send one key edge per call; no timed sequence or tape.

Temporal assertions over play data (Partial): No assertion verb; recorder.query Python over a session and drive.wait_for journal_event conditions.

Declarative play scenarios (Partial): pie-studio plugin only: sequence.json steps (input, hold, tape, mark, console, capture); no condition steps.

Timed input tape injection (Partial): pie-studio plugin only: inject_input_tape plays a per-frame value array at a given Hz.

Temporal assertions over play data (No): Searched assert, temporal, expect in src/tools and docs; only drift thresholds vs a reference recording.

Declarative play scenarios (No): No scenario format; StartPIE only takes simulate flag, play mode, spawn transform and warmup seconds.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:365 StartPIE

Timed input tape injection (No): No timed tape; SlateInspector PressKey only sends one instant key tap. Searched InjectInput, input_tape.

  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolset.cpp:372 PressKey
  • Engine/Plugins/Experimental/Toolsets (grep InjectInput|input_tape: none)

Temporal assertions over play data (No): No assertion tooling over play data; searched toolsets for assert, temporal, timeline checks.

  • Engine/Plugins/Experimental/Toolsets (grep record|replay|assert tool: none)

Declarative play scenarios (No): No declarative play scenario format; workflow-prompts.ts holds MCP prompts, not play scenarios.

Timed input tape injection (Partial): simulate_input injects one key or Enhanced Input action per call with holdSeconds; no multi-step tape.

Temporal assertions over play data (No): No temporal assertions over play data; searched assert, expect, wait_until.

  • searched: assert|expect_|wait_until in src/ and plugins/ handlers

Declarative play scenarios (Yes): WorkflowService.run_scenario takes JSON steps (start_pie, inject, wait, assert, capture, teardown).

Timed input tape injection (Partial): Scenario inject_action/inject_key steps separated by wait steps; no frame-timed input tape.

Temporal assertions over play data (Partial): Scenario assert steps run at points after wait steps; no always/eventually over sampled data.

Declarative play scenarios (Yes): run_pie_smoke takes declarative actor_setup, stages, probe_scripts; sample_pie_timeseries takes provocations.

Timed input tape injection (Partial): Timed provocations limited to control rotation, movement input, jump, console; no Enhanced Input tape.

Temporal assertions over play data (Partial): run_pie_smoke asserts log must_absent/must_present and expected_anim_class per tick, not over sampled values.

Landscape, PCG and foliage

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Landscape CRUD

landscape.create, edit, sculpt, get_heights, set_material; deletion goes through the generic actor delete.

Evidence

create, get_info, set_material, layers, proxies; delete goes through generic level(delete_actors).

Evidence

No landscape create/edit/delete tool; grep for landscape in all toolsets found only a PCG node name.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep -ril landscape: only PCGToolsetLibraryCore.h:91 'Get Landscape Data')

LandscapeService create, list, info, resize, delete, save and property setters.

Evidence

No landscape actions (no ALandscape use outside indexer); only reachable via editor.run_python.

Evidence
PCG graph CRUD

pcg.create_graph, add_node, remove_node, connect_pins, set_node_property, inspect, decompile, pcgir.

Evidence

create_graph, add/remove/connect nodes, set_node_settings, JSON import/export of whole graphs.

Evidence

PCGToolset has CreateGraph, AddNode, UpdateNode, RemoveNode, Connect/DisconnectNodePins, GetGraphStructure.

Evidence
  • Toolsets/PCGToolset/Source/PCGToolset/Public/PCGToolset.h:30 CreateGraph
  • PCGToolset.h:196 AddNode, :279 RemoveNode, :291 ConnectNodePins

Create graph, subgraph, add nodes, connect pins, set settings; no node delete, disconnect or graph read action.

Evidence

No VibeUE PCG service (no PCG symbols in Source); via Epic toolset PCGToolset or Python per pcg skill.

Evidence

No PCG actions or PCG module use; only via editor.run_python with the PCG plugin enabled.

Evidence
Runtime Virtual Texture authoring

No RVT verb or handler; RVT assets and volumes only via generic python.execute, actor.spawn and property.set.

Evidence

create_rvt, read_rvt, add_rvt_volume, sampler/output nodes, assign_rvt_to_landscape.

Evidence

Searched VirtualTexture, RVT in all toolsets and MCP plugin; no tool and no generic asset create by class.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep -i virtualtexture: no hits)

Searched RuntimeVirtualTexture, runtime_virtual, rvt in src and plugins: no hits; only texture VT streaming config.

Evidence

RVT asset create, RVT volume create, assign RVT to landscape.

Evidence

No RVT authoring action; only reads MFI RVT params; authoring only via editor.run_python.

Evidence
Real-world GPS terrain

Searched wiki and source for GPS, latitude, longitude, SRTM, GeoTIFF, Cesium: only image georeference, no terrain.

Evidence

plan_real_world sizes tile from lat/lon bounds, geo projection both ways; no DEM download, user supplies file.

Evidence

No GPS, geo, elevation data or real world terrain tool found in any toolset.

Evidence
  • Engine/Plugins/Experimental/Toolsets (searched landscape, heightmap, terrain terms)

Searched gps, geotiff, srtm, mapbox, dem, elevation; elevation and latitude only used for sun and weather.

Evidence

terrain_data tool makes heightmaps from lng/lat via hosted vibeue.com; needs free VibeUE API key.

Evidence

Searched Source and Docs for GPS, latitude, geotiff, elevation data: no real world terrain import.

Evidence
  • grep latitude|geotiff|elevation data over Source and Docs: no hits
Terrain analysis (slope/flat areas)

No slope or flat-area finder; get_heights region min/max/mean, audit_shape, pcg.add_slope_filter node.

Evidence

analyze_terrain returns height/slope histograms and largestFlatArea; slope map and slope at point.

Evidence

No slope tool; single point trace_world, or a user built PCG graph on Get Landscape Data read back as JSON.

Evidence
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:295 trace_world
  • PCGToolset.h:325 GetNodeDataView

Searched slope, flatness, flat_area, analyze_terrain; slope only a PCG filter node and AI nav settings.

Evidence

AnalyzeTerrain, slope at location, slope map, normals, FindFlatAreas.

Evidence

sample_terrain_grid returns avg slope and roughness per area; no flat area search; off by default flag.

Evidence
Per-instance ground seating for instanced meshes

spatial.ground_instances seats each ISM/HISM instance on its own footprint and re-measures.

Evidence

snap_instances_to_surface projects ISM/HISM instances onto geometry, dry run default, keeps rotation/scale.

Evidence

snap_to_ground is per actor only; per instance seating only via PCG Projection/Surface Sampler graphs.

Evidence
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:102 add_to_scene_from_class snap_to_ground, :628 _snap_to_ground
  • PCGToolsetLibraryCore.h:99 Projection

Foliage instances traced to ground and normal aligned at placement; no reseat op for existing ISM instances.

Evidence

snap_to_floor and snap_to_surface seat whole actors; no per instance seating inside ISM or HISM.

Evidence
Water body authoring (river, lake, ocean)

water.spawn_water_body River/Lake/Ocean/Custom plus river width/depth and material verbs.

Evidence

edits existing water bodies and zones and reads state; no create action, spawn via generic actor spawn.

Evidence
  • src/tools/level.ts:49-52 set_water_body_property, rebuild_water_zone, get_water_state
  • grep WaterBodyRiver/Lake/Ocean in src, plugin, docs: no hits

No water tool; generic add_to_scene_from_class can spawn WaterBodyLake/River/Ocean if Water plugin enabled.

Evidence
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:102 add_to_scene_from_class
  • Engine/Plugins/Experimental/Water/Source/Runtime/Public/WaterBodyLakeActor.h:33 AWaterBodyLake
  • Toolsets (grep -il water: no hits)

No WaterBody service; real world river/lake/ocean splines as data, WaterBody spawn only via Python.

Evidence

No water actions; only via editor.run_python with the Water plugin enabled.

Evidence
PCG generation with spawned-output readback

pcg.generate async job reports instanceCount, spawnedActorCount, instancesByMesh, pointCount.

Evidence

own execute reports seed only; node output readback via wrapped Epic toolset, UE 5.8 only.

Evidence

ExecuteGraphInstance returns execution messages; GetNodeDataView returns per node output points as JSON.

Evidence
  • Toolsets/PCGToolset/Source/PCGToolset/Public/PCGToolset.h:122 ExecuteGraphInstance
  • PCGToolset.h:325 GetNodeDataView
  • PCGSpatialToolset.h:25 RunPCGInstantGraph

Only via Epic toolset PCGToolset or Python; pcg skill counts ISM instances on the PCG volume.

Evidence

No PCG generate or output readback action; only via editor.run_python with PCG plugin.

Evidence
Procedural map blockout from landscape

Searched blockout, level-building pages and landscape verbs; blockout is guide text, no generator from landscape.

Evidence

searched blockout, generate_level/map, layout; only BSP to static mesh conversion exists.

Evidence

No landscape based blockout tool; PCG skills cover biomes, shape grammar, mesh partition, not terrain.

Evidence
  • Toolsets\PCGToolset\Content\Skills (8 skill assets, none landscape blockout)

Searched blockout, greybox, map layout actions; only hit is an editor camera file, nothing derives blockout.

Evidence

MapBlockoutService runs roads, POIs, fields, foliage, railway pipeline from a landscape and materializes.

Evidence

Blockout tools work from blockout volumes, not landscape; searched blockout actions for landscape input.

Evidence
Heightmap and weightmap read, write, importImports and exports heightmaps and edits height or layer-weight regions.

Heightmap import/export (Partial): Raw uint16 arrays only: edit set writes, get_heights includeSamples reads (maxSamples cap); no file import/export.

Height/weight region read-write (Partial): Height region read and write exist; weight region write via layer paint, weight read only as paint verify.

Heightmap import/export (Yes): import_heightmap and export_heightmap for png16 and raw16 files, region based, with resample option.

Height/weight region read-write (Yes): get/set_height_region and get/set_layer_weight_region with base64 round trip and rollback.

Heightmap import/export (No): Searched heightmap, landscape import/export in Python and C++ toolsets; nothing found.

  • Engine/Plugins/Experimental/Toolsets (grep heightmap: no hits)

Height/weight region read-write (Partial): No write tool. Read only via PCG Get Landscape Data sampling and GetNodeDataView JSON readback.

  • PCGToolsetLibraryCore.h:91 Get Landscape Data
  • PCGToolset.h:325 GetNodeDataView

Heightmap import/export (Yes): ImportHeightmap, ExportHeightmap, ResizeHeightmap plus weightmap import and export.

Height/weight region read-write (Yes): Get/SetHeightInRegion and Get/SetWeightsInRegion arrays.

Heightmap import/export (Partial): No heightmap action; only via editor.run_python using engine landscape Python API.

Height/weight region read-write (Partial): Read only height grid via line traces in sample_terrain_grid; no landscape write, no weight layers.

Procedural terrain sculpting (erosion, feature stamps)Applies erosion and procedural features to landscape.

Erosion simulation (No): landscape.md states Erosion and Hydro tools are not reachable through any verb.

Procedural terrain feature stamps (Partial): landscape.sculpt stamps a Raise/Lower/Flatten brush with falloff profiles; no preset features like crater.

Erosion simulation (Yes): apply_erosion runs hydraulic or thermal CPU grid erosion over a region.

Procedural terrain feature stamps (Yes): sculpt_region operators: mountain, valley, ridge, plateau, crater, terrace, smooth, flatten.

Erosion simulation (No): Searched erosion, landscape and terrain terms in all toolsets; nothing found.

  • Engine/Plugins/Experimental/Toolsets (grep erosion: no hits)

Procedural terrain feature stamps (No): No terrain stamp or landscape sculpt tool; searched landscape, heightmap, terrain in all toolsets.

  • Engine/Plugins/Experimental/Toolsets (grep landscape: only PCG node name)

Erosion simulation (No): Searched erosion and erode across src and plugins; no hits.

  • rg -i 'erosion|erode' src plugins: no matches

Procedural terrain feature stamps (No): Searched stamp; sculpt has raise, lower, flatten; modify_heightmap set, add, subtract, smooth; no stamps.

Erosion simulation (Yes): ApplyErosion operation on landscape heights.

Procedural terrain feature stamps (Yes): CreateMountain, Valley, Ridge, Plateau, Crater, Terraces, BlendTerrainFeatures.

Erosion simulation (No): Searched Source and Docs for erosion and hydraulic: no erosion simulation.

  • grep erosion|hydraulic over Source and Docs: no hits

Procedural terrain feature stamps (No): No stamp onto terrain; create_terrain_patch only builds a standalone Perlin noise static mesh.

Foliage scatter (seeded, reproducible)Scatters foliage, optionally from a fixed seed.

Foliage scatter (Yes): foliage.paint seats instances on ground; foliage.add_instances and foliage.create_procedural volume.

Seeded reproducible scatter layout (Yes): spatial.scatter_layout returns byte-identical jittered hex/square transforms for the same seed.

Foliage scatter (Yes): add_instances scatters on a disc with ground trace and type rules; simulate_procedural runs spawners.

Seeded reproducible scatter layout (Yes): foliage add_instances takes seed for FRandomStream scatter; pcg execute writes a seed before generating.

Foliage scatter (Partial): Only via authored PCG graphs (Surface Sampler plus Static Mesh Spawner); no foliage tool or foliage actor API.

  • Toolsets/PCGToolset/Source/PCGToolset/Public/PCGToolsetLibraryCore.h:103-104 Static Mesh Spawner, Surface Sampler
  • Toolsets\PCGToolset\Content\Skills\Skill_PCGBiomeCore.uasset

Seeded reproducible scatter layout (Partial): PCG output is seed deterministic, but the toolset strips Seed from node schemas; raw set_properties needed.

  • Toolsets/PCGToolset/Source/PCGToolset/Private/PCGToolsetLibraryCore.cpp:367 skips UPCGSettings::Seed
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

Foliage scatter (Yes): paint_foliage scatters instances in area or brush; add_foliage_instances places explicit points.

Seeded reproducible scatter layout (Yes): create_procedural_foliage sets spawner RandomSeed from seed and resimulates a volume; paint seed not exposed.

Foliage scatter (Yes): FoliageService scatter in radius, rect, on paint layer, explicit instances, remove and query.

Seeded reproducible scatter layout (Yes): Foliage scatter takes a Seed feeding FRandomStream; map blockout config has Seed.

Foliage scatter (Partial): scatter_props does Poisson scatter as StaticMeshActors in a volume; no foliage instance painting.

Seeded reproducible scatter layout (Yes): scatter_props and scatter_on_surface take a seed and use FRandomStream for reproducible placement.

Mesh and geometry

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Mesh ops (UV, simplify, remesh, boolean)

Dedicated geometry.* verbs: unwrap_uv/auto_uv, simplify_mesh, remesh_uniform, boolean_union/subtract/intersection.

Evidence

Own GeometryScript actions: apply_mesh_simplify, apply_mesh_remesh, mesh_boolean, unwrap_uvs, transform_uvs.

Evidence

Only triangle reduction via generate_lods; no UV, remesh or boolean tools found in any toolset.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:223 generate_lods
  • grep remesh|simplif|UVUnwrap|GeometryScript|DynamicMesh|boolean over Toolsets: no mesh-op tools; execute_tool_script sandbox allows only json/math/re etc (programmatic.py:52)

Dedicated UV ops only (unwrap, pack, lightmap UVs, transform); no simplify, remesh or boolean found.

Evidence

boolean, simplify, remesh, compute_uvs exist but need GeometryScripting plugin; release zip DLLs omit them.

Evidence
Collision generation

geometry.generate_collision (box, convex, decomposition, auto), generate_complex_collision, simplify_collision.

Evidence

generate_mesh_collision: boxes, spheres, capsules, convex hulls, swept hulls, level sets; also clear op.

Evidence

generate_convex_collisions (convex decomposition) and remove_collisions; no simple box/sphere/capsule tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:266 generate_convex_collisions
  • static_mesh.py:288 remove_collisions

generate_collision, generate_complex_collision and simplify_collision actions in manage_geometry.

Evidence

No own static mesh collision tool; Epic PhysicsToolsets CreateFromMesh (not enabled by default) or Python.

Evidence
  • rg BodySetup|ConvexDecomp in Source: no hits; collision hits are spawn handling only
  • Engine/Plugins/Experimental/Toolsets/PhysicsToolsets/Source/PhysicsToolsets/Private/PhysicsToolsets/PhysicsAssetToolset.h:158 CreateFromMesh (via Epic toolset)
  • Source/VibeUE/Private/Tools/PythonToolsRegistration.cpp:169 execute_python_code

set_mesh_collision always registered (simple shapes, complex); auto convex and generate_collision need GeometryScripting.

Evidence
Fracture / Dataflow graphs

No GeometryCollection, Fracture or Dataflow asset ops found; only generic python.execute exists.

Evidence

apply_mesh_fracture only plane cuts into separate StaticMeshes, no GeometryCollection; Dataflow via Epic toolset, 5.8 only.

Evidence

DataflowAgent toolset: create graph, add/connect nodes, variables, GeometryCollection assets, templates.

Evidence
  • Engine/Plugins/Experimental/Toolsets/DataflowAgent/Source/DataflowAgent/Private/DataflowAgentToolset.h:33 CreateGraph, :81 AddNode, :138 ConnectNodePins, :260 CreateDataflowCompatibleAsset
  • DataflowAgent.uplugin:26 depends on GeometryCollectionPlugin; listed in AllToolsets.uplugin

No fracture or Dataflow ops; setup_destructible_mesh only adds an actor tag; fracture unchecked in Roadmap.

Evidence

Via Epic toolset: DataflowAgent graph authoring, not enabled by default; VibeUE has no fracture code.

Evidence
  • rg fracture|GeometryCollection|Dataflow in Source: no hits
  • docs/Toolset-Comparison-and-Consolidation.md:167 lists DataflowAgent as not enabled
  • Engine/Plugins/Experimental/Toolsets/DataflowAgent/Source/DataflowAgent/Private/DataflowAgentToolset.h:33 CreateGraph

Only create_fragments plane slicing into mesh handles (GeometryScripting); no GeometryCollection or Dataflow.

Evidence
Batch static-mesh geometry defect audit

geometry.audit_static_meshes sweeps a folder for inverted, open, non-manifold, degenerate meshes.

Evidence

measure_mesh_geometry and check_uvs report manifold, holes, UV faults but take one asset per call, no batch audit.

Evidence

No batch defect audit; only per mesh get_triangle_count, get_vertex_count, get_bounds queries.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:71 get_triangle_count, :86 get_vertex_count, :101 get_bounds

No batch mesh defect audit; get_mesh_info is per mesh, repair ops modify; audit_placement checks actor placement only.

Evidence

Per mesh UV health only (lightmap overlaps, texel density); no batch geometry defect scan.

Evidence

batch_validate: SQL prefilter on mesh catalog then deep load; flags collision, LODs, degenerate geo, pivot.

Evidence
Static mesh LOD generation and Nanite toggle

asset.generate_lods, geometry.set_lod_settings; asset.nanite_rebuild_mesh toggles Nanite per mesh.

Evidence

Own set_nanite_settings toggles Nanite; LOD generation only epic_generate_lods via wrapped Epic toolset, UE 5.8 only.

Evidence

generate_lods, remove_lods, get/set_lod_thresholds, is_nanite_enabled, set_nanite_enabled.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:223 generate_lods, :188 set_lod_thresholds, :317 set_nanite_enabled

No own LOD or Nanite tool; Epic StaticMeshTools only reads LOD counts; possible via execute_python_code.

Evidence

auto_generate_lods writes LODs (GeometryScripting); set_lod_screen_sizes; Nanite only read, no toggle.

Evidence
Customizable (Mutable) character graph authoring

No CustomizableObject or Mutable references in Source or wiki; only generic python.execute.

Evidence
  • Grep CustomizableObject|MutableTools over Plugins/PinWright Source, Content/Python, docs/wiki-src: no hits
  • Saved/PinWright/wiki has no mutable or customizable pages

create_customizable_object and compile_customizable_object; nodes via generic add_graph_node, connect_graph_pins.

Evidence

Searched Toolsets for Customizable and Mutable; no Mutable toolset or tools found.

Evidence
  • grep -i Customizable|Mutable over Engine/Plugins/Experimental/Toolsets: only unrelated C++ GetMutable accessor hits

Mutable authoring only planned in Roadmap 36.3; no CustomizableObject code in plugin or server.

Evidence

CustomizableObjectService creates CO assets, adds and wires nodes, compiles; needs Mutable plugin.

Evidence

Searched CustomizableObject and Mutable across Source, Docs, CHANGELOG; no Mutable support found.

Evidence
  • grep -i CustomizableObject over Source returned no matches; Mutable hits are unrelated accessors (CHANGELOG.md:50)
Procedural mesh modeling (primitives, sweeps, lofts)Generates parametric primitives and sweeps, lofts or revolves profiles along splines.

Parametric blockout primitives (stairs, arches) (Yes): geometry.create_stairs, create_spiral_stairs, create_arch, create_ramp primitives.

Spline-driven sweep, loft and revolve (Yes): geometry.sweep along a spline, geometry.loft, geometry.revolve, geometry.extrude_along_spline.

Parametric blockout primitives (stairs, arches) (Partial): Only cube, cone, cylinder, sphere components via wrapped Epic toolset, UE 5.8 only; no stairs or arches.

Spline-driven sweep, loft and revolve (No): Searched for sweep, loft, revolve, AppendSweepPolygon, AppendRevolve; only spline point read and write actions.

Parametric blockout primitives (stairs, arches) (Partial): add_cube, add_sphere, add_cylinder, add_cone components only; no stairs or arches.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/primitive.py:22 add_cube, :54 add_sphere, :78 add_cylinder, :106 add_cone

Spline-driven sweep, loft and revolve (No): No sweep, loft or revolve; grep found only PCG DrawSpline and PCG Spawn Spline Mesh node names.

  • Engine/Plugins/Experimental/Toolsets/PCGToolset/Source/PCGToolset/Public/PCGToolset.h:378 DrawSpline
  • PCGToolsetLibraryCore.h:101 Spawn Spline Mesh node list

Parametric blockout primitives (stairs, arches) (No): Searched stairs, arch, blockout primitives; Epic PrimitiveTools only add cube, sphere, cylinder, cone.

Spline-driven sweep, loft and revolve (No): Searched sweep, loft, revolve, spline mesh; blockout roads become landscape splines only.

Parametric blockout primitives (stairs, arches) (Partial): create_parametric_mesh has stairs, ramp, pillar, door frame; no arches; needs GeometryScripting and source build.

Spline-driven sweep, loft and revolve (Partial): Only circular pipe sweep along points and spline mesh segment placement; no loft or revolve.

Audio and UI

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Widget Blueprint CRUD

create_widget_blueprint, add, set, describe, remove_widget, rename, reparent, duplicate.

Evidence

create, read_tree, add_widget, remove_widget, move_widget, set_property, set_style, list, bulk_set_properties.

Evidence

UMGToolSet: CreateWidgetBlueprint, AddWidget, GetWidgets, Move/Remove/RenameWidget, CompileWidgetBlueprint.

Evidence
  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h:287 CreateWidgetBlueprint
  • UMGToolSet.h:300 AddWidget
  • UMGToolSet.h:374 RemoveWidget
  • UMGToolSet.h:541 CompileWidgetBlueprint

WidgetService edits tree and properties; asset create only via Python factory script.

Evidence

ui.create_widget_blueprint, add_widget, remove_widget, rename_widget, move_widget, get_widget_tree, set_widget_property.

Evidence
UMG animation CRUD

Create/delete animations, add tracks and keyframes, JSON export/import of animation tracks.

Evidence

create/delete/get animation, add/remove track, add/remove key and event key, bind animation events.

Evidence

No WidgetAnimation tools in UMGToolSet; sequencer.py tools accept only LevelSequence.

Evidence
  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h (no animation UFUNCTION)
  • Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:27 create_level_sequence

List, create, remove animations, add tracks and keyframes.

Evidence

ui.create_animation, add_animation_keyframe, list_animations, get_animation_details, remove_animation.

Evidence
MVVM bindings

Searched Source, Content, wiki-src and wiki for mvvm/viewmodel; only Niagara view model hits.

Evidence
  • grep -i mvvm|viewmodel over Plugins/PinWright/Source, docs/wiki-src, Saved/PinWright/wiki: Niagara files only

No MVVM action; only via gated execute_python calling the BlueprintCallable MVVMEditorSubsystem.

Evidence
  • src/tools/editor.ts:126-129 (execute_python, gated last resort)
  • grep -i 'mvvm|viewmodel' over src, plugin, docs: only Niagara/Sequencer view models
  • Engine/Plugins/Runtime/ModelViewViewModel/Source/ModelViewViewModelEditor/Public/MVVMEditorSubsystem.h:40

MVVMToolset: CreateViewModel, AddViewModelToWidget, CreateViewBinding; separate plugin, not in AllToolsets.

Evidence
  • Toolsets/MVVMToolset/Source/MVVMToolset/Private/MVVMToolset/MVVMToolset.h:43 CreateViewModel
  • MVVMToolset.h:123 CreateViewBinding
  • Toolsets/AllToolsets/AllToolsets.uplugin (MVVMToolset absent)

Searched MVVM and ViewModel in plugin and src; hits only in Niagara view models, no UMG MVVM.

Evidence
  • grep -iE 'MVVM|ViewModel' plugins/McpAutomationBridge/Source src excluding Niagara: empty

List/add/remove ViewModels and ViewModel bindings with binding modes.

Evidence

Searched MVVM and ViewModel across Source; only Niagara editor ViewModel includes, no MVVM binding actions.

Evidence
Audio PCM decode

SoundWave PCM decode ships but feeds only analysis, granular and export checks; no verb returns decoded samples.

Evidence

extract_pcm decodes a SoundWave to 16 bit interleaved PCM returned as base64.

Evidence

No decode tool; MCP can wrap a USoundWave return as audio content but no shipped tool returns one.

Evidence
  • ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolToolUtils.cpp:34 USoundWave result type
  • ModelContextProtocolEngineToolResults.cpp:56 MakeAudioResult

Searched RawPCMData, GetImportedSoundWaveData, RawData.Lock; get_audio_info returns duration, rate, channels.

Evidence
  • grep -iE 'RawPCMData|ImportedSoundWave|RawData.Lock' plugins/McpAutomationBridge/Source src: empty

Searched for PCM, RawPCMData, decode; SoundWave info returns duration, rate, channels only.

Evidence

Searched RawPCM, DecodeCompressed, ImportedSoundWave, GetPCM; get_sound_wave_info returns metadata only.

Evidence
  • grep RawPCM|DecodeCompressed|ImportedSoundWave|GetPCM Source/ (no hits)
Extract widget subtree

export_xml/describe take widgetName for subtree export, widget.duplicate copies subtrees; no extract to new WBP op.

Evidence

extract_subtree lifts a designer subtree into a new WBP via the UMG clipboard serializer, dryRun default.

Evidence

GetWidgetDescription reads a subtree from StartWidget as text; no extract into a new widget asset.

Evidence
  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h:442 GetWidgetDescription

Searched extract_widget and subtree ops; get_widget_info lists the whole tree flat, no subtree extraction.

Evidence

Searched for subtree extract or convert to user widget: not found; only reparent and remove.

Evidence

Searched subtree/extract actions; dump_ui_spec takes whole WBP only, no extract to new WBP.

Evidence
Widget tree as markup (export/import)

widget.export_xml and widget.import_xml round trip the tree as XML markup.

Evidence

Export only: read_tree JSON, epic_get_widget_description text dump (UE 5.8); no markup import found.

Evidence

GetWidgetDescription exports an indented text dump with props; no import from markup.

Evidence
  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h:431 format comment
  • UMGToolSet.h:442 GetWidgetDescription

get_widget_info exports tree as JSON (class, parent, slot, text); no markup import or round trip.

Evidence

GetWidgetSnapshot exports tree, slots, properties as structs; no markup format or import.

Evidence

ui.dump_ui_spec exports JSON UISpec; ui.build_ui_from_spec rebuilds or patches the WBP from it.

Evidence
Widget preview capture without PIE

widget.screenshot_designer captures the Widget Designer preview to PNG without PIE.

Evidence

No widget renderer; capture_screenshot target=window of an open designer, or epic_screenshot (UE 5.8 only).

Evidence

CaptureAssetImage renders an asset thumbnail; Slate Screenshot of an open designer tab.

Evidence
  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:216 CaptureAssetImage
  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:119 Screenshot

CapturePreview renders the WBP offscreen with FWidgetRenderer to a PNG.

Evidence

editor.capture_scene_preview with asset_type widget renders a WBP via FWidgetRenderer.

Evidence
Widget tree refactors (wrap, change class)

widget.wrap wraps in a new panel; widget.replace_class swaps class keeping children and slot.

Evidence

Native wrap_root only; wrap any and change class via wrapped Epic toolset, UE 5.8 only.

Evidence

WrapWidgets and ReplaceWidgetWithTemplate (change class, keeps bindings), ReplaceWidgetWithChild.

Evidence
  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h:426 WrapWidgets
  • UMGToolSet.h:506 ReplaceWidgetWithTemplate
  • UMGToolSet.h:530 ReplaceWidgetWithChild

reparent_widget moves a widget to another panel; no wrap or change widget class op.

Evidence

ReparentWidget moves a widget to another panel; no wrap or change class op.

Evidence

Class change only for Button/TextBlock/Border to CommonUI and reparent_widget_root; no generic wrap.

Evidence
Wait-for and assert on live UI

drive.wait_for and drive.expect assert conditions against the live UI surface.

Evidence

epic_wait_for checks text present or gone once, no blocking wait; via wrapped Epic toolset, UE 5.8 only.

Evidence

Slate Inspector WaitFor checks text present or gone; non blocking, caller polls.

Evidence
  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:175 WaitFor

Searched catalog and handlers for wait, assert, expect, poll UI actions; none.

Evidence
  • grep action: '*wait*|*assert*|*expect*' src/tools/catalog: empty

PIE scenarios offer fixed waits and generic Python or log asserts; no widget specific wait.

Evidence

Searched ui and editor action lists for wait or assert on live widgets; PIE smoke samples anim vars only.

Evidence
MetaSound / SoundCue graph as text

decompile_metasound emits MSIR text; decompile_sound_cue emits SCIR text.

Evidence

JSON readback (metasound_read_document, cue_get_graph) and JSON spec authoring; no text IR.

Evidence

No sound graph text export; grep SoundCue/MetaSound across Toolsets found nothing.

Evidence
  • Engine/Plugins/Experimental/Toolsets (rg: no hits)

get_audio_info returns SoundCue node count and root name only; no MetaSound or cue graph dump.

Evidence

Structured node and connection lists for both graph types; no text format or import.

Evidence

get_sound_cue_graph and get_metasound_graph return JSON; build_*_from_spec import JSON specs.

Evidence
Level acoustics and sound propagation analysis

Searched wiki for acoustic, propagation, occlusion analysis; only reverb volume creation exists.

Evidence

Searched acoustics, propagation, reverb analysis; only AudioVolume placement exists, no analysis.

Evidence

No acoustics or propagation analysis; searched Toolsets for sound, audio, occlusion.

Evidence
  • Engine/Plugins/Experimental/Toolsets (rg -i sound|audio|occlusion)

Only creates audio and reverb volumes; no acoustics or propagation analysis found.

Evidence

Searched for acoustics, occlusion, reverb volume, propagation: not found.

Evidence
  • grep Occlusion|Acoustic over Source: only material AmbientOcclusion hits

mesh.analyze_room_acoustics RT60 and mesh.analyze_sound_propagation occlusion plus navmesh paths.

Evidence
SoundCue and MetaSound graph authoringBuilds and edits SoundCue and MetaSound graphs.

SoundCue graph authoring (Yes): Dedicated SoundCue ops: create_sound_cue, add_cue_node, connect_cue_nodes, set_cue_root.

MetaSound graph authoring (Yes): MetaSound create, add/remove nodes, connect, inputs/outputs/variables, interfaces, compile, validate.

SoundCue graph authoring (Yes): cue_author, create_cue, cue_add_node, cue_connect, cue_disconnect, cue_remove_node, cue_get_graph.

MetaSound graph authoring (Yes): metasound_author plus incremental add_node/connect/set_default/remove/rename, read_document and validate.

SoundCue graph authoring (No): No SoundCue tools; grep soundcue across Toolsets, ToolsetRegistry, MCP sources found none.

  • Engine/Plugins/Experimental/Toolsets (rg -i soundcue: no hits)

MetaSound graph authoring (No): No MetaSound tools; grep metasound across Toolsets and MCP sources found nothing.

  • Engine/Plugins/Experimental/Toolsets (rg -i metasound: no hits)

SoundCue graph authoring (Yes): manage_audio edit_sound_cue: create_sound_cue, add_cue_node, connect_cue_nodes on SoundCue graphs.

MetaSound graph authoring (Yes): edit_metasound: create_metasound, add input/output/node, connect nodes, set defaults, build.

SoundCue graph authoring (Yes): SoundCueService creates cues, adds 14 node types, connects, sets root and node properties.

MetaSound graph authoring (Yes): MetaSoundService adds nodes, connects pins, graph inputs/outputs, sets input defaults via builder.

SoundCue graph authoring (Yes): audio.add_sound_cue_node, connect_sound_cue_nodes, build_sound_cue_from_spec and related cue graph actions.

MetaSound graph authoring (Yes): audio.add_metasound_node, connect_metasound_nodes, add inputs/outputs/variables, build_metasound_from_spec.

Sound class, submix and mix routingReads and authors sound classes, submixes and mixes.

Sound routing read (Yes): describe_sound_class returns parentClass, outputSubmix, children; get_audio_info reads submix parent.

Submix / class / mix authoring (Yes): create_sound_submix, set_submix_parent, create_sound_class, set_class_parent, create_sound_mix, mix EQ.

Sound routing read (Yes): read_sound_routing reports class chain, submix chain, sends, attenuation, concurrency and problems.

Submix / class / mix authoring (Yes): create_submix, set_submix_parent, add_submix_effect, create_sound_class, set_sound_class_parent, create_sound_mix.

Sound routing read (Partial): No routing tool; only generic ObjectTools get_properties on a sound asset (class, submix sends).

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:66 get_properties

Submix / class / mix authoring (Partial): No submix/class/mix tools; only raw set_properties on existing assets, no create tool for these types.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

Sound routing read (Partial): get_audio_info returns SoundClass parent, cue attenuation path, mix modifier count; no submix send chain.

Submix / class / mix authoring (Yes): create_sound_class, set_class_parent, create_sound_mix, add_mix_modifier, configure_mix_eq, submix creation.

Sound routing read (Partial): Per cue read of sound class, attenuation and concurrency only; no submix or bus routing read.

Submix / class / mix authoring (Partial): Only assigns an existing SoundClass to a cue; class, submix, mix assets not authored.

Sound routing read (Yes): audio.get_submix_hierarchy, get_sound_class_hierarchy, get_submix_properties, find_audio_references.

Submix / class / mix authoring (Yes): audio.create_sound_submix, create_sound_class, create_sound_mix plus set_*_properties and set_sound_mix_settings.

Audio synthesis and offline renderGenerates sound effects and music, renders MetaSounds offline, and builds SoundWaves from samples.

Procedural sound effect synthesis (Yes): audio.synth.generate renders recipes; patch, variations, audition, export to USoundWave.

Procedural adaptive music stems (Yes): audio.music.render_stems renders seamless loop stems; build_interactive makes a layered MetaSound.

Offline MetaSound render to PCM (Yes): audio.synth.render_metasound renders a MetaSound Source offline to PCM and measures it.

SoundWave from raw PCM samples (Yes): audio.authoring.create_sound_wave_from_pcm builds a USoundWave from float PCM and verifies it.

Procedural sound effect synthesis (No): Searched synthesis, procedural sound; audio tool only authors graphs and imports files.

Procedural adaptive music stems (No): Searched music, stems, adaptive in audio handlers and tools; no music generation action.

Offline MetaSound render to PCM (No): Searched offline render, NonRealtime, render_metasound; metasound_build only saves the asset.

SoundWave from raw PCM samples (No): import_audio takes WAV/OGG/FLAC files only; searched from_pcm, RawPCM, create_sound_wave: none.

Procedural sound effect synthesis (No): No sound synthesis tools; searched Toolsets for sound, audio, synth.

  • Engine/Plugins/Experimental/Toolsets (rg -i sound|audio)

Procedural adaptive music stems (No): No music or stem generation tools; searched Toolsets for sound, audio, music.

  • Engine/Plugins/Experimental/Toolsets (rg -i sound|audio)

Offline MetaSound render to PCM (No): No MetaSound render tool; grep MetaSound across Toolsets found nothing.

  • Engine/Plugins/Experimental/Toolsets (rg -i metasound: no hits)

SoundWave from raw PCM samples (No): No PCM to SoundWave tool; import_asset needs a file on disk and write_file writes text only.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:22 import_asset
  • asset.py:526 write_file

Procedural sound effect synthesis (No): No synthesis tool; only manual MetaSound node authoring (oscillator, sine node types).

Procedural adaptive music stems (No): Searched music, stem, adaptive in audio handlers and catalog; not found.

Offline MetaSound render to PCM (No): Searched OfflineRender, MetasoundGenerator; build_metasound applies a batch of graph edits, no PCM output.

SoundWave from raw PCM samples (No): Searched NewObject<USoundWave, USoundWaveProcedural, raw sample import; not found.

  • grep 'NewObject<USoundWave|USoundWaveProcedural' plugins/McpAutomationBridge/Source: empty

Procedural sound effect synthesis (Partial): Only by hand building MetaSound oscillator graphs; no synthesis recipe op.

Procedural adaptive music stems (No): Searched for music, stems, adaptive, Quartz: not found.

  • grep Quartz|stem over Source and Content/Skills: no music code

Offline MetaSound render to PCM (No): Searched for offline render, bounce, PCM output from MetaSound: not found.

SoundWave from raw PCM samples (No): ImportSoundWave imports an audio file from disk only; no raw PCM sample input.

Procedural sound effect synthesis (Partial): audio.create_synthesized_tone builds Osc Filter ADSR MetaSound; create_test_wave makes a sine wave.

Procedural adaptive music stems (No): Searched music, stem in MonolithAudio; create_interactive_metasound crossfades existing waves only.

Offline MetaSound render to PCM (No): Searched render, PCM, MetasoundGenerator in audio actions; MetaSound actions author and inspect only.

  • Registered audio.* action list in Source/MonolithAudio

SoundWave from raw PCM samples (Partial): audio.create_test_wave synthesizes a 16 bit sine SoundWave; arbitrary PCM input not accepted.

Audio measurement and comparisonMeasures loudness and spectrum, compares against a reference, and audits folders for audio defects.

Objective audio measurement (loudness, spectrum) (Yes): audio.analysis.analyze reports BS.1770 loudness, spectral descriptors, pitch, stereo, plots.

Reference vs candidate sound comparison (Yes): audio.analysis.compare reports signed reference vs candidate deltas with diagnosis tokens.

Sound decomposition and recipe fitting (Yes): audio.analysis.decompose splits transients, partials, residual; to_recipe fits a synth recipe.

Folder-wide audio defect audit (Yes): audio.analysis.audit_folder flags clipping, silence, DC offset, loudness and format outliers.

Objective audio measurement (loudness, spectrum) (No): Searched loudness, LUFS, spectrum, FFT; only raw PCM extract; loudness hits are AI noise events.

Reference vs candidate sound comparison (No): Searched compare, reference, similarity in audio tool; no sound comparison action.

Sound decomposition and recipe fitting (No): Searched decomposition, recipe fitting; recipe hits are the ue-mcp-recipes flow plugin, not audio.

Folder-wide audio defect audit (Partial): asset.bulk_read_properties with predicates over a sound folder flags setting gaps; no signal defect checks.

Objective audio measurement (loudness, spectrum) (No): No loudness or spectrum analysis; searched Toolsets and MCP sources for audio tools.

  • Engine/Plugins/Experimental/Toolsets (rg -i audio)

Reference vs candidate sound comparison (No): No sound comparison tool; searched Toolsets and MCP sources for audio tools.

  • Engine/Plugins/Experimental/Toolsets (rg -i audio)

Sound decomposition and recipe fitting (No): No sound decomposition or fitting tool; searched Toolsets for sound and audio.

  • Engine/Plugins/Experimental/Toolsets (rg -i sound|audio)

Folder-wide audio defect audit (No): No audio audit tool; searched Toolsets for sound and audio.

  • Engine/Plugins/Experimental/Toolsets (rg -i sound|audio)

Objective audio measurement (loudness, spectrum) (No): enable_audio_analysis only logs and echoes settings; no loudness or spectrum values returned.

Reference vs candidate sound comparison (No): Searched compare, reference, similarity in audio domains; not found.

Sound decomposition and recipe fitting (No): Searched decompose, recipe, fit in audio domains; not found.

Folder-wide audio defect audit (No): No audio folder audit; validate_assets is generic asset validation, not audio defects.

Objective audio measurement (loudness, spectrum) (No): Searched for Loudness, LUFS, Spectrum, FFT: no audio analysis code.

  • grep Loudness|FFT over Source: no hits

Reference vs candidate sound comparison (No): Searched for sound compare or similarity functions: not found.

Sound decomposition and recipe fitting (No): Searched for decomposition or recipe fitting: not found.

Folder-wide audio defect audit (No): Searched for audio audit, clipping, silence checks: not found.

Objective audio measurement (loudness, spectrum) (No): Searched loudness, LUFS, spectrum, FFT, RMS; loudness hits are AI noise event params only.

  • grep loudness|LUFS|spectrum|FFT|RMS Source/ (only AI perception loudness)

Reference vs candidate sound comparison (No): No sound comparison action found in registered audio.* action list.

  • Registered audio.* action list in Source/MonolithAudio

Sound decomposition and recipe fitting (No): No sound decomposition or recipe fitting action in registered audio.* action list.

  • Registered audio.* action list in Source/MonolithAudio

Folder-wide audio defect audit (Partial): Config lint only: find_unattenuated_sounds, find_sounds_without_class, find_unused_audio; no signal defects.

Live widget inspection and interaction in PIEFinds, inspects and clicks live widgets during play, including their bound delegates.

Spawn / inspect widget in PIE (Yes): ui.create_hud adds a WBP to the PIE viewport; widget.describe capture_source=live inspects it.

Runtime widget interaction + delegates (Yes): drive.click/type/key/hover/drag/scroll inject real input at live widget geometry; events_since journal.

Live widget delegate bindings (Partial): Live snapshot lists per node bindings and On* event bindings read from WBP metadata, not runtime invocation lists.

All live widget instances, per client (Partial): Live UMG roots selectable by root_index or instance_name; no per PIE client selector on drive or snapshot.

Spawn / inspect widget in PIE (Yes): add_to_viewport instantiates a WBP in live PIE; get_runtime and list_runtime inspect live widgets.

Runtime widget interaction + delegates (Yes): invoke_runtime_function clicks/sets Button, CheckBox, Slider, text, ComboBox and broadcasts the delegate.

Live widget delegate bindings (Partial): Host UserWidget delegates only, first match; isBound plus binding count guessed from commas, no targets.

All live widget instances, per client (Partial): list_runtime reads first PIE world only; inspect_runtime_instances picks one pieInstance, needs name/class filter.

Spawn / inspect widget in PIE (Partial): StartPIE plus Slate Inspector Snapshot of visible windows; no tool to spawn a UMG widget in PIE.

  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:365 StartPIE
  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:92 Snapshot

Runtime widget interaction + delegates (Partial): Slate Inspector Click/Type/Hover/Drag drive any Slate UI incl PIE viewport; no UMG delegate firing.

  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:129 Click
  • SlateInspectorToolset.h:142 Type

Live widget delegate bindings (No): No live delegate listing; Slate Inspector has no delegate API, UMG BindToEventProperty is design time.

  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h
  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h:411 BindToEventProperty

All live widget instances, per client (Partial): Snapshot walks all visible Slate windows; no UUserWidget instance list or per client grouping.

  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolsetSnapshotRenderer.cpp:161 GetAllVisibleWindowsOrdered

Spawn / inspect widget in PIE (Partial): widget_list inspects live PIE widgets; create_hud spawn handler exists but no catalog action routes to it.

Runtime widget interaction + delegates (Partial): widget_click broadcasts OnClicked, OnCheckStateChanged, OnValueChanged; Button, CheckBox, Slider only.

Live widget delegate bindings (No): Searched for live delegate binding readout (IsBound, invocation list); only authoring bind_on_clicked etc.

All live widget instances, per client (Partial): widget_list covers GEditor PlayWorld only, lists only Button/CheckBox/Slider children; no per-client view.

Spawn / inspect widget in PIE (Yes): SpawnWidgetInPIE, GetLiveProperty, RemoveWidgetFromPIE.

Runtime widget interaction + delegates (Partial): No click or delegate op; skill says call on_clicked.broadcast() via Python on PIE instance.

Live widget delegate bindings (No): BindEvent authors design time bindings only; no read of live delegate bindings found.

All live widget instances, per client (Partial): No live widget listing op; skill suggests Python ObjectIterator; no per client view.

Spawn / inspect widget in PIE (Partial): Only CommonUI push_to_activatable_stack spawns in PIE; generic editor.pie_get_object_properties reads objects.

Runtime widget interaction + delegates (Partial): ui.force_focus and CommonUI stack push/pop only; widget clicks need generic editor.pie_call_function.

Live widget delegate bindings (No): ui.get_widget_bindings and list_widget_events read WBP design data, not live delegate bindings.

All live widget instances, per client (No): Searched TObjectIterator<UUserWidget>, GetAllWidgetsOfClass; only CommonUI containers iterated in PIE.

UI audits (focus, accessibility, CommonUI)Checks focus navigation, accessibility and CommonUI setup.

UI focus/navigation audit (Partial): drive.observe focused flag, drive.input_state focused widget, drive.key injection; no audit op.

UI accessibility audit (No): Searched for accessibility audit; accessible text is used only as the drive element label.

CommonUI wiring audit (No): No CommonUI wiring audit exists; CommonUI support is only the runtime stack push, pop, list and get ops.

  • wiki page ui Availability: only ui.activatable_push/pop, ui.list_stack_widgets, ui.get_active_widget are CommonUI (runtime PIE stack ops)
  • Source/PinWrightCommonUI/Private/Handlers/UI/UiActivatableStackHandler.cpp and ActivatableLayerResolver.cpp: stack ops and layer-tag resolution only
  • Grep Source and Content for TriggeringInputAction|bIsBackHandler|InputActionData|CommonInputAction: no CommonUI hits (only Niagara bAutoActivate)
  • No audit/lint/validate page for widgets or CommonUI in the wiki; the audit pages cover asset, level, niagara, geometry, audio and skeleton
  • Content/Python: no commonui or activatable matches

UI focus/navigation audit (Yes): audit_focus_chain over the tree plus get_runtime_focus_path and set_runtime_focus in PIE.

UI accessibility audit (Yes): audit_accessibility checks min font size and min hit area from authored values only.

CommonUI wiring audit (Yes): audit_commonui checks plugin, viewport client, InputData, DesiredFocusWidget, action bar, styles.

UI focus/navigation audit (Partial): Snapshot marks the keyboard focused widget; no navigation rule audit tool.

  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolsetSnapshotRenderer.cpp:380 HasKeyboardFocus

UI accessibility audit (Partial): Snapshot is an accessibility style tree using GetAccessibleText; no audit or rule checks.

  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolsetSnapshotRenderer.cpp:337 GetAccessibleText

CommonUI wiring audit (No): No CommonUI tools; grep CommonUI/CommonActivatable across Toolsets and MCP found nothing.

  • Engine/Plugins/Experimental/Toolsets (rg -i commonui: no hits)

UI focus/navigation audit (No): Searched EUINavigation, navigation rules in UI code; widget_list only flags a focused widget.

UI accessibility audit (No): Searched accessib, AccessibleText, contrast in plugin and catalog; only code comments, no UI audit.

  • grep -i accessib plugins/McpAutomationBridge/Source: only comment in WidgetAuthoringAdvancedStyling.cpp:106

CommonUI wiring audit (No): Searched CommonUI, CommonActivatableWidget, CommonButton in plugin and src; no hits.

  • grep -E 'CommonUI|CommonActivatable|CommonButton' plugins/McpAutomationBridge/Source src: empty

UI focus/navigation audit (No): Searched for focus, navigation rules, SetFocus in widget code: no UI audit found.

  • grep Navigation|SetFocus|UserFocus hits only anim/input/blueprint services

UI accessibility audit (No): Searched for accessibility in widget code: no UI accessibility audit.

  • grep Accessib over Source: only unrelated comment hits

CommonUI wiring audit (No): Searched for CommonUI and CommonActivatableWidget: no hits.

  • grep CommonUI over Source and Content/Skills: none

UI focus/navigation audit (Yes): ui.audit_focus_chain static nav audit, ui.get_focus_path runtime Slate focus chain, dump_widget_navigation.

UI accessibility audit (Yes): ui.audit_accessibility checks small fonts, missing focus, navigation, tooltips on a WBP.

CommonUI wiring audit (Yes): ui.audit_commonui_widget per WBP lint and ui.export_commonui_report project wide.

Widget layout and binding diagnosticsExplains widget layout at runtime and checks C++ BindWidget contracts.

Runtime widget layout diagnostics (Partial): Live geometry, visibility, stale flags and NOT_PAINTED codes; no overlap or clipping checks.

BindWidget contract report (Partial): Rename/remove/reparent warn when a required BindWidget target breaks; no standalone contract report.

Runtime widget layout diagnostics (Yes): get_runtime with includeLayout: geometry, clipping, viewport overlap, diagnostics, capture deltas.

BindWidget contract report (Yes): get_bind_widget_contract lists BindWidget/Anim metadata and checks a WBP for missing or wrong type.

Runtime widget layout diagnostics (Partial): Snapshot lists per widget pos/size and disabled flags; hidden widgets skipped, no diagnostics.

  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolsetSnapshotRenderer.cpp:292
  • SlateInspectorToolsetSnapshotRenderer.cpp:186

BindWidget contract report (Partial): GetWidgets adds placeholders for unbound BindWidget props; CompileWidgetBlueprint reports BindWidget errors.

  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.cpp:832
  • UMGToolSet.cpp:1306

Runtime widget layout diagnostics (No): Searched CachedGeometry, GetDesiredSize, layout prepass in plugin; widget_list returns no geometry.

BindWidget contract report (No): Searched BindWidget in plugin and src; no hits.

  • grep BindWidget plugins/McpAutomationBridge/Source src: empty

Runtime widget layout diagnostics (No): Searched for CachedGeometry, DesiredSize, AbsolutePosition, layout diagnostics: not found.

BindWidget contract report (No): Validate checks root, duplicate names, orphans only; BindWidget appears only in skill text.

Runtime widget layout diagnostics (No): Searched CachedGeometry, TickSpaceGeometry, SlatePrepass, DesiredSize; no runtime layout action.

  • grep GetCachedGeometry|GetTickSpaceGeometry|SlatePrepass Source/MonolithUI Source/MonolithEditor (no hits)

BindWidget contract report (Partial): blueprint.get_variables include_bind_widgets lists BindWidget refs; no missing or type mismatch report.

UI element targeting (geometry, numbered marks)Resolves widget screen rectangles and marks them on screenshots so an agent can pick one.

Design-time widget geometry resolution (Yes): resolve_geometry on describe/export_xml measures an offscreen transient instance in an SVirtualWindow.

Numbered-mark UI screenshot for targeting (Yes): drive.observe attaches a Set-of-Mark screenshot with numbered marks on interactables.

Design-time widget geometry resolution (No): Searched SlatePrepass, ForceLayoutPrepass, WidgetRenderer, TakeWidget; GetDesiredSize used only on PIE widgets.

Numbered-mark UI screenshot for targeting (No): Searched set of mark, numbered, annotated screenshot; Epic Slate snapshot gives text refs, no marked image.

Design-time widget geometry resolution (No): UMGToolSet has no geometry or layout solve; searched Geometry/DesiredSize/Layout in UMGToolSet.

  • Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h
  • UMGToolSet.cpp (rg -i geometry|desiredsize|layout: no hits)

Numbered-mark UI screenshot for targeting (No): Screenshot returns a plain image; refs only in text Snapshot, no numbered overlay drawing found.

  • Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:119 Screenshot

Design-time widget geometry resolution (No): get_widget_slot_info reads slot anchors and alignment only; no resolved design-time geometry found.

Numbered-mark UI screenshot for targeting (No): Screenshot modes are editor_viewport, game_viewport, full_editor_window; no numbered widget marks.

Design-time widget geometry resolution (No): No design time geometry resolver; snapshot returns slot data only, preview returns an image.

Numbered-mark UI screenshot for targeting (No): Screenshot tool returns plain PNG; searched for mark or annotation overlay: none.

Design-time widget geometry resolution (No): Searched geometry, DesiredSize, layout resolve in MonolithUI; only internal use in shadow helper, no action.

Numbered-mark UI screenshot for targeting (No): Searched capture actions; no marked or numbered UI screenshot, editor captures are asset previews.

Sound playback, attenuation and spatializationPlays sounds and ambients and authors attenuation, spatialization, occlusion and concurrency.

Play sound / ambient (Yes): play_sound_2d, play_sound_at_location, play_sound_attached, create_ambient_sound, fades.

Attenuation, spatialization, occlusion, concurrency authoring (Yes): Attenuation assets, distance, spatialization, occlusion, reverb send, and concurrency authoring ops.

Play sound / ambient (Yes): play_at_location calls UGameplayStatics::PlaySoundAtLocation; spawn_ambient places an AmbientSound actor.

Attenuation, spatialization, occlusion, concurrency authoring (Yes): create_attenuation with spatialize and enableOcclusion, create_concurrency, set_sound_attenuation/concurrency.

Play sound / ambient (Partial): No play sound tool; generic add_to_scene_from_asset can place a sound asset as an ambient actor.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:127 add_to_scene_from_asset

Attenuation, spatialization, occlusion, concurrency authoring (Partial): No attenuation or concurrency tools; only raw set_properties on existing assets or components.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties

Play sound / ambient (Partial): No play or ambient sound op in VibeUE; only via Python GameplayStatics or spawning actors.

  • grep PlaySound|AudioComponent|AmbientSound|PlayPreview over Source and Content/Skills: only anim notify hits
  • README.md:97 execute_python_code escape hatch

Attenuation, spatialization, occlusion, concurrency authoring (Partial): Assigns attenuation and concurrency assets to cues, adds attenuation node; no asset authoring.

Play sound / ambient (Partial): audio.preview_sound plays an asset in editor; ambient actor only via generic mesh.spawn_actor by class.

Attenuation, spatialization, occlusion, concurrency authoring (Yes): create_sound_attenuation and set_attenuation_settings take FSoundAttenuationSettings; concurrency CRUD too.

Workflow infrastructure

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Idempotent operations (safe retry)

create_* verbs update an existing same class asset in place so reruns are idempotent; subset of verbs.

Evidence

Natural key plus onConflict skip|update|error convention (49 handler files); demo steps and execute_command exempt.

Evidence

No general idempotency layer; a few Blueprint tools are documented as idempotent (add function graph, add event).

Evidence
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:291
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:330

Gateway idempotencyKey replay ledger (TS and native) keyed per capability; not per handler state checks.

Evidence

Idempotency in selected handlers (BT EnsureGraph, EnvQuery, Fab import) and bulk resume skip; no contract.

Evidence

idempotentHint MCP annotation on a few actions; skip_existing/upsert params on some; no general guarantee.

Evidence
Domain knowledge / skills

Embedded wiki (about 1,500 generated pages, 10 workflow guides) served by call(); no skill packs.

Evidence

6 SKILL.md guides installed to .claude/skills by init (Claude Code only); plugins add per-category knowledge md.

Evidence

About 21 AgentSkills: 4 Editor, 7 Niagara, 8 PCG assets, Dataflow and ChaosCloth C++ skills.

Evidence
  • ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/AgentSkill.h:29 UAgentSkill
  • Toolsets/EditorToolset/Content/Python/editor_toolset/skills/
  • Toolsets/NiagaraToolsets/Content/Python/skills/
  • Toolsets/PCGToolset/Content/Skills/

5 static knowledge topics via ue://knowledge resource plus 6 MCP workflow prompts; no skill files.

Evidence

39 markdown skill packs (90 docs) plus native UPerformanceTriageSkill, served via Epic AgentSkill.

Evidence

18 Claude skill files in Skills/ plus monolith.guide action serving MONOLITH_GUIDE.md sections.

Evidence
Custom code tasks in workflows

No workflow tasks; python.execute runs arbitrary scripts, which docs use as rebuildable build scripts.

Evidence

class_path to a project .ts/.js class extending UeMcpTask; can call other tasks and wrap built-ins.

Evidence

Restricted Python via execute_tool_script glues tool calls, but it is not a workflow task.

Evidence
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:880 ProgrammaticToolset

No workflow code tasks; standalone system_control execute_python action exists outside any workflow.

Evidence

Scenario python_assert and python_assert_number evaluate a Python expression as a step.

Evidence

editor.run_python runs arbitrary Python as a standalone action; no workflow tasks.

Evidence
Skill docs checked against live tools

No skills; wiki regenerates from live handler registry and a test lints overlays against served slugs.

Evidence

checkSkills flags category(action=...) refs absent from the action surface; CLI plugin check-skills.

Evidence

ListSkills/GetSkills/CreateSkill do no check of skill text against registered tools.

Evidence
  • ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/AgentSkill.cpp:26

prompts/get refuses a prompt whose capability id is missing from the registry; tests assert it too; no skills.

Evidence

check_skills_consistency.py checks dispatcher routes vs packs on disk, not vs live API.

Evidence

lint_agent_tools.py checks .claude/agents tool allowlists, not skills against the live registry.

Evidence
Skill install/list/get via tools

call() lists namespaces and call(path) returns any page; nothing to install, no skill packs.

Evidence

Own skills install only via CLI init/deploy; list/get/create via wrapped Epic toolset, UE 5.8 only.

Evidence

AICallable ListSkills, GetSkills, CreateSkill and UpdateSkill in the AgentSkill toolset.

Evidence
  • ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/AgentSkill.h:70 ListSkills
  • ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/AgentSkill.h:90 CreateSkill

No skill tools; prompts are listed via MCP prompts/list and prompts/get, no install.

Evidence

List/get via Epic AgentSkillToolset ListSkills/GetSkills (via Epic toolset); no install tool.

Evidence

monolith.guide section skills_map lists skills and paths; install is manual copy to ~/.claude/skills.

Evidence
Built-in reference workflows

10 task workflow guide pages (level building, profiling, flythrough...); documentation, not executable.

Evidence

Ships niagara_fire, beacon, texture_bomb, neon_shrine and neon_shrine_cleanup flows.

Evidence

No workflow files ship; skills are instruction text only, e.g. default_outdoor_lighting.

Evidence
  • Toolsets/EditorToolset/Content/Python/editor_toolset/skills/default_outdoor_lighting.py:254

6 versioned workflow prompts (inspect-fix, asset-import, level-build...) are guidance only, not executable.

Evidence

No runnable workflow files shipped; skill workflows.md files are prose recipes.

Evidence

monolith.guide recipes section gives prose cross-namespace recipes; not executable workflows.

Evidence
Declarative multi-step workflowsMulti-step workflows defined in a file (retry, conditions, nesting, dry-run, parameters, shell steps), runnable over HTTP with a live event stream.

YAML flow engine (No): No workflow engine or YAML runner; searched Source and wiki for yaml, workflow runner. workflows.md is docs only.

Every action usable as a workflow step (No): No workflow step model; each RPC is called individually via call(method,args).

Nested workflows (No): No workflow engine, so no nested workflows; searched wiki and Source for workflow runner.

Step output references (No): No step output reference syntax; searched wiki for step refs and templating.

Runtime workflow parameters (No): No workflow parameters; guide pages describe manual call sequences only.

Per-step retry with backoff/filter (No): No retry engine; errors only carry a retryable flag (EDITOR_NOT_READY) for the client to act on.

Expected-failure steps (No): No expected failure step marker; searched wiki and Source for workflow step options.

Workflow lifecycle hooks (No): No workflow lifecycle hooks; searched Source for hook, before/after step callbacks.

Conditional steps (No): No conditional steps; no workflow engine found in Source or wiki.

Workflow dry-run / execution plan (No): No workflow engine or plan preview; workflows are doc pages. Only 2 single verbs have dry run flags.

Skip steps at call time (No): No workflow steps to skip; no workflow engine in Source or wiki.

Shell command steps (Partial): No workflow step engine or shell RPC; shell reachable only via python.execute (subprocess) escape hatch.

Live workflow event stream (SSE) (Partial): No workflow events; SSE streams progress frames for long jobs and python.execute scripts.

HTTP API to run workflows (No): No workflows to run; plain HTTP JSON gateway on the editor port executes single RPCs only.

YAML flow engine (Yes): ue-mcp.yml flows run by flow(run/plan/list); engine is the external @db-lyon/flowkit dependency.

Every action usable as a workflow step (Yes): Every tool action registered as a category.action flow task, plus a shell task.

Nested workflows (Yes): flow: step type runs a nested flow; nested scope cannot reference the parent's step outputs.

Step output references (Yes): ${steps.<id|task>.<path>} into prior step result.data; unresolved reference fails the step.

Runtime workflow parameters (Yes): flow(run, params) merged into every step at top priority; no per-step targeting or declared param schema.

Per-step retry with backoff/filter (Yes): retries, fixed retryDelay, retryOn substring filter; no exponential backoff documented.

Expected-failure steps (Yes): ignore_failure per step; step recorded FAILED (ignored) and run continues; main steps only.

Workflow lifecycle hooks (Yes): on_start, on_success, on_failure, finally hook step lists; hook errors do not change the outcome.

Conditional steps (Yes): Per-step when: expression from flowkit runner; listed in tool text but has no docs section or example.

Workflow dry-run / execution plan (Yes): flow(plan) lists steps with task, type and skip status; does not validate options or references.

Skip steps at call time (Yes): flow(run, skip=[names or step numbers]).

Shell command steps (Yes): Built-in shell task (command, cwd, timeout), ShellTask from flowkit.

Live workflow event stream (SSE) (Yes): GET /flows/events SSE with runId filter; HTTP server opt-in, bearer token; step events omit step data.

HTTP API to run workflows (Yes): Loopback HTTP: GET /flows, /flows/:name/plan, POST /flows/:name/run; off by default.

YAML flow engine (No): No workflow engine or YAML; searched workflow/yaml. Only execute_tool_script batches tools in a Python script.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script

Every action usable as a workflow step (Partial): No workflows, but a sandboxed execute_tool_script can call any registered tool by full name.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:295 _ToolExecutor.__call__

Nested workflows (No): No workflow composition; searched workflow/include/subflow. Scripts are single inline run() functions.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906

Step output references (Partial): Only through execute_tool_script, where tool results are Python values passed between calls.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:265 _execute_tool

Runtime workflow parameters (No): execute_tool_script takes only the script text; no parameter binding or stored workflows found.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906

Per-step retry with backoff/filter (Partial): No retry feature; only hand written loops in the tool script sandbox, which allows time and try/except.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:52 _SUPPORTED_MODULES

Expected-failure steps (Partial): No expected failure step type; tool errors raise RuntimeError that a script can catch.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:283

Workflow lifecycle hooks (No): No workflow lifecycle hooks; searched hook/on_start/on_finish/workflow.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py

Conditional steps (Partial): Only as Python if statements inside execute_tool_script; no declarative condition field.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906

Workflow dry-run / execution plan (No): No dry run or execution plan; searched dry_run/dryrun/validate_only/plan across MCP and Toolsets.

  • ModelContextProtocol/Source
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py

Skip steps at call time (No): No step skipping; there are no named workflow steps to skip.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py

Shell command steps (No): No shell steps; searched subprocess/CreateProc/ExecProcess. Sandbox allows only json, math, datetime, copy, re, time.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:52 _SUPPORTED_MODULES

Live workflow event stream (SSE) (No): SSE is used only for MCP tool call streams and list_changed notices; there is no workflow event stream.

  • ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:1077

HTTP API to run workflows (No): HTTP endpoint serves only MCP JSON-RPC; no workflow run API found.

  • ModelContextProtocol/Source/ModelContextProtocolEngine/Public/ModelContextProtocolSettings.h:24 ServerUrlPath

YAML flow engine (No): No workflow engine or YAML runner; searched src and plugin for workflow/yaml/flow. Gateway runs one action per call.

Every action usable as a workflow step (No): No workflow engine, so actions cannot be composed as steps; each execute runs a single capability.

Nested workflows (No): No workflow engine; searched for nested or sub workflow support and found none.

Step output references (No): No step output references; workflow prompts are static step lists with no data passing.

Runtime workflow parameters (No): No executable workflows; only MCP prompt arguments that fill guidance text for the 6 prompts.

Per-step retry with backoff/filter (No): No per-step retry; searched for workflow retry/backoff. Only bridge reconnect backoff exists.

Expected-failure steps (No): No expected-failure step concept; no workflow engine found in src or plugin.

Workflow lifecycle hooks (No): No workflow lifecycle hooks; searched for before/after/onFailure hooks, none found.

Conditional steps (No): No conditional steps; no workflow engine. expectedRevisions only refuses a single stale call.

Workflow dry-run / execution plan (No): No dry run: options.preview is refused with UNSUPPORTED_PREVIEW for every capability before dispatch.

Skip steps at call time (No): No workflow execution, so no call-time step skipping; searched gateway options.

Shell command steps (No): No workflow shell steps; child_process used only to spawn UBT in the pipeline build action.

Live workflow event stream (SSE) (No): No workflow event stream; native /mcp HTTP/SSE carries only MCP resource notifications.

HTTP API to run workflows (No): No workflows to run; native /mcp HTTP endpoint executes single gateway actions only.

YAML flow engine (Partial): No YAML engine; RunScenario runs JSON PIE step lists with 11 fixed actions.

Every action usable as a workflow step (No): Scenario steps limited to 11 fixed actions; bulk plans to 5 ops; tools not usable as steps.

Nested workflows (No): Searched scenario and bulk runners for nested or sub workflow steps; none.

Step output references (No): Searched scenario step parsing for references to prior step outputs; none.

Runtime workflow parameters (No): No parameterized workflow definitions; scenario and bulk take a full JSON spec per call.

Per-step retry with backoff/filter (No): Searched for retry/backoff in workflow code; only wait_for_pie timeout_seconds.

Expected-failure steps (No): Searched scenario steps for expect-fail flags; assert_log not_contains is only a log check.

Workflow lifecycle hooks (Partial): Built-in only: scenario always stops PIE on every terminal path; no user hooks.

Conditional steps (No): Searched scenario and bulk step schemas for if/when conditions; none.

Workflow dry-run / execution plan (Partial): RunBulkMaintenance defaults to dry-run with per target would-change report; not for scenarios.

Skip steps at call time (No): No skip list parameter; bulk resume only auto skips targets that already succeeded.

Shell command steps (No): No shell step; scenario console_command runs UE console commands only.

Live workflow event stream (SSE) (No): Searched for text/event-stream or event streaming; scenarios are polled via GetScenario.

HTTP API to run workflows (No): No REST run API; workflows only callable as tools on Epic MCP endpoint or from Python.

YAML flow engine (No): No workflow engine; searched yaml/workflow/pipeline. Only per-namespace batch_execute actions exist.

Every action usable as a workflow step (Partial): mesh.batch_execute dispatches any mesh action via registry; blueprint/niagara batches use fixed op lists.

Nested workflows (No): No workflows; mesh.batch_execute explicitly rejects nested batch_execute.

Step output references (No): No step output refs; blueprint.add_nodes_bulk returns temp_id to node_id map for later calls only.

Runtime workflow parameters (No): No workflow definitions or runtime parameter substitution found; searched workflow, params templating.

  • Source/MonolithCore/Private (no workflow runner)

Per-step retry with backoff/filter (No): Searched retry/backoff; only HTTP port bind retry in server startup, none per action or step.

Expected-failure steps (No): No expected-failure step concept; batch ops only have stop_on_error.

Workflow lifecycle hooks (No): Searched hooks, before/after, on_failure in core; only an updater pre-exit hook, no workflow hooks.

Conditional steps (No): No conditional step mechanism in any batch_execute or core dispatcher.

Workflow dry-run / execution plan (Partial): Per-action dry_run via FMonolithDryRunGuard (would_create/would_modify) on many writers; no workflow plan.

Skip steps at call time (No): No workflows, so no call-time step skipping; searched skip_steps/only_steps.

  • Source/ (no skip_steps matches)

Shell command steps (No): No OS shell step; editor.run_console_command runs UE console commands only.

Live workflow event stream (SSE) (No): GET /mcp returns one SSE endpoint event and closes; no workflow event stream.

HTTP API to run workflows (No): HTTP server exposes /mcp and /health for single actions; no workflow run endpoint.

Per-step rollback of workflow changesUndoes a failed step, including partial writes, via snapshots or transactions.

Per-step rollback / git snapshot (Partial): editor.undo/redo, blueprint.undo_last_bpir, actor transform snapshots; no git snapshot, no workflow steps.

Partial-write rollback of failing step (Partial): Per RPC, not per step: failing BPIR, AGIR, CRIR, widget and sequencer bake calls undo partial writes.

Per-step rollback / git snapshot (Yes): Handler inverse records (MCPSetRollback in 99 handler files) plus opt-in shadow git snapshot of Content and Config.

Partial-write rollback of failing step (Partial): Runner replays a failing step's own inverse first, but docs say only a few handlers emit one.

Per-step rollback / git snapshot (No): No git snapshot or per-step rollback; searched git/rollback/snapshot. Tool library calls only open an undo transaction.

  • ModelContextProtocol/Source/ModelContextProtocolEngine/Private/ModelContextProtocolToolLibrary.cpp:251 FScopedTransaction

Partial-write rollback of failing step (Partial): Blueprint DSL rolls back graph edits on failure; the transactional script runner is defined but unused.

  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint_dsl.py:1714 snapshot.rollback
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:834 _TransactionalScriptRunner

Per-step rollback / git snapshot (No): No per-step rollback or git snapshot; compensation receipts always set rollback to the string unavailable.

Partial-write rollback of failing step (Partial): Level copy restores file backups on failure; scoped undo transactions on some handlers; not general.

Per-step rollback / git snapshot (Partial): Undo based only: TransactionService begin/cancel/undo, bulk per target undo; no git snapshot.

Partial-write rollback of failing step (Partial): Bulk maintenance undoes the failed target's transaction; scenario steps have no rollback.

Per-step rollback / git snapshot (Partial): mesh.batch_execute cancels its whole undo transaction on first failure; no git snapshot, no workflows.

Partial-write rollback of failing step (Partial): Per action: spec builders and mesh handlers cancel their undo transaction on failure; no workflow steps.

Extensibility (plugin system)

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Aggregate external MCP servers as tools

mcp_proxy.py only bridges stdio to its own editor; no aggregation of other MCP servers.

Evidence

Searched for MCP client SDK imports, StdioClientTransport, mcpServers; only client config writing, no proxying.

Evidence

MCPClientToolset proxies external MCP servers (SSE, Streamable HTTP, OAuth) as toolsets.

Evidence
  • Engine/Plugins/Experimental/Toolsets/MCPClientToolset/Source/MCPClientToolset/Public/MCPClientToolset/MCPToolsetSettings.h:73-83
  • Engine/Plugins/Experimental/Toolsets/MCPClientToolset/Source/MCPClientToolset/Public/MCPClientToolset/MCPClientToolset.h

Searched src for MCP client SDK imports (sdk/client) and proxying. The server does not aggregate other servers.

Evidence
  • src/

Via Epic toolset: engine MCPClientToolset is the outbound MCP client; VibeUE has none of its own.

Evidence

Proxy forwards only to Monolith's own HTTP endpoint; searched for upstream or external MCP servers.

Evidence
Third-party extensions can add toolsOther plugins or packages can register new tools, in script or native C++.

Inject actions into built-in categories (Partial): Undocumented exported C++ UPinWrightSubsystem::RegisterHandler adds methods at runtime; no plugin packaging.

Provide new top-level categories (Partial): Same undocumented RegisterHandler accepts any dotted name, so a C++ module can add a new namespace.

Ship native C++ handlers (versioned ABI) (Partial): External C++ module can register TFunction handlers via public RegisterHandler; no versioned ABI.

Declarative native handlers (no glue code) (Partial): REGISTER_RPC_HANDLER macro declares method, params, summary; header is Private, used by in-tree sub-modules.

Typed task SDK for plugin actions (No): No typed task SDK for extension actions. Searched Source, docs.

Sibling C++ plugin pattern (Partial): Optional in-plugin modules (PCG, Geometry, Chooser...) add handlers; exported RegisterHandler is undocumented.

Inject actions into built-in categories (Yes): Manifest inject: block merges prefixed actions into built-in category tools; collisions skipped.

Provide new top-level categories (Yes): Manifest provides: registers new top-level category tools; first plugin wins on name clashes.

Ship native C++ handlers (versioned ABI) (Yes): UEMCP::RegisterExternalHandler; nativeModule.minBridgeApi gated against UEMCP_BRIDGE_API_VERSION (now 1).

Declarative native handlers (no glue code) (Yes): nativeModule.category plus handlers: schema surface C++ handlers as actions with no TS task.

Typed task SDK for plugin actions (Yes): ue-mcp/task export: UeMcpTask<Options> with typed this.call, this.bridge, this.ctx.

Sibling C++ plugin pattern (Yes): UEMCP::RegisterExternalHandler; plugin nativeModule compiles a sibling .uplugin and surfaces its handlers.

Inject actions into built-in categories (No): Toolset name is class plus module qualifier and duplicates are rejected, so built-in toolsets cannot gain tools.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/ToolsetRegistry.cpp:129 already registered
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/FunctionLibraryToolset.cpp:212 GetToolsetClassName

Provide new top-level categories (Yes): Any UE plugin registers a new UToolsetDefinition (C++ or Python); each shows as its own toolset.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/UToolsetRegistry.h:28 RegisterToolsetClass
  • Engine/Plugins/Experimental/ToolsetRegistry/Content/Python/toolset_registry/registration.py Registration

Ship native C++ handlers (versioned ABI) (Yes): C++ UToolsetDefinition static AICallable UFUNCTIONs; GetToolsetVersion string; ABI is the engine module ABI.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetDefinition.h:13-25
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/Toolset.h:39 GetToolsetVersion

Declarative native handlers (no glue code) (Yes): Static UFUNCTION(meta=(AICallable)) is exposed with schema from reflection, no dispatch glue.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetDefinition.h:13-14
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/FunctionLibraryToolset.cpp

Typed task SDK for plugin actions (Yes): Python @tool_call requires type annotations and builds JSON schema; C++ uses UFUNCTION reflection.

  • Engine/Plugins/Experimental/ToolsetRegistry/Content/Python/toolset_registry/__init__.py:46 tool_call
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/JsonSchema.cpp

Sibling C++ plugin pattern (Yes): Toolsets ship as separate plugins that register UToolsetDefinition classes; AICallable UFUNCTIONs become tools.

  • ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/UToolsetRegistry.h:28 RegisterToolsetClass
  • Toolsets/AllToolsets/AllToolsets.uplugin

Inject actions into built-in categories (No): Tool schemas are generated from a fixed registry. handler-aliases.json only adds new names for existing actions.

Provide new top-level categories (No): Categories are hardcoded (core/world/gameplay/utility). No external category registration found.

Ship native C++ handlers (versioned ABI) (Partial): Exported C++ RegisterHandler lets another UE module add a bridge action. No ABI versioning; no MCP schema route.

Declarative native handlers (no glue code) (No): MCP_REGISTER_DIRECT/MCP_REGISTER_TOOL are private macros for in-tree tools. No declarative third-party handlers.

Typed task SDK for plugin actions (No): No typed SDK for third-party actions found.

  • src/

Sibling C++ plugin pattern (Partial): Exported subsystem has public RegisterHandler, but no documented sibling plugin path; gateway catalog is fixed.

Inject actions into built-in categories (No): Exported FToolRegistry adds flat MCP tools only; bridge ignores Category, so no injection into categories.

Provide new top-level categories (Partial): Via Epic toolset: any UE plugin can RegisterToolsetClass on ToolsetRegistry; VibeUE adds no extension API.

Ship native C++ handlers (versioned ABI) (Partial): Via Epic toolset: C++ UToolsetDefinition classes from any module; no versioned handler ABI in VibeUE.

Declarative native handlers (no glue code) (Partial): Via Epic toolset: AICallable UFUNCTIONs auto-exposed; REGISTER_VIBEUE_TOOL macro is undocumented for others.

Typed task SDK for plugin actions (No): No typed task SDK for extension actions; searched SDK/task API in Source and Content/Python.

Sibling C++ plugin pattern (Partial): Extension via Epic ToolsetRegistry; FToolRegistry is exported but no documented third party handler API.

Inject actions into built-in categories (Yes): RegisterAction accepts any namespace; tools/list builds each <ns>_query action enum live, so added actions appear.

Provide new top-level categories (Yes): A sibling UE plugin registering a new namespace gets its own <ns>_query MCP tool automatically.

Ship native C++ handlers (versioned ABI) (Partial): Sibling C++ modules link MonolithCore and register handlers; no versioned ABI, only a MONOLITH_VERSION string.

Declarative native handlers (no glue code) (No): Every handler needs C++ glue calling RegisterAction; no declarative handler format.

Typed task SDK for plugin actions (No): Handlers take raw FJsonObject params; no typed task SDK.

Sibling C++ plugin pattern (Yes): Sibling plugins register actions into the exported FMonolithToolRegistry singleton; guide documents it.

Extension distribution (install, update, remove)Scaffolding, publishing, a registry, and per-project install, pin, update, list and removal of extensions.

plugin install CLI (No): No extension plugin system or install CLI; PinWright itself ships as zip or Fab. Searched Source, scripts, README.

Public plugin registry / catalog (No): No plugin registry or catalog. Searched Source, docs, README for registry, catalog, marketplace of extensions.

Install a plugin by registry slug (No): No registry and no slug install command. Searched scripts and Source.

  • Plugins\PinWright\scripts

Plugin publish CLI (No): No plugin publish CLI; scripts only package PinWright itself (package-prebuilt.ps1, package-fab.ps1).

Plugin scaffold generator (No): No extension scaffold generator. Searched scripts, Source, docs.

  • Plugins\PinWright\scripts

Plugin semver pin in project config (No): No extension semver pin in project config. Searched settings headers and Config.

Plugin uninstall with clean removal (No): No extension uninstall command. Searched scripts and Source.

  • Plugins\PinWright\scripts

Plugin update command (No): No extension update command. Searched scripts and Source.

  • Plugins\PinWright\scripts

Runtime introspection (list / describe) (Partial): call() and registry.json list and describe all registered methods; no integration inventory verb, only banner and log.

Per-project plugin sets (multi-editor) (No): No extension sets; PinWright is per project with path derived port for multiple editors.

plugin install CLI (Yes): ue-mcp plugin install <name> [--version] runs npm install, validates manifest, edits ue-mcp.yml.

Public plugin registry / catalog (Yes): plugins.ue-mcp.com catalog; client in repo, registry server code not in this repo.

Install a plugin by registry slug (Yes): install resolves a bare slug (e.g. meshy) to its npm package via registry /api/resolve.

Plugin publish CLI (Yes): ue-mcp plugin publish pushes listing plus README to registry /api/publish; supports --dry-run.

Plugin scaffold generator (Yes): ue-mcp plugin create scaffolds inject, provides, flows and a dormant native C++ module.

Plugin semver pin in project config (Partial): version pin is exact match only; docs show ^0.2.0 ranges but resolver compares exactly and skips.

Plugin uninstall with clean removal (Yes): uninstall removes native module files, installed skills, ue-mcp.yml entry, then npm uninstall.

Plugin update command (Partial): plugin update runs npm update and resyncs skills only; no native module redeploy, pin or manifest recheck.

Runtime introspection (list / describe) (Yes): plugins(action=list|describe) return status, reasons, dropped parts, injected actions, flows, paths.

Per-project plugin sets (multi-editor) (Yes): Each editor session loads its own project's plugins: list and tool graph.

plugin install CLI (No): No MCP plugin install CLI; toolsets are UE plugins added by hand; PluginToolset only enables existing ones.

  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:293 SetPluginEnabled

Public plugin registry / catalog (No): No toolset registry or catalog service found; searched for registry URL, catalog, marketplace code.

  • Engine/Plugins/Experimental/ToolsetRegistry (local in-process registry only)

Install a plugin by registry slug (No): No install by slug; searched ToolsetRegistry, ModelContextProtocol and PluginToolset for install/download.

  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h

Plugin publish CLI (No): No publish command found in MCP, ToolsetRegistry or Toolsets sources.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source

Plugin scaffold generator (Partial): PluginToolset CreatePlugin scaffolds a generic UE plugin from templates; no toolset specific template.

  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:270 CreatePlugin

Plugin semver pin in project config (Partial): Engine .uproject plugin reference can pin an exact integer Version, enforced by PluginManager; no semver range.

  • Engine/Source/Runtime/Projects/Public/PluginReferenceDescriptor.h:74 RequestedVersion
  • Engine/Source/Runtime/Projects/Private/PluginManager.cpp:2440-2465

Plugin uninstall with clean removal (No): No uninstall; PluginToolset SetPluginEnabled can disable a plugin, files stay.

  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:293

Plugin update command (No): No update command; searched PluginToolset and ToolsetRegistry for update/upgrade of plugins.

  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:313 UpdatePluginDescriptor edits .uplugin only

Runtime introspection (list / describe) (Yes): list_toolsets and describe_toolset meta tools return toolset catalog and per tool JSON schemas.

  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolSearch.h:10-11
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocolEditor/Private/ModelContextProtocolToolsetRegistryAdapter.cpp:167-180

Per-project plugin sets (multi-editor) (Yes): Each editor runs its own server; toolset plugins enabled per .uproject plus per-project allow/block lists.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetRegistrySubsystem.h:21-40 EditorPerProjectUserSettings

plugin install CLI (No): No MCP extension plugin system; cli.ts only starts the server. sync-mcp-plugin.js just copies the UE bridge.

Public plugin registry / catalog (No): Searched src and docs for a registry or catalog of third-party plugins. None found.

  • docs/
  • src/

Install a plugin by registry slug (No): No registry and no install command.

Plugin publish CLI (No): No publish command. The scripts folder has only a UE plugin packager (package-plugin.bat/.sh).

Plugin scaffold generator (No): No scaffold generator for extension plugins found in scripts or src.

  • scripts/

Plugin semver pin in project config (No): No project config that pins plugin versions.

  • src/

Plugin uninstall with clean removal (No): No plugin uninstall command.

Plugin update command (No): No plugin update command.

Runtime introspection (list / describe) (No): No plugins to list. manage_tools list_tools/list_categories only covers built-in tools.

Per-project plugin sets (multi-editor) (No): No plugin sets. Only handler aliases are read per project, from Saved/Config or Config.

plugin install CLI (No): No MCP plugin install command; searched install/plugin/npm CLI in Source, scripts, *.ps1, README.

  • README.md (install is git clone into Plugins/)

Public plugin registry / catalog (No): No plugin registry or catalog; Fab references are for importing owned Fab assets, not MCP plugins.

Install a plugin by registry slug (No): No registry slug install; searched install/registry/slug in Source and scripts.

Plugin publish CLI (No): No extension publish CLI; MakePlugin.ps1 only packages VibeUE itself for Fab submission.

Plugin scaffold generator (No): No scaffold generator; searched scaffold/template/new plugin in Source, scripts, docs.

Plugin semver pin in project config (No): No project config with plugin version pins; searched semver/pin across repo.

Plugin uninstall with clean removal (No): No uninstall command; searched uninstall across repo.

Plugin update command (No): No plugin update command; updates are git pull or Fab; searched update/upgrade commands.

Runtime introspection (list / describe) (Partial): Epic list_toolsets/describe_toolset; VibeUE adds VibeUE.ListTools and vibeue.py schema helpers.

Per-project plugin sets (multi-editor) (No): No plugin sets; VibeUE is installed per project as a UE plugin with a fixed tool set.

plugin install CLI (No): No plugin install command; sibling plugins are copied into Plugins/ by hand. Searched Scripts, Tools, MCP.

Public plugin registry / catalog (No): No plugin registry or catalog; searched source, docs and scripts for registry or catalog of extensions.

Install a plugin by registry slug (No): No registry, so no install by slug; searched Scripts and Source.

  • Scripts/

Plugin publish CLI (No): No plugin publish command; make_release.ps1 packages Monolith itself only.

Plugin scaffold generator (No): No scaffold generator for extensions; guide gives copy-paste templates only.

Plugin semver pin in project config (No): No project config pinning extension versions; searched settings and docs.

Plugin uninstall with clean removal (No): No uninstall command; UnregisterNamespace only clears actions at module shutdown.

Plugin update command (No): monolith_update updates Monolith itself from GitHub Releases, not sibling plugins.

Runtime introspection (list / describe) (Partial): monolith_discover lists namespaces incl. sibling ones; describe action_schema; no per-plugin listing.

Per-project plugin sets (multi-editor) (Partial): Siblings are UE plugins in each project's Plugins/, so sets differ per project; ServerPort setting per editor.

Extensions can ship skills or docsExtensions bring their own agent docs, skills, workflows or guards.

Knowledge files merged into AI docs (No): Overlays and topic pages load only from PinWright's own docs/wiki-src; no extension or project knowledge path.

Plugins ship agent skills (namespaced) (No): No plugin mechanism for skills; .polyskill skills are maintainer dev tools, not extension content.

  • Plugins\PinWright\.polyskill\skills

Plugins ship workflows (flows) (No): Built-in workflow pages exist but no way for extensions to ship workflows.

Plugins ship call guards (No): Built-in mutating and world precondition guards only; extensions cannot add call guards.

Knowledge files merged into AI docs (Yes): knowledge/<category>.md appended per category into initialize instructions.

Plugins ship agent skills (namespaced) (Yes): skills/ copied to .claude/skills under package prefix, owner tracked in .ue-mcp/skills.json.

Plugins ship workflows (flows) (Yes): Manifest flows: merged into flow runtime; toggle by group via plugin config.

Plugins ship call guards (Yes): Manifest guards: built into call pipeline guards (deny or observe) for every bridge call.

Knowledge files merged into AI docs (Partial): Plugins ship UAgentSkill text read on demand via ListSkills/GetSkills; server Instructions field is never set.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/AgentSkill.h:69-78
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Public/ModelContextProtocolSession.h:93 Instructions (no writer found)

Plugins ship agent skills (namespaced) (Yes): UAgentSkill subclasses in any plugin (C++ or Python @agent_skill) are listed by full class path.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/AgentSkill.cpp:25-50 ListSkills
  • Engine/Plugins/Experimental/Toolsets/NiagaraToolsets/Content/Python/skills/fundamentals.py

Plugins ship workflows (flows) (No): No workflow or flow concept found in ToolsetRegistry or ModelContextProtocol headers.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source

Plugins ship call guards (No): No plugin supplied pre-call hooks; searched for pre-execute, guard, approval; only config block lists.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Public/ToolsetRegistry/ToolsetRegistrySubsystem.h:33-67

Knowledge files merged into AI docs (No): Knowledge resources come from a static built-in table. No external knowledge files are merged.

Plugins ship agent skills (namespaced) (No): No plugin skill mechanism. Searched src for skill loading.

  • src/

Plugins ship workflows (flows) (No): Workflow prompts exist but are built in (workflow-prompts.ts). Plugins cannot ship them.

Plugins ship call guards (No): Guards (console command policy, consent gates) are built in. No plugin-supplied guards.

Knowledge files merged into AI docs (Partial): Via Epic toolset: AgentSkill merges skills from any plugin into ListSkills; VibeUE loads only its own Skills dir.

Plugins ship agent skills (namespaced) (Partial): Via Epic toolset: any UE plugin can register AgentSkills; VibeUE ships own packs, no plugin namespacing.

Plugins ship workflows (flows) (No): WorkflowService is built in; no mechanism for extensions to ship workflows.

Plugins ship call guards (No): No extension call guards; searched guard/hook/pre-call in Source and bridge.

Knowledge files merged into AI docs (No): monolith_guide reads only Monolith's own markdown; sibling namespaces appear only as action counts.

Plugins ship agent skills (namespaced) (No): Skills/ ships Monolith's own skills; no way for siblings to ship namespaced skills.

Plugins ship workflows (flows) (No): No workflow or flow mechanism for extensions; searched registry and core for workflow.

Plugins ship call guards (No): No pre-call guard or middleware hook in the registry; searched for middleware, guard, PreExecute.

Extension compatibility checksChecks engine-plugin and server-version requirements and loads broken extensions in degraded mode with warnings.

UE-side dependency check (.uplugin) (Partial): Only built-in integration sub-modules: engine plugin checked enabled before loading; not for third party.

Server-version gate for plugins (No): Only proxy vs editor plugin gate (EDITOR_PLUGIN_OUTDATED); no version gate for extensions.

Degraded plugin loading, warnings to agent (Partial): Built-in integrations only: skipped when engine plugin is off; calls return PLUGIN_DISABLED naming it.

UE-side dependency check (.uplugin) (Yes): uePluginDependency checked against .uproject, reported as uePluginPresent; informational, never blocks load.

Server-version gate for plugins (Yes): minServerVersion enforced at install and at load; plugin skipped if server older.

Degraded plugin loading, warnings to agent (Yes): Bad parts dropped, not whole plugin; skipped or degraded plugins listed in initialize instructions.

UE-side dependency check (.uplugin) (Yes): Toolsets are UE plugins; .uplugin Plugins dependencies such as ToolsetRegistry are enforced by the engine.

  • Engine/Plugins/Experimental/Toolsets/PluginToolset/PluginToolset.uplugin Plugins: ToolsetRegistry, PluginUtils

Server-version gate for plugins (Partial): Only the engine's generic .uplugin EngineVersion check; no toolset registry or MCP server version gate.

  • Engine/Source/Runtime/Projects/Public/PluginDescriptor.h:74 EngineVersion

Degraded plugin loading, warnings to agent (No): Failed toolset registration or reload is written to the editor log only, not reported to the agent.

  • Engine/Plugins/Experimental/ToolsetRegistry/Content/Python/toolset_registry/_reload.py:184-198
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/ToolsetRegistry.cpp:129

UE-side dependency check (.uplugin) (No): No extension plugin manifest, so no .uplugin dependency check. Searched for loadPlugin and plugin manifests.

Server-version gate for plugins (No): No plugin system, so no server-version gate for plugins.

  • src/

Degraded plugin loading, warnings to agent (No): No plugin loading. Invalid handler-aliases.json entries are skipped with an editor log warning only.

UE-side dependency check (.uplugin) (No): No dependency check for extensions; only VibeUE's own .uplugin lists engine plugin deps.

Server-version gate for plugins (No): No server version gate for extensions; searched version checks in Source, only own version lookup.

Degraded plugin loading, warnings to agent (No): Failed skill or tool registration only logs a warning to the editor log, not surfaced to the agent.

UE-side dependency check (.uplugin) (Partial): Sibling .uplugin lists Monolith as a plugin dep, enforced by the UE loader; Build.cs probes optional deps.

Server-version gate for plugins (No): No min server version check for siblings; MONOLITH_VERSION is only a display string.

Degraded plugin loading, warnings to agent (Partial): discover reports built-in optional modules gas and combograph as disabled or not_installed with hints.

Project-local tools with hot reloadProject-specific tools reloaded without restarting, optionally overriding built-ins.

Project tools in Python/C++ with hot reload (Partial): Only escape hatches: python.execute runs scripts, system.live_coding_compile hot patches C++.

Project-local custom tasks override built-ins (No): No project local task override mechanism. Searched settings, Source, docs.

Project tools in Python/C++ with hot reload (Partial): Project tasks are TS/JS only; config reloads per flow call but classes cached; reload_bridge is a no-op.

Project-local custom tasks override built-ins (Yes): tasks: in ue-mcp.yml with class_path replaces a built-in flow task such as asset.list.

Project tools in Python/C++ with hot reload (Yes): toolset_registry.reload_module re-registers Python toolsets; C++ via LiveCodingToolset CompileLiveCoding.

  • Engine/Plugins/Experimental/ToolsetRegistry/Content/Python/toolset_registry/__init__.py:76 reload_module
  • Engine/Plugins/Experimental/Toolsets/LiveCodingToolset/Source/LiveCodingToolset/Public/LiveCodingToolset.h:26 CompileLiveCoding

Project-local custom tasks override built-ins (No): Toolset names carry a module qualifier and duplicates are rejected; block list hides a built-in only.

  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/ToolsetRegistry.cpp:129
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/FunctionLibraryToolset.cpp:212

Project tools in Python/C++ with hot reload (Partial): Only through the system_control execute_python escape hatch. No registered project tools or hot reload.

Project-local custom tasks override built-ins (No): Project handler-aliases.json adds names only. Duplicate or built-in action names are rejected, not overridden.

Project tools in Python/C++ with hot reload (Partial): Via Epic toolset: Python toolset registration and reload; VibeUE only adds VibeUE.ReloadSkills for skills.

Project-local custom tasks override built-ins (No): No project-local tool or skill override; skills load only from plugin Content/Skills.

Project tools in Python/C++ with hot reload (Partial): C++ sibling handlers can be reloaded with Live Coding; no Python tool registration, only editor.run_python.

Project-local custom tasks override built-ins (Partial): Registering an existing namespace.action overwrites it with a warning; depends on load order.

Sequencer and cinematics

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Sequencer FBX animation import/export

sequencer.import_fbx and sequencer.export_fbx wrap the engine Level Sequence FBX importer and exporter.

Evidence

Only epic_export_fbx, epic_import_fbx and rig FBX actions; via wrapped Epic toolset, UE 5.8 only.

Evidence

export_fbx and import_fbx on level sequences, plus export_fbx_from_rig and import_fbx_to_rig.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:18 export_fbx, :54 import_fbx
  • controlrig_sequencer.py:1448 export_fbx_from_rig, :1479 import_fbx_to_rig

No Sequencer FBX import/export; FBX only in asset import. Reachable via execute_python only.

Evidence

No VibeUE code; via Epic toolset export_fbx/import_fbx and Control Rig FBX import/export.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:18 export_fbx, :54 import_fbx
  • controlrig_sequencer.py:1448 export_fbx_from_rig, :1479 import_fbx_to_rig

No Sequencer FBX import/export action (searched ExportLevelSequenceFBX, SequencerFBX). Only via run_python.

Evidence
Component bindings and actor rebinding

add_actor/add_actors take componentName for nested component bindings; sequencer.repoint_actor rebinds actors.

Evidence

Native only creates actor possessable bindings; rebind_component and replace_binding via wrapped Epic.

Evidence

rebind_component, replace_binding_with_actors, fix_actor_references, custom bindings.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:1800 rebind_component
  • sequencer.py:1744 replace_binding_with_actors, :1817 fix_actor_references
  • custom_bindings.py:50 convert_to_custom_binding

No VibeUE code; via Epic toolset rebind_component, replace_binding_with_actors, get_child_possessables.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:1800 rebind_component, :1744 replace_binding_with_actors, :1905 get_child_possessables

level_sequence.list_bindings reads possessable/spawnable bindings; no rebind action, run_python needed.

Evidence
Camera rig rail/crane and shot tracks

add_camera_rig_rail, add_camera_rig_crane, add_camera_track (camera cut) and get_camera_cut_track.

Evidence

Native CameraCut track and section only; no rail, crane or shot track support found.

Evidence

create_camera and camera cut binding exist; shot tracks only via generic add_track_to_sequence; no rail/crane tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:661 create_camera, :1105 set_camera_cut_binding
  • sequencer.py:799 add_track_to_sequence(track_type class)
  • grep CameraRig_Rail|CameraRig_Crane|shot over Toolsets .py: no tool hits

configure_camera_rig_rail/crane spawn rig and set position, pitch, yaw, arm; add_shot_track exists.

Evidence

No rail/crane or shot op; Epic toolset has create_camera and generic add_track_to_sequence; else Python.

Evidence

No rail/crane rig, camera cut or shot track actions (searched CameraRigRail, ShotTrack). run_python only.

Evidence
Movie Render Queue rendering

mrq namespace creates, lists and runs MRQ jobs; run_jobs returns a job ticket and measured output file facts.

Evidence

render_sequence_frames writes PNGs via SceneCapture2D, not Movie Render Queue; no MRQ actions found.

Evidence

Searched MovieRender and MoviePipeline in all toolsets and the MCP plugin; none found. The script sandbox does not expose the unreal Python module.

Evidence
  • grep -iE 'movierender|moviepipeline' over Experimental/Toolsets, ModelContextProtocol, ToolsetRegistry: only a NiagaraToolsets .pdb hit
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:53 _SUPPORTED_MODULES (json, math, datetime, copy, re, time)

No MRQ op in VibeUE or Epic toolsets; only via execute_python_code escape hatch.

Evidence

No Movie Render Queue action (searched MoviePipeline, MovieRenderQueue). Only via editor.run_python.

Evidence
Control Rig keying and baking to AnimSequenceKeys Control Rig in Sequencer, bakes spaces, and bakes performances to animation assets.

Control Rig keying and space baking (Yes): sequencer.key_controls keys Control Rig controls; sequencer.bake_control_space bakes a control into a parent space.

Bake Sequencer performance to AnimSequence (Yes): sequencer.export_anim_sequence bakes a skeletal binding to an AnimSequence; also bake_to_controlrig.

Control Rig keying and space baking (Partial): Native apply_control_rig_edits keys controls, UE 5.8 only; space baking only via wrapped Epic bake_space.

Bake Sequencer performance to AnimSequence (Partial): Native bake_control_rig_edit bakes only its own edit session (5.8); arbitrary bindings via wrapped Epic.

Control Rig keying and space baking (Yes): Typed Control Rig set/get, key_controls_at_frames, set_space, bake_space with key reduction.

  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig_sequencer.py:661 key_controls_at_frames
  • controlrig_sequencer.py:993 set_space, :1096 bake_space (reduce_keys, tolerance)
  • controlrig_sequencer.py:689 bake_to_control_rig

Bake Sequencer performance to AnimSequence (Yes): export_anim_sequence wraps SequencerTools.export_anim_sequence; link_anim_sequence keeps it synced.

  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/import_export.py:88 export_anim_sequence
  • import_export.py:125 link_anim_sequence

Control Rig keying and space baking (Partial): No Sequencer Control Rig key or space-bake op; only Control Rig asset creation. Python via execute_python only.

Bake Sequencer performance to AnimSequence (Partial): No bake-to-AnimSequence op found (searched bake, ExportAnimSequence, SequencerTools); execute_python only.

Control Rig keying and space baking (Partial): No VibeUE code; via Epic toolset AnimationAssistantToolset key_controls and bake_space (experimental plugin).

  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig_sequencer.py:640 key_controls, :1096 bake_space
  • Content/Skills/vibeue/SKILL.md:151 Sequencer is Epic-native, VibeUE adds no skill

Bake Sequencer performance to AnimSequence (Partial): No VibeUE code; via Epic toolset import_export.export_anim_sequence in AnimationAssistantToolset.

Control Rig keying and space baking (Partial): No Sequencer Control Rig keying or space bake action; only CR graph edits. Reachable via editor.run_python.

Bake Sequencer performance to AnimSequence (Partial): No bake to AnimSequence action (searched BakeToAnim, AnimSeqExportOption). Only via editor.run_python.

Sequencer authoring, scrub and transform readCreates and edits level sequences and reads exact transforms at any frame.

Sequencer (Yes): sequencer namespace with 54 pages covering tracks, keys, bindings, playback, FBX.

Deterministic frame scrub and transform read (Yes): sequencer.set_playhead scrubs to an exact frame; sequencer.get_binding_transform evaluates transform at a frame.

Sequencer (Yes): create_sequence, add tracks/sections/keys, play, scrub, render_sequence_frames.

Deterministic frame scrub and transform read (Yes): scrub_sequence pauses, scrubs and force evaluates; transform read is a separate actor read or Epic call.

Sequencer (Yes): AnimationAssistantToolset: sequencer tools for create, playback, bindings, keyframing, camera.

  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:27 create_level_sequence
  • keyframing.py, outliner.py in same folder

Deterministic frame scrub and transform read (Yes): set_playhead_frame plus get_actor_transform_at_frame returns world location and rotation at a frame.

  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:134 set_playhead_frame
  • controlrig_sequencer.py:597 get_actor_transform_at_frame

Sequencer (Yes): manage_sequence: create, tracks, bindings, keyframes, play, Movie Render Queue, Take Recorder.

  • src/tools/catalog/capabilities/records/manage-sequence/ (timeline-*.ts, mrq.ts, take.ts)
  • plugins/McpAutomationBridge/Source/McpAutomationBridge/Private/Domains/Sequencer/

Deterministic frame scrub and transform read (Partial): No seek-to-frame or evaluated transform read; stop scrubs to frame 0, list_track_keys reads raw keys.

Sequencer (Partial): VibeUE only toggles cinematic viewport control; Sequencer via Epic toolset AnimationAssistantToolset.

Deterministic frame scrub and transform read (Partial): No VibeUE code; via Epic toolset set_playhead_frame, force_evaluate, get_actor_transform_at_frame.

  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:134 set_playhead_frame, :1405 force_evaluate
  • controlrig_sequencer.py:597 get_actor_transform_at_frame

Sequencer (Partial): level_sequence namespace is read only: directors, bindings, event tracks; no track or key authoring.

Deterministic frame scrub and transform read (Partial): No sequence scrub or transform sample action (searched SetPlaybackPosition, JumpToFrame). run_python only.

Rendering and visual review

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Diagnostic view modes for captures

viewMode param on capture verbs renders one capture and restores both viewport mode slots on exit.

Evidence

set_view_mode is a separate persistent call with rollback; captures take no view mode, no auto restore.

Evidence

No view mode tool or param; CaptureViewport only hides and restores gizmo and selection show flags.

Evidence
  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:1110-1140 show flag save/restore
  • grep viewmode|SetCVar|ShowFlag in toolset .py/.h: no view mode tool; programmatic.py:53 sandbox allows only stdlib modules

set_view_mode is a separate global viewport op; screenshot takes no view mode and restores nothing.

Evidence

set_view_mode exists as a separate call; captures take no view mode and nothing restores it afterward.

Evidence

capture_with_overlay sets 5 show flags on a transient capture of one static mesh; nothing to restore.

Evidence
Screenshots with measured overlays

render.capture_annotated paints axes, Z=0 grid, actor AABBs with size labels; image.annotate adds world marks.

Evidence

Grid and actor label/position overlay only via wrapped Epic toolset, UE 5.8 only; native run_stat overlays.

Evidence

CaptureViewport annotations draw a world grid with meter coordinates and actor labels with position data.

Evidence
  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:129 FViewportAnnotationConfig, :246 CaptureViewport
  • Toolsets/EditorToolset/Source/EditorToolset/Private/BitmapAnnotation.h FBitmapCanvas overlays

Screenshot returns PNG plus camera pose and size; no drawn overlays. Searched overlay, annotate, DrawLine.

Evidence

Via Epic toolset: CaptureViewport annotations overlay a world grid and actor labels; VibeUE adds none.

Evidence

Searched annotate, ruler, DrawText, FCanvas on images; overlays are show flags or spawned boxes only.

Evidence
Asset captures (isolated, multi-angle)Captures an asset without placing it in a level, from one or several fixed angles.

Isolated asset capture without level spawn (Yes): render.capture_mesh uses a transient preview scene; capture_asset_preview uses asset editor preview.

Multi-angle shot sets (orbit, ortho sides) (Yes): camera.orbit_shots: count/angles orbit, views:'sides' six ortho views; also capture_ortho_tiles.

Isolated asset capture without level spawn (Partial): Native render_preview is materials only; general asset thumbnail via wrapped Epic toolset, UE 5.8 only.

Multi-angle shot sets (orbit, ortho sides) (Partial): One angle per call: capture_scene_png focusDirection, set_viewport ortho views; no orbit or shot set op.

Isolated asset capture without level spawn (Yes): CaptureAssetImage renders an asset thumbnail via ThumbnailTools with no level spawn; levels rejected.

  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:216 CaptureAssetImage
  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:155 ThumbnailTools::RenderThumbnail, :290 UWorld branch

Multi-angle shot sets (orbit, ortho sides) (Partial): CaptureViewport takes one optional perspective pose per call; no orbit or ortho set, loop it yourself.

  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:246 CaptureViewport(TOptional<FTransform> CaptureTransform,...)
  • Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script can loop tool calls

Isolated asset capture without level spawn (Partial): generate_thumbnail renders an asset via ThumbnailTools off-level; fixed thumbnail camera, file output only.

Multi-angle shot sets (orbit, ortho sides) (No): No orbit, turntable or ortho shot set; searched LVT_, SetViewportType, orbit. Only single-frame screenshot.

Isolated asset capture without level spawn (Partial): Own off-screen render only for Widget BPs; anim pose capture spawns a temp actor in the editor world.

Multi-angle shot sets (orbit, ortho sides) (Partial): Anim pose capture takes one preset angle per call (front, side, back, top); CaptureScene has ortho; no shot sets.

Isolated asset capture without level spawn (Yes): editor.capture_scene_preview renders Niagara, material, meshes, widget in an FPreviewScene with no level spawn.

Multi-angle shot sets (orbit, ortho sides) (Partial): mesh.capture_building_views gives top plus 4 ortho sides plus perspective, only for registry buildings.

Capture diffingCompares captures numerically, including proving a pose changed between frames.

Image A/B diff with measured statistics (Yes): image.compare writes side by side and diff PNGs with differingFraction and per channel mean/max stats.

Animation frame captures with pose-change proof (Yes): render.capture_animation_preview shoots frames in Persona and returns numeric pose change proof.

Image A/B diff with measured statistics (No): Searched image/pixel diff, ssim, compare png; compare_textures only checks asset dims, format, source id.

Animation frame captures with pose-change proof (Partial): Generic capture_screenshot plus sample_pose/analyze_animation numbers; no frame capture with pose diff.

Image A/B diff with measured statistics (No): Searched for image diff, compare, pixel diff, SSIM, PSNR, histogram; no image comparison tool found.

  • grep image.?diff|compare.?image|pixel.?diff|ssim|psnr|histogram over Experimental MCP, ToolsetRegistry, Toolsets: no hits

Animation frame captures with pose-change proof (Partial): Viewport screenshot plus Sequencer playhead set allows frame captures; no pose change check.

  • Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:246 CaptureViewport
  • Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/sequencer.py:134 set_playhead_frame

Image A/B diff with measured statistics (No): Searched image diff, compare, pixelmatch, SSIM, visual regression in plugin and TS; nothing found.

  • rg image.?diff|pixelmatch|ssim|visual.?regression: no relevant matches
  • package.json has no sharp, pngjs, jimp or pixelmatch dependency

Animation frame captures with pose-change proof (No): Searched animation frame capture and pose diff; none found.

Image A/B diff with measured statistics (No): Searched image diff, compare image or screenshot, pixel diff, ssim; no image comparison operation found.

  • VibeUE (rg image.?diff|compare.?image|pixel.?diff: no hits)

Animation frame captures with pose-change proof (Partial): Renders PNG pose captures per time or frame count; no pose change comparison or proof.

Image A/B diff with measured statistics (No): Searched image diff, rmse, psnr, ssim, pixel compare; compare actions cover assets and meshes, not images.

Animation frame captures with pose-change proof (Partial): editor.capture_anim_frames renders anim PNG frames; output has no pose change check.

Capture defect detectionFlags bad captures: z-fighting, blank or off-target frames, and jerky camera paths.

Z-fighting detection with culprit actors (Yes): render.detect_z_fighting returns affected pixels, pass/fail, regions with actors[] and a mask PNG.

Blank or out-of-frame capture detection (Yes): Captures report blank, framing.boundsInFrame/behindCamera and subjectCoverage for empty frames.

Camera path motion-quality gate (Yes): sequencer.measure_motion reports analytic speed, accel, jerk, curvature, angular rate and loop seam continuity.

Z-fighting detection with culprit actors (No): Searched z-fight, coplanar, flicker; only pairwise test_component_overlap for named components exists.

Blank or out-of-frame capture detection (No): Searched blank, black frame, luminance, histogram, offscreen; captures return camera metadata only.

Camera path motion-quality gate (No): Searched jitter, jerk, smoothness, motion quality, camera path; hits are only fracture and grid spawn params.

  • grep -i jitter|jerk|smoothness|motion.?quality over src, plugin, docs: only docs/tool-reference.md:340 fracture jitter and :684 grid spawn jitter

Z-fighting detection with culprit actors (No): Searched toolsets, MCP and registry for z-fight, coplanar, overlap render checks; no such tool exists.

  • grep z.?fight|coplanar over Engine/Plugins/Experimental/{ModelContextProtocol,ToolsetRegistry,Toolsets}: no hits

Blank or out-of-frame capture detection (Partial): No blank image check; GetVisibleActors frustum test and WorldPosToScreenCoords allow manual in-frame checks.

  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:292 GetVisibleActors
  • Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:300 WorldPosToScreenCoords
  • grep blank|luminance over toolsets: no capture validation

Camera path motion-quality gate (No): Searched toolsets and MCP plugin for jerk, smoothness, motion quality and camera path checks; none.

  • grep -iE 'jerk|smoothness|motion.quality' over Experimental/Toolsets, ModelContextProtocol, ToolsetRegistry sources: only binary .pdb hits

Z-fighting detection with culprit actors (No): Searched plugin and TS source for z-fight, coplanar, overlapping faces; no detection operation found.

  • rg (?i)z.?fight|coplanar over Unreal_mcp: only unrelated hits (LightmassImportanceVolume, pessimistic)

Blank or out-of-frame capture detection (No): No pixel analysis of captures; screenshot only fronts a covered level tab to avoid black frames.

Camera path motion-quality gate (No): Searched jerk, camera_path, motion quality, smoothness in src and plugins; no camera path quality check.

  • grep camera_path|jerk|motion.quality across src and plugins: no sequence hits

Z-fighting detection with culprit actors (No): Searched z-fight, coplanar, depth fight in Source and Content; no detection or culprit actor reporting.

  • VibeUE (rg z.?fight|coplanar: no hits)

Blank or out-of-frame capture detection (No): Captures only reject minimized windows or empty readback; no blank, black or out of frame pixel check.

Camera path motion-quality gate (No): Searched VibeUE and Epic toolsets for camera path jitter/smoothness checks; none found.

  • rg sequencer|LevelSequence|CineCamera over VibeUE: only viewport set_allow_cinematic_control
  • rg jitter over Engine/Plugins/Experimental/Toolsets: no matches

Z-fighting detection with culprit actors (No): Searched z-fight, coplanar, flicker; only placement offset comments, no detection action.

Blank or out-of-frame capture detection (Partial): PIE clip frames flagged invalid when uniform or all black; no out-of-frame check, not on other captures.

Camera path motion-quality gate (No): Searched jerk, motion_quality, camera_path, CineCamera in Source and Docs; no camera path quality check.

  • rg jerk|motion_quality|camera_path over Source, Docs, wiki, Skills: no hits

Also possible without an MCP server

These are tasks a coding agent already does with its own file, search and shell tools, for example running Build.bat or GenerateProjectFiles, editing .uproject or .ini files, or reading Saved/Logs. The rows are shown for completeness and are not counted in the totals or in the filter for rows where products differ.

FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Headless build commandFrom CLI and setupBuild.bat, RunUAT BuildCookRun or UnrealBuildTool with <Target>Editor Win64 Development -Project=... compiles the project from the shell with the editor closed.

Headless build command (Partial): No standalone CLI; system.run_ubt runs UBT as a job but needs a running editor; live_coding_compile too.

Headless UBT build (Partial): system.run_ubt spawns UBT as a job but needs a running editor; no editor-less build op.

Headless build command (Yes): ue-mcp build runs UnrealBuildTool out of process with editor stopped; also project(build) tool action.

Headless UBT build (Yes): project.build / editor.build_project run UnrealBuildTool out of process with editor stopped.

Headless build command (No): No headless build command; searched UnrealBuildTool/Build.bat/RunUAT; only CompileLiveCoding in running editor.

  • Engine/Plugins/Experimental/Toolsets/LiveCodingToolset/Source/LiveCodingToolset/Public/LiveCodingToolset.h ULiveCodingToolset::CompileLiveCoding

Headless UBT build (No): No UBT invocation; only Live Coding compile from inside the running editor.

  • Engine/Plugins/Experimental/Toolsets/LiveCodingToolset/Source/LiveCodingToolset/Public/LiveCodingToolset.h:27

Headless build command (Yes): run_ubt MCP action spawns UnrealBuildTool from Node without the editor; bridge is only a fallback.

Headless UBT build (Yes): run_ubt spawns UnrealBuildTool from the TS server, bridge fallback.

Headless build command (Yes): BuildPlugin.bat runs RunUAT BuildPlugin and Build.bat editor target without launching the editor.

Headless UBT build (Partial): BuildAndLaunchGame.ps1 runs Build.bat for the editor target; external script, not an MCP operation.

Headless build command (No): editor.trigger_build is Live Coding in a running editor; UBT use only in maintainer make_release.ps1.

Headless UBT build (No): Only Live Coding in running editor; UBT appears only in release script make_release.ps1, not an action.

Build errors / log searchFrom Editor, build and C++ sourceBuild errors come from Build.bat/UBT stdout and Saved/Logs/*.log (plus UnrealBuildTool Log.txt and previous-run backup logs), all greppable text; only the in-editor Message Log panel view (get_message_log in one product) is not guaranteed to be in those files.

run_ubt captures UBT output and live coding returns log tail; no general log read or search op found.

Evidence

build_project returns compiler output; get_log, search_log over 4096 line ring, get_message_log.

Evidence

GetLogEntries filters session log by category and regex; Live Coding returns UBT diagnostics.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/LogsToolset.h:29 ULogsToolset::GetLogEntries
  • Engine/Plugins/Experimental/Toolsets/LiveCodingToolset/Source/LiveCodingToolset/Public/LiveCodingToolset.h:27

GetEnvironment reports last build status; Analyse scans trace; log search via Epic toolset LogsToolset.

Evidence

get_build_errors, search_build_output, get_compile_output, search_logs, tail_log over captured editor log.

Evidence
Generate project filesFrom Editor, build and C++ sourceGenerateProjectFiles.bat or UnrealBuildTool -ProjectFiles -Project=... runs from the shell without the editor.

Searched GenerateProjectFiles and ProjectFiles; no op. run_ubt has raw additionalArgs only.

Evidence

project.generate_project_files launches GenerateProjectFiles script or UBT; needs live editor.

Evidence

Searched GenerateProjectFiles, UnrealBuildTool; no project file generation tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep GenerateProjectFiles: no hits)

Searched GenerateProjectFiles, generate_project_files, projectfiles; no op.

Evidence
  • rg GenerateProjectFiles|projectfiles|generate_project over src and plugins: README mention only

Searched GenerateProjectFiles in Source, scripts and docs; no matches.

Evidence
  • grep GenerateProjectFiles returned no matches

No project file generation; searched GenerateProjectFiles, projectfiles, UnrealBuildTool invocations.

Evidence
C++ symbol verify / header lintFrom Editor, build and C++ sourceA Build.bat compile is the authoritative symbol and header check, and grep over Engine/Source headers finds declarations, deprecations and the owning module for Build.cs dependencies.

No header lint or source symbol check; reflection lookups only confirm live UCLASS/UFUNCTION symbols.

Evidence

verify_symbols, lint_cpp_header, suggest_build_deps against a regex engine symbol index.

Evidence

Searched symbol, header, lint, include; no C++ symbol verification or header lint tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets (no matching AICallable or tool_call)

Searched symbol verify, header lint, header; no C++ source analysis ops.

Evidence
  • rg header|lint in capability records: no C++ lint op

Searched for symbol verification, header lint, include checks; none found.

Evidence
  • grep over Source for header lint/symbol verify returned nothing

source.verify_symbols, lint_header, check_deprecations, get_signature, audit_module_dep_reality.

Evidence
Standalone game launch + traceFrom Editor, build and C++ sourceUnrealEditor.exe <Project>.uproject <Map> -game -trace=default,... -tracefile=... (or the packaged exe) launches from the shell, with process status/stop via tasklist/taskkill or ps/kill.

editor.launch_standalone launches -game processes; tracing only via raw extraArgs.

Evidence

launch_standalone with -trace/-tracefile, get_standalone_status, stop_standalone.

Evidence

StartPIE downgrades NewProcess and other out of process play modes to in viewport; no game launch.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:926 out-of-process fallback
  • EditorAppToolset.h:42 FPIESessionOptions::PlayMode

StartStandalone launches separate game process with Insights trace; Stop and status verify PID and file.

Evidence

No standalone game launch; searched CreateProc, launch; traces only inside editor PIE sessions.

Evidence
Enable/disable engine pluginsFrom Editor, build and C++ sourcePlugin enable/disable is the "Plugins" array in the .uproject JSON, and available plugins are found by globbing *.uplugin under Engine/Plugins and Plugins/; both routes need an editor restart.

Searched SetEnabled, enable_plugin, uplugin; only game_features.list reads plugin state.

Evidence

enable_plugin, disable_plugin edit .uproject; list_available_plugins.

Evidence

PluginToolset SetPluginEnabled, IsEnabled, ListEnabledPlugins, ListDiscoveredPlugins.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:293 SetPluginEnabled, :170 ListEnabledPlugins

VibeUE only lists enabled plugins in GetEnvironment; toggle via Epic toolset PluginToolset.

Evidence

Only read-only get_module_status; searched SetPluginEnabled, IProjectManager for toggling.

Evidence
Create plugins and edit plugin descriptorsFrom Editor, build and C++ sourceA plugin is a folder with a .uplugin JSON descriptor, Source/<Module>/*.Build.cs and module .h/.cpp, all writable as text (or copied from Engine/Plugins/Editor/PluginBrowser/Templates).

Searched plugin creation and .uplugin edit ops; none found.

Evidence
  • wiki page index

epic_create_plugin, epic_update_plugin_descriptor via wrapped Epic toolset, UE 5.8 only.

Evidence

CreatePlugin from templates, GetPluginDescriptor, UpdatePluginDescriptor, Add/RemovePluginDependency.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:271 CreatePlugin, :313 UpdatePluginDescriptor, :325 AddPluginDependency

Searched create_plugin, IPluginWizard, PluginUtils, descriptor writes; only enable/disable/list.

Evidence
  • rg create_plugin|IPluginWizard|PluginUtils over src and plugins: no hits
  • SystemControlHandlersPlugins.cpp:22 reads FPluginDescriptor only

No VibeUE plugin authoring; via Epic toolset PluginToolset CreatePlugin, UpdatePluginDescriptor.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PluginToolset

Searched uplugin writing, FPluginDescriptor, plugin creation; descriptors only read, no create or edit.

Evidence
Project C++ source read, write and class creationFrom Editor, build and C++ sourceReading and writing .h/.cpp under Source/ and creating a class (header, source, UCLASS macros, .generated.h include) is plain file editing followed by a build.

Read/write project C++ (No): No file read/write namespace; searched wiki and Source for file/cpp/source ops.

  • wiki page index

Create C++ class (No): Searched GameProjectUtils, AddCodeToProject, create_cpp; no C++ class creation op.

  • Plugins/PinWright/Source (grep GameProjectUtils|AddCodeToProject: no handler)

Read/write project C++ (Yes): read_cpp_header, read_cpp_source, write_cpp_file, read/write_source_file, add_cpp_member.

Create C++ class (Yes): project.create_cpp_class via engine New C++ Class template path.

Read/write project C++ (No): read_file/write_file only under Content or Saved and only txt/json/csv/html/py/md; no .h/.cpp access.

  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:491 read_file, :526 write_file, :524 _WRITABLE_EXTENSIONS

Create C++ class (No): Searched GameProjectUtils, NewClassDialog, AddCodeToProject; no C++ class creation tool.

  • Engine/Plugins/Experimental/Toolsets (grep GameProjectUtils|AddCodeToProject: no hits)

Read/write project C++ (Partial): No source file read/write op; only reachable through execute_python file I/O.

Create C++ class (Partial): No class wizard op; only by writing .h/.cpp through execute_python, then compiling with run_ubt.

Read/write project C++ (Partial): No C++ source tool; only reachable through execute_python_code file I/O.

Create C++ class (No): Searched GameProjectUtils, AddCodeToProject, NewClass, create_cpp; nothing found.

  • grep over Source and Content returned no matches

Read/write project C++ (Partial): source.read_file reads any source; writes only via GAS AttributeSet edits, no general C++ file write.

Create C++ class (Partial): generate_class_stub returns text only; gas.create_attribute_set cpp and ui.scaffold_* write fixed-base classes.

Engine source search and call graphsFrom Editor, build and C++ sourcerg or grep over Engine/Source finds any text in seconds. A prebuilt index mainly makes repeated queries faster.

Engine source FTS search (No): Searched for engine source search or FTS ops in wiki and Source; none found.

  • wiki page index

Engine call graphs (No): Searched for call graph or callgraph ops in wiki and Source; none found.

  • wiki page index

Engine source FTS search (Partial): search_engine_cpp is an unindexed linear substring scan per query; symbol index covers declarations only.

Engine call graphs (Yes): find_callers, find_callees, find_references over engine source (regex text based).

Engine source FTS search (No): No engine source search; SemanticSearchToolset searches indexed Content Browser assets only.

  • Engine/Plugins/Experimental/Toolsets/SemanticSearchToolset/Source/SemanticSearchToolset/Private/SemanticSearchToolset.h:56 Search (assets only)

Engine call graphs (No): Searched for call graph, caller or callee tools across toolsets; none found.

  • Engine/Plugins/Experimental/Toolsets (grep call graph|callers: no hits)

Engine source FTS search (No): Searched FTS, full text, ripgrep, sqlite, engine source; no engine source search.

  • rg fts|full.?text|ripgrep|sqlite|engine source over src: no hits

Engine call graphs (No): Searched call graph, callgraph, callers, callees; not found.

  • rg call.?graph|callers|callees over src and plugins: only code comments

Engine source FTS search (No): Searched for engine source search; GetEnvironment only reports paths; Epic SemanticSearch covers assets only.

Engine call graphs (No): Searched for call graph or caller/callee tooling; none found.

  • grep caller/callee/call graph over Source returned nothing relevant

Engine source FTS search (Yes): source.search_source FTS/regex/exact over engine source and shaders from local SQLite index.

Engine call graphs (Yes): source.find_callers, find_callees, find_references over the engine source index.

Crash report listingFrom Reliability and diagnosticsCrash reports are folders under Saved/Crashes/ holding CrashContext.runtime-xml, the log and minidump, listable and greppable with ls/grep/Read.

Saved/Crashes is scanned only inside test run verdicts; no RPC lists crash reports.

Evidence

editor list_crashes, get_crash_info, check_for_crashes backed by C++ handlers.

Evidence

Searched crash in MCP, ToolsetRegistry, Toolsets; LogsToolset reads only the current log.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/LogsToolset.h:28-62 GetLogEntries only

read_log source=previous reads earlier run logs; previous-session snapshot; no Saved/Crashes listing.

Evidence

Searched CrashReportClient, Saved/Crashes, crash report in Source, Python, skills; only launch script kill.

Evidence

editor get_crash_context reads one CrashContext.runtime-xml plus Ensures.log; no list of Saved/Crashes.

Evidence
Read / write INIFrom Config and INIINI files under Config/ (Default*.ini) are plain text, so reading, grepping and writing section/key lines needs only file tools.

Read INI (Partial): No generic INI key read; rendering.get_project_settings reads RendererSettings only; other keys via property.get or python.

Write INI (Partial): Only scoped writers: RendererSettings to DefaultEngine.ini, gameplay tags to their ini; anything else via python.execute.

Read INI (Yes): project(read_config) parses one Default*.ini; search_config greps all project INI files.

Write INI (Yes): project(set_config) writes section/key/value to a project Default*.ini via GConfig, verifies on disk.

Read INI (Partial): Settings section values via GetSectionPropertyValues; raw project Config .ini text only via sandbox script open().

  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:75 GetSectionPropertyValues
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:84 _FileOpener read-only open under project dir
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:522 _WRITABLE_EXTENSIONS excludes .ini

Write INI (Partial): SetSectionProperties writes settings section properties to Default*.ini; no raw section/key write.

  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:96 SetSectionProperties
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.cpp:323 UpdateSinglePropertyInConfigFile
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:86 sandbox open allows only r/rb/rt modes

Read INI (Yes): system_control get_project_settings exports config properties of a settings CDO, falls back to raw Default*.ini key.

Write INI (Yes): set_project_setting sets CDO property or GConfig key, persists to project Default*.ini, verifies on disk.

Read INI (Yes): get_ini_value, get_ini_array, list_ini_sections, list_ini_keys on ProjectSettingsService and EngineSettingsService.

Write INI (Yes): set_ini_value, set_ini_array plus save_config; set_console_variable also persists to DefaultEngine.ini.

Read INI (Yes): config resolve_setting, get_section, search_config, get_config_files read INI keys, sections and files.

Write INI (Partial): No raw INI key write; set_developer_setting saves only UDeveloperSettings CDOs via SaveConfig, editor only.

Localization gather and compileFrom Project and asset managementUnrealEditor-Cmd <Project> -run=GatherText -config=Config/Localization/<Target>_Gather.ini (and _Compile.ini) runs the gather and compile from the shell; the tool only tracks the commandlet as a job.

localization.gather and localization.compile run GatherText configs as tracked commandlet jobs.

Evidence

Searched GatherText, localization commandlet, localization target in src, plugin, docs; no action.

Evidence
  • grep GatherText|LocalizationCommandlet|ULocalizationTarget|gather_text|compile_loc over src/ plugin/ docs/: no matches

Searched locali, GatherText, gather; only StringTable editing, no gather or compile tool.

Evidence
  • grep -i locali|GatherText over Experimental\Toolsets: no tool hits
  • string_table.py tools only

Searched GatherText, localiz, culture: only widget set_localization_key and bind_localized_text.

Evidence

Searched Localiz, GatherText, LocalizationCommandlet; only an FText type label.

Evidence

Localization namespace has 4 read-only actions; searched GatherText, Commandlet; no gather or compile.

Evidence

Audited versions: PinWright: master 71c91649 (after v0.8.0); ue-mcp: db-lyon/ue-mcp e6a706f (2026-09-26); Epic UE 5.8 MCP: UE 5.8.0 engine plugins; ChiR24 Unreal_mcp: ChiR24/Unreal_mcp e45c6e2 (2026-09-25); VibeUE: kevinpbuckley/VibeUE a231dcb (2026-09-24); Monolith: tumourlove/monolith 191ea54 (2026-09-10). Checked 2026-09-28.