PinWright

How PinWright compares

At a glance

224 of 341 features fully supported, the most of any tool compared

  1. PinWright : 224 Yes, 87 Partial, 30 No, of 341 graded features
  2. ue-mcp : 177 Yes, 115 Partial, 49 No, of 341 graded features
  3. Monolith : 110 Yes, 151 Partial, 79 No, of 340 graded features
  4. ChiR24 Unreal_mcp : 100 Yes, 132 Partial, 109 No, of 341 graded features
  5. Epic UE 5.8 MCP : 73 Yes, 124 Partial, 142 No, of 339 graded features
  6. VibeUE : 59 Yes, 188 Partial, 94 No, of 341 graded features

Counts graded features only, read from each project's source code: 341 rows (Monolith 340, Epic UE 5.8 MCP 339, where some rows do not apply). Value rows such as versions and license are not graded. Totals as a table

This page compares six tools that let your AI assistant 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

  • YesThe source implements the feature as the row describes it.
  • PartialLimited, available only through general-purpose Python or console execution, or needs an extra plugin or install. Python or console access counts as Partial for every product alike, and only when an engine function or setting already does the job; when the assistant would have to write the logic itself, the cell is No.
  • NoNot found in the source.
  • n/aNot applicable: the row does not apply to that product.
  • 5.3 to 5.8Value: rows such as versions, platforms or license show a short value instead of a mark.
  • Some rows combine several related features, listed under the row name. Such a row is Yes only when the product has every one of them, and Partial when it has some. A combined row whose name offers alternatives with "or" is Yes when the product has any one of them.
  • CRUD in a row name means create, read, update and delete.

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

Totals

ProductYesPartialNo
PinWright2248730
ue-mcp17711549
Epic UE 5.8 MCP73124142
ChiR24 Unreal_mcp100132109
VibeUE5918894
Monolith11015179

Counts cover 346 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

  • If a Blueprint edit breaks compilation, PinWright rolls it back. It can also insert logic at a chosen node, or swap a node's type while keeping its connections.
  • PinWright refuses to save over changes made on disk outside the editor, and it reports whether each save was written or deferred.
  • It can compare two captures and report measured differences, detect Z-fighting and name the actors involved, and flag blank or out-of-frame shots.
  • Anim Blueprint graphs, Control Rig graphs and material graphs can be decompiled to text. Animation clips, skeletons and meshes can be built from text.
  • It runs automation test groups in separate processes, launches the editor without a window, and exports Insights traces as CSV tables.
  • Game code can write gameplay events to a journal, and recorded sessions can be queried for state, minimum and maximum values, and events.
  • It keeps a reference page for every editor action on disk for your assistant, writes very large results to a file instead of the chat, and keeps an offline text copy of your assets that you can search with grep.
  • It can find free space that avoids collisions, check that an actor's footprint touches the ground, and place an actor on top of or against another.
  • It measures loudness and spectrum, compares a sound against a reference, renders MetaSounds offline and synthesizes sounds.
  • It also covers a gameplay tag query builder and a level-wide audit of Niagara systems that can crash.
  • It supervises what it launches: offscreen editors, test runs and builds run memory-capped at low priority and keep running if your assistant's process is killed, and a test run ends in a verdict that names the run's own crashes.
  • It checks results that other tools leave to your assistant: landscape stair-stepping and layer-paint side effects, foliage instances stored against drawn, lighting that scalability settings would disable, mesh parts that separate during animation, and decoded Movie Render Queue frames.

What other tools cover that PinWright does not fully cover

  • macOS: ue-mcp, Epic's MCP, ChiR24 and VibeUE support it, and Monolith's README lists it. PinWright runs on Windows and Linux only.
  • Access control: blocking dangerous console and script input (Epic's MCP, ChiR24), consent before destructive calls (ChiR24), approval before starting play with Blueprint errors (ue-mcp), scoped access tokens and remote access that is refused unless authentication is set up (ChiR24), and asset locking between agents (ue-mcp). PinWright refuses only dangerous console commands, not Python, and has none of the others.
  • Importing meshes, textures and animations with import options (ue-mcp, Epic's MCP, ChiR24, Monolith), and import pipeline assets and texture change detection (ue-mcp). PinWright's import is partial.
  • Bulk Blueprint work: automatic graph layout (ue-mcp, Epic's MCP, VibeUE, Monolith). PinWright is partial.
  • Switching tool categories on or off (ue-mcp, Epic's MCP, ChiR24, Monolith).
  • Marking each tool as read-only or destructive for your assistant, through MCP tool annotations (Monolith).
  • Analysis without a running editor (Monolith).
  • Gameplay debugging: Gameplay Ability System traces and state snapshots (ue-mcp, Monolith), navigation rebuild and path queries (ue-mcp, Monolith), Blackboard editing (ue-mcp, VibeUE, Monolith) and Enhanced Input audits (ue-mcp, Monolith).
  • Animation and data authoring: CurveTable and StringTable authoring (ue-mcp, Epic's MCP, Monolith).
  • UI: MVVM bindings (Epic's MCP, VibeUE), and accessibility and CommonUI audits (ue-mcp, Monolith).
  • Frame timing with a bottleneck verdict (ue-mcp, VibeUE).

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 a layered auto-material builder (its height and slope masks do not drive the blend), 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

Architecture and install

1 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Works without a C++ project
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Partial

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

Evidence
Yes

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

Evidence
Yes

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

Evidence
Precompiled binaries
Yes

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

Evidence
No

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

Evidence
Yes

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

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

Evidence
Partial

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

Evidence
Yes

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
Yes

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

Evidence
Yes

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

Evidence
Yes

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)
Yes

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
Partial

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

Evidence
Yes

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
Operation count (units differ per product)
1,305

1,305 operations in 67 public namespaces, all behind one MCP tool named call.

Evidence
  • Source/PinWright/Private/Catalog/WikiHandler.cpp:915-960 GetRegistryStats: the registry's operation count, one per registered handler, grouped by registered category
  • Recounted at master ae877ccc from the REGISTER_*HANDLER calls outside Source/**/Tests, grouped as GetRegistryStats does: 1,306 operations in 68 namespaces. The same count gives 1,270 in 68 at 04d86b1c, equal to product-facts.json there
  • product-facts.json:12 still reads 1270 at ae877ccc (not regenerated since 04d86b1c)
  • Not counted: the internal pipeline namespace, 1 operation
  • wiki page index
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
Yes

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

Evidence
Yes

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

Evidence
Yes

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
No

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

Evidence
Partial

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

Evidence
No

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
Yes

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

Evidence
No

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

Evidence
Yes

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)
Yes

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

Evidence
Yes

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

Evidence
Yes

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

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.
Partial

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
Yes

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.

No

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)
Partial

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.

No

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
Partial

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

2 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Generates agent instruction files
Partial

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

Evidence
Partial

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

Evidence
No

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

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

Evidence
Yes

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

Evidence
No

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.
Partial

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.

Yes

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).

No

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
Partial

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
Partial

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.

Partial

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.
Yes

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.

Yes

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.

Partial

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
Partial

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.

No

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.

No

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

3 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Function CRUD
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Partial
Partial

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

Evidence
Yes

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

Evidence
Node CRUD + connect
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Yes
Yes

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

Evidence
Yes

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

Evidence
Batch connect (single compile)
Yes

blueprint.graph.connect_pins_batch wires many pin pairs in one call and one undo transaction; compile=true compiles once after all links.

Evidence
Yes

connect_pins_batch applies many connections then compiles and saves once.

Evidence
Yes

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
Yes

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

Evidence
Yes

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

Evidence
Yes

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

Evidence
Auto-layout graph
Partial

BPIR compile and insert auto-lay out the nodes they create when the body has no @(x,y) positions; no op re-lays out an existing Blueprint graph. material.authoring.auto_layout places material expressions still at (0,0).

Evidence
Yes

auto_layout topological layered layout, returns previous positions for undo.

Evidence
Yes

arrange_nodes runs a layered left to right layout: Kahn longest-path layering, width-aware columns and overlap push-down. Each column keeps the nodes' current vertical order (no crossing minimisation) and cycles are not broken.

Evidence
  • blueprint.py:1030 arrange_nodes
  • blueprint_layout.py:84 GraphFormatter
  • blueprint_layout.py:270-277 (column order sorted by current Y)
  • blueprint_layout.py:455-481 _assign_layers (Kahn queue, no cycle breaking)
Partial
Yes

auto_layout_graph, auto_layout_selected_nodes, analyze_graph_layout quality report.

Evidence
Yes

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

Evidence
Bulk graph rewrite (T3D/JSON)
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Partial

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

Evidence
Partial

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

Evidence
Yes

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

Evidence
Set class default (CDO) property
Yes

blueprint.set_default writes CDO property via reflection and compiles.

Evidence
Yes

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

Evidence
Yes

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
Yes

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

Evidence
Yes

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

Evidence
Yes

set_cdo_property and set_cdo_properties write Blueprint CDO values via ImportText.

Evidence
Compile / batch compile
Yes

blueprint.compile_batch compiles an asset list or folder in one job, one row per Blueprint with errors.

Evidence
Yes

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

Evidence
Yes

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
Partial

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

Evidence
Partial

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

Evidence
Partial

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

Evidence
Validate without saving
Yes

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

Evidence
Yes

validate compiles with SkipSave and returns diagnostics.

Evidence
Partial

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
Yes

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

Evidence
Yes

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

Evidence
Yes

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

Evidence
Interfaces / dispatchers / macros
Yes

add_interface, remove_interface, add_dispatcher, add_macro, decompile_macro.

Evidence
Yes

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

Evidence
Partial

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
Partial

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

Evidence
Yes

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

Evidence
Yes

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

Evidence
Construction script preview
Yes

blueprint.preview_construction runs construction scripts on a transient instance; reports components, bounds.

Evidence
Yes

run_construction_script spawns temp actor and returns generated components and transforms.

Evidence
No

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
No

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

Evidence
Partial

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

Evidence
Partial

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

Evidence
Auto-rollback when an edit breaks compile
Yes

compile_bpir and insert_bpir roll back when the compile fails; allowPreexistingErrors keeps edits on an already-broken BP; undo_last_bpir.

Evidence
Partial

Wraps Epic write_graph_dsl, which rolls back on transpile error (UE 5.8 only); own flow rollback ignores compile errors.

Evidence
Partial

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
No

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

Evidence
Partial

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

Evidence
No

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

Evidence
Reparent Blueprint to new parent class
Yes

blueprint.reparent changes parent UClass and recompiles.

Evidence
Yes

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

Evidence
Yes

set_parent calls BlueprintEditorLibrary.reparent_blueprint.

Evidence
  • blueprint.py:1134 set_parent
Partial
Partial

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

Evidence
Yes

reparent_blueprint changes a Blueprint's parent class.

Evidence
Dead Blueprint code detection and cleanup
Yes

find_orphaned_nodes, delete_orphaned_nodes and delete_unused_variables with dryRun.

Evidence
Partial

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

Evidence
Partial

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
Partial

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

Evidence
Partial

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

Evidence
Partial

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

Evidence
Callable-API index and node pin preview
Yes

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

Evidence
Partial

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

Evidence
Yes

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
Partial

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

Evidence
Partial

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

Evidence
Yes

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

Evidence
Timeline authoring (tracks and keys)
Yes

BPIR timeline instruction authors float, vector, linear color and event tracks with keys, interpolation and tangents, plus length, loop and autoplay; decompile emits the same form, so tracks round-trip.

Evidence
Yes

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

Evidence
No

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

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

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

Evidence
Yes

add_timeline, add_timeline_track, set_timeline_keys, get_timeline_data.

Evidence
Blueprint override drift vs native defaults
Partial

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

Evidence
No

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

Evidence
No

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
No

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

Evidence
No

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

Evidence
Yes

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.
Yes

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.

Yes

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.

Yes

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
Yes

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.

Yes

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.

Yes

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.
Yes

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.

Yes

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.

Yes

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
Yes

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

Component CRUD (Yes): SCS add/remove/reparent component, set property and transform, get_scs.

Yes

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.

Yes

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.
Yes

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.

Yes

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.

Partial

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
No

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
Partial

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.

Partial

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.
Yes

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.

Partial

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.

Partial

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
No

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
Partial

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.

Partial

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.
Yes

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.

Partial

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.

Partial

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
No

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
Partial

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
No

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

4 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Build graph from JSON
Yes

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

Evidence
Partial

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

Evidence
Partial

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
Yes
Partial

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

Evidence
Yes

build_material_graph takes a JSON graph_spec; import_material_graph overwrite or merge.

Evidence
Custom HLSL node
Yes

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

Evidence
Yes

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

Evidence
Partial

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
Yes
Yes

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

Evidence
Yes

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

Evidence
Recompile dependent materials
Yes

compile_material and compile_mgir recompile, recache dependent instances and rebuild landscape component MICs (consumerRefresh).

Evidence
Yes

recompile with recompileChildren walks MaterialInstanceConstants whose parent chain reaches it.

Evidence
Yes

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
Partial
Partial

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

Evidence
Yes

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

Evidence
Render preview PNG
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Yes
Partial

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

Evidence
Yes

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

Evidence
Material function authoring
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Yes
Yes

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

Evidence
Yes

create_material_function, build_function_graph, export, metadata, function instances.

Evidence
Shader stats / graph validation
Yes

get_material_stats measures instruction counts and samplers; material.audit checks graphs; compile errors.

Evidence
Partial

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

Evidence
Partial

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
Partial
Partial

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

Evidence
Yes

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

Evidence
Material graph decompile to editable text
Yes

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

Evidence
Partial

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

Evidence
No

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
No

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

Evidence
Partial

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

Evidence
Partial

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

Evidence
Material layer and layer-blend stacks
Yes

create_material_layer, create_material_layer_blend, set_material_layer_stack fills Layers/Blends arrays.

Evidence
Partial

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
No

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
No
No

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

Evidence
Partial

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

Evidence
Material Parameter Collection authoring
Yes

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

Evidence
Partial

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

Evidence
Partial

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
No

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

Evidence
Partial

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

Evidence
Partial

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

Evidence
Procedural texture generation and processing
Yes

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

Evidence
No

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
No

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
Yes
No

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

Evidence
Partial

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

Evidence
Landscape auto-material (height/slope blend)
Partial

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

Evidence
No

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

Evidence
No

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
Partial
Partial

CreateAutoMaterial builds a layered landscape material, but SetupHeightSlopeBlend sets the layer to LB_AlphaBlend and wires the height or slope mask into HeightInput, which the engine does not compile for alpha-blend layers and clears on any layer that is not height-blend; the blend follows painted weights, and VibeUE's skill says auto-blend does not appear at zero weights.

Evidence
No

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

Evidence
Material instance base-property overrides (blend mode, shading model, two-sided)
Yes

set_material_instance_base_property_overrides sets or clears each override, rebuilds the static permutation, returns effective values.

Evidence
Partial

No override op; only via generic asset set_property on the BasePropertyOverrides struct, then PostEditChange.

Evidence
Partial

No override tool; only via generic object set_properties writing the BasePropertyOverrides struct.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties
  • Engine/Plugins/Experimental/ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/ToolsetLibrary.cpp:157 CanSetPropertyValue, :204 ImportPropertyWithNotify
  • Engine/Source/Runtime/Engine/Public/Materials/MaterialInstance.h:820 BasePropertyOverrides UPROPERTY(EditAnywhere)
  • grep -iE 'BasePropertyOverrides|bOverride_BlendMode' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
Partial

No override op; only via generic set_object_property on a nested BasePropertyOverrides path, then PostEditChange.

Evidence
Partial

No override op; MaterialService set_property can ImportText the BasePropertyOverrides struct on an instance, then PostEditChange.

Evidence
Partial

No override op; set_material_property targets base materials; only via generic set_property_at_path into BasePropertyOverrides.

Evidence
Light function atlas compatibility check and override
Yes

get_material_info measures atlas compatibility off the shader map; set_light_function_atlas_compatible overrides and reads back.

Evidence
Partial

No atlas check; override flag only via generic asset set_property on bForceCompatibleWithLightFunctionAtlas.

Evidence
  • src/tools/asset.ts:322 set_property
  • Engine/Source/Runtime/Engine/Public/Materials/Material.h:926 bForceCompatibleWithLightFunctionAtlas UPROPERTY(EditAnywhere)
  • grep -iE 'LightFunctionAtlas|light_function_atlas|ForceCompatibleWithLightFunction' over src, plugin, docs: no hits
Partial

No atlas check; override flag only via generic object set_properties on bForceCompatibleWithLightFunctionAtlas.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/object.py:81 set_properties
  • Engine/Source/Runtime/Engine/Public/Materials/Material.h:926 bForceCompatibleWithLightFunctionAtlas UPROPERTY(EditAnywhere)
  • grep -iE 'LightFunctionAtlas|ForceCompatibleWithLightFunction' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
Partial

No atlas check; override flag only via generic set_object_property on bForceCompatibleWithLightFunctionAtlas.

Evidence
Partial

No atlas check; override flag only via generic MaterialService set_property on bForceCompatibleWithLightFunctionAtlas.

Evidence
  • Source/VibeUE/Public/PythonAPI/UMaterialService.h:349 SetProperty
  • Engine/Source/Runtime/Engine/Public/Materials/Material.h:926 bForceCompatibleWithLightFunctionAtlas UPROPERTY(EditAnywhere)
  • grep -iE 'LightFunctionAtlas|ForceCompatibleWithLightFunction' over Source, Content: no hits
Partial

No atlas check; set_material_property sets the LightFunction domain only; flag via generic set_property_at_path.

Evidence
Create a texture from text or raw pixel data
Yes

texture.create_text_texture rasterises a font into a Texture2D; create_from_pixels takes base64 RGBA8/Gray8.

Evidence
Partial

No text or pixel texture op; import_texture reads a disk file; only via gated execute_python.

Evidence
  • src/tools/asset.ts:269 import_texture (file path), :270 create_render_target_2d
  • src/tools/editor.ts:126 execute_python
  • grep DrawText|from_pixels|base64 texture over src, plugin: no op
  • Engine/Source/Runtime/Engine/Classes/Kismet/KismetRenderingLibrary.h:89 RenderTargetCreateStaticTexture2DEditorOnly, :224 BeginDrawCanvasToRenderTarget
  • Engine/Source/Runtime/Engine/Classes/Engine/Canvas.h:591 K2_DrawText
No

Texture toolset has only import_file from a disk image and get_size; no text or pixel data tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/texture.py:15 import_file (source_file on disk), :35 get_size
Partial
Partial

ImportTexture reads a disk file; 5x7 text is internal to blockout images; only via execute_python_code.

Evidence
Partial

ui.import_texture_from_bytes makes a Texture2D from base64 encoded image bytes, not raw pixels; no text op.

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

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.

Yes

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.

Yes

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
Yes

Expression graph CRUD (Yes): add_material_node (many node types), delete_node, set_node_position, get_material_info, get_node_properties. add_material_parameter re-runs the engine's LayoutMaterialExpressions after adding the node, which repositions the connected expressions and discards hand layout.

Connect expressions (Yes): connect_nodes and disconnect_nodes (aliases connect_material_pins, break_material_connections).

Partial

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.

Yes

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.
Yes

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.

Yes

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.

Yes

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
Yes

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

Instance parameter set (Yes): set_scalar, vector, texture and static switch parameter values on instances; reset_instance_parameters.

Partial

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.

Yes

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

5 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Anim Blueprint CRUD
Yes

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

Evidence
Yes

create_anim_blueprint, read_anim_blueprint, read_anim_graph, set_anim_blueprint_skeleton, node actions.

Evidence
Partial

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
Yes
Partial

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

Evidence
Yes

create_anim_blueprint, get_abp_info, add_anim_graph_node, remove_node_slice, duplicate_reparent_and_sanitize.

Evidence
State machine CRUD
Yes

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

Evidence
Yes

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

Evidence
No

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
Yes
Yes

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

Evidence
Yes

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

Evidence
Curves CRUD
Yes

set_curve_key and set_curve_keys create curves and write keys (replace or merge), get_curve_keys and list_curves read them, remove_curve_key, remove_curve and rename_curve edit AnimSequence curves.

Evidence
Yes

add_curve, remove_curve, set_anim_curve_keys, edit_curve_metadata on skeleton.

Evidence
No

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
Partial
Yes

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

Evidence
Yes

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

Evidence
Montage CRUD
Yes

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

Evidence
Yes

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

Evidence
No

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
Yes
Yes

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

Evidence
Yes

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

Evidence
Blendspace CRUD
Yes

create_blend_space_1d/2d, create_aim_offset, add_blend_sample, add_aim_offset_sample.

Evidence
Yes

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

Evidence
Partial

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
Yes
Partial

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

Evidence
Yes

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

Evidence
IK rig / retargeter
Yes
Yes

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

Evidence
No

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
Yes
Partial

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

Evidence
Yes

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

Evidence
Pose Search
Partial

3 verbs: schema with any channel kind set by reflection, database, add animation; no index build.

Evidence
Yes

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

Evidence
Partial

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
No

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

No

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
Yes

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

Evidence
Control Rig authoring
Yes

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

Evidence
Partial

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

Evidence
Yes

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
Partial

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

Evidence
Partial

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

Evidence
Yes

add_control_rig_element, add_control_rig_node, connect_control_rig_pins, get_control_rig_graph.

Evidence
Skin weights / cloth binding
Yes
Yes

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

Evidence
Partial

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
Yes

set_vertex_weights writes a weight profile, bind_cloth_to_skeletal_mesh; copy/mirror/prune refuse, normalize/auto only rebuild.

Evidence
Partial

No own skin weight op; only via execute_python_code calling engine SkinWeightModifier (MeshModelingToolset, enabled); 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
  • Source/VibeUE/Public/Tools/PythonTools.h:46 execute_python_code
Partial

No own skin weight op; only via editor.run_python calling engine SkinWeightModifier (MeshModelingToolset); no cloth binding.

Evidence
  • Source/MonolithEditor/Private/MonolithEditorActions.cpp:824 editor.run_python
  • Engine/Plugins/Runtime/MeshModelingToolset/Source/SkeletalMeshModifiers/Public/SkinWeightModifier.h:123 SetVertexWeights, :141 NormalizeAllWeights, :168 PruneAllWeights, :84 CommitWeightsToSkeletalMesh (BlueprintCallable)
  • Engine/Plugins/Dataflow/Dataflow.uplugin:74 depends on MeshModelingToolset (Dataflow EnabledByDefault :13); Monolith.uplugin:51 GeometryScripting
  • grep -i skinweight|clothing in Source: no hits
Non-destructive Control Rig sessions
Partial

No session verbs; a documented chain bakes a clip to Control Rig, keys controls in batch, exports a new clip.

Evidence
Yes

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

Evidence
Partial

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
No

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

Partial

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

Evidence
No

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

Evidence
Batch retarget animations
Yes

retarget_animations runs the IK Retargeter batch export and verifies outputs; setup_retargeting only copies.

Evidence
Yes

batch_retarget_animations via IK Retargeter with mapping completeness report and rollback.

Evidence
No

No batch retarget; searched Retarget, IKRetargeter, batch.

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

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

Evidence
Yes

batch_retarget_animations action.

Evidence
Curve-to-morph target check
Yes

animation.check_morph_curves checks each curve matches a mesh morph and carries the MorphTarget flag.

Evidence
Yes

compare_curves_to_morph_targets matches curve names against mesh morph target names.

Evidence
No

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
No

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

Partial

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

Evidence
No

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

Evidence
Morph target creation and vertex deltas
Yes

create_morph_target, set_morph_target_deltas, set_morph_target_value, list and delete.

Evidence
No

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

Evidence
No

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
Yes
No

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

Evidence
No

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

Evidence
Skeletal sockets and virtual bones CRUD
Yes

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

Evidence
Yes

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

Evidence
Partial

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
Yes
Partial

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

Evidence
Yes

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

Evidence
Sync markers, sync groups and notify states
Yes

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

Evidence
Partial

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

Evidence
No

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()
Partial
Partial

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

Evidence
Yes

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

Evidence
Learned bone rotation limits and pose validation
No

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

Evidence
No

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

Evidence
No

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
No

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

Yes

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

Evidence
No

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

Evidence
Skin-weight quality audit
Yes

skeleton.audit_skin_weights gates zero-influence verts, weight sums, influences over the LOD limit and seam splits; reports bone coverage.

Evidence
No

No mesh-wide audit; read_skeletal_mesh_skin_weights returns weightSum and influenceCount for 1 to 256 named vertices only.

Evidence
No

skeletal_mesh toolset reads LODs, vertex counts, bones, sockets; no skin weight reads or checks.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:81 get_vertex_count, :148 get_bone_names
  • grep -iE 'skin.?weight|influence|audit_skin|unweighted' over Toolsets, ModelContextProtocol, ToolsetRegistry: no skin weight hits
No

Searched audit, zero influence, unweighted, bone coverage; auto_skin_weights only rebuilds and reports maxBoneInfluences.

Evidence
No

Searched skin weight, influence, audit terms in Source and Content; no skin weight reads or checks.

Evidence
  • grep -iE 'skin.?weight|bone.?influence|audit_skin|zero.?influence|unweighted' over Source, Content: no hits
No

analyze_skeletal_mesh checks LODs, bone count and UVs; no skin weight checks.

Evidence
Add or edit bones on a skeletal mesh (with skin-weight remap)
Yes

edit_mesh_bones batches add, remove, rename, reparent, move via SkeletonModifier; needs Mesh Modeling Toolset.

Evidence
Yes

begin/edit/commit_skeleton_edit sessions: add, remove, rename, reparent, move; needs Mesh Modeling Toolset.

Evidence
No

SkeletalMeshTools only reads bone names, parents, children; SkeletonModifier appears only in a test setup.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:148 get_bone_names, :166 get_bone_parent, :182 get_bone_children
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/tests/test_skeletal_mesh.py:56 unreal.SkeletonModifier (test setUp, not a tool)
  • grep SkeletonModifier|add_bone|remove_bone|rename_bone in Toolsets, ModelContextProtocol, ToolsetRegistry: only the test and Control Rig add_bone (checked on 5.8.2, not CL 56702186)
Partial

Mesh gets set_bone_transform only; add/remove/rename/reparent edit USkeleton; Python reaches SkeletonModifier.

Evidence
Partial

SkeletonService adds, removes, renames, moves bones; reparent is remove+re-add, subtree weights fall to root.

Evidence
Partial

No bone edit action; only editor.run_python calling engine SkeletonModifier (Mesh Modeling Toolset).

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

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; needs the GeometryScripting engine plugin.

No

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
No

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
No

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.

Partial

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
Partial

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.
Yes

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.

Yes

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.

Partial

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)
Yes

Anim sequence read/write (Yes): create_animation_sequence, set_sequence_length, key writes; get_animation_info reads length, frames, curves.

Bone track keys (Yes): add_bone_track and set_bone_key via IAnimationDataController SetBoneTrackKeys.

Yes

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.

Yes

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.
Yes

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.

Partial

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.

Partial

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
Partial

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.

Partial

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
Partial

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.
Partial

Skeleton asset bone hierarchy edits (Partial): add_bone, remove_bone, set_bone_parent edit the USkeleton; real bones renamed only by a .pwskel recompile.

Create skeleton from skeletal mesh (Yes): create_skeleton fromSkeletalMesh copies the mesh's reference skeleton bone for bone and rebinds the mesh.

Partial

Skeleton asset bone hierarchy edits (Partial): No Skeleton-asset bone verbs; mesh edit sessions reach the Skeleton only through the engine's commit merge.

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

Partial

Skeleton asset bone hierarchy edits (No): Searched toolsets for USkeleton bone edits; add_bone edits a Control Rig hierarchy; no unrestricted Python.

  • Engine/Plugins/Experimental/Toolsets/AnimationAssistantToolset/Content/Python/animation_toolset/toolsets/controlrig.py:219 add_bone (rig hierarchy)
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/programmatic.py:906 execute_tool_script (sandbox, :52 import allowlist)
  • grep add_bone|remove_bone|rename_bone|SkeletonModifier|ReferenceSkeletonModifier in Toolsets, ModelContextProtocol, ToolsetRegistry: only Control Rig add_bone and a test

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)
Partial

Skeleton asset bone hierarchy edits (Partial): add_bone, remove_bone, set_bone_parent edit the USkeleton directly; rename_bone renames virtual bones only.

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

Partial

Skeleton asset bone hierarchy edits (Partial): No Skeleton-asset bone calls; SkeletonService edits a mesh and its commit merges into the Skeleton.

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

Partial

Skeleton asset bone hierarchy edits (Partial): No skeleton bone action; editor.run_python reaches engine SkeletonModifier, whose commit updates the Skeleton.

  • Source/MonolithEditor/Private/MonolithEditorActions.cpp:824 editor.run_python
  • Engine/Plugins/Runtime/MeshModelingToolset/Source/SkeletalMeshModifiers/Public/SkeletonModifier.h:134 SetSkeletalMesh, :165 AddBone, :196 RemoveBone, :206 RenameBone, :216 ParentBone, :141 CommitSkeletonToSkeletalMesh (BlueprintCallable)
  • Engine/Plugins/Runtime/MeshModelingToolset/Source/SkeletalMeshModifiers/Private/SkeletonModifier.cpp:952 MergeAllBonesToBoneTree, :960 RecreateBoneTree (commit updates the mesh's Skeleton), :816 modal merge dialog on an incompatible hierarchy
  • grep add_bone|remove_bone|rename_bone|SkeletonModifier|FReferenceSkeletonModifier in Source: only bone tracks and a test (MonolithSetAnimNodeFnBindingTest.cpp:75)

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.
Yes

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.

Yes

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.

No

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)
No

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.

Partial

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.

Partial

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.
Partial

Live PIE bone reads (Yes): animation.get_live_pose reads the evaluated pose in PIE or editor, plus state machines, montage and curves.

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

Yes

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Partial

Contact constraints (hand/foot lock) (Yes): sequencer.pin_controls holds controls at a world transform over a frame range with blends and readback.

Viewport pose capture + propagation (Partial): get_control_values reads a frame's control pose, set_control_keys keys it at many frames; no viewport capture.

Yes

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.

Partial

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
No

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.

Partial

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.

Partial

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

6 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Create system
Yes

niagara.create_system creates an empty UNiagaraSystem asset.

Evidence
Yes

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

Evidence
Yes

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)
Yes
Partial

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

Evidence
Yes

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

Evidence
Module CRUD
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Yes
Partial

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

Evidence
Yes

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

Evidence
User parameters
Yes

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

Evidence
Partial

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

Evidence
Yes

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
Yes
Partial

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

Evidence
Yes

add/remove/rename_user_parameter, get_user_parameters, set_parameter_default.

Evidence
HLSL module create
Yes

niagara.create_module_script builds a module asset from HLSL with typed pins and compiles it; UE 5.5+.

Evidence
Yes

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

Evidence
Partial

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)
No

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
Yes

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

Evidence
Yes

create_module_from_hlsl and create_function_from_hlsl; set_custom_hlsl_text edits Custom HLSL nodes.

Evidence
Spawn VFX in level
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Yes
Partial

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

Evidence
Partial

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

Evidence
Niagara emission validation
Yes

validate checks emitters, renderers, compile and activation; niagara.simulate measures live particle counts.

Evidence
Partial

validate_niagara_system is a static heuristic: an emitter passes when enabled, with an EmitterUpdate function call whose name contains Spawn and an enabled renderer. Spawn modules in EmitterSpawn are missed, a spawn rate or burst of 0 still passes, and no runtime particle count is read.

Evidence
No

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
Partial

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

Evidence
Partial

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

Evidence
Partial

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

Evidence
Simulation stages / event handlers
Yes

add/remove_simulation_stage and add/remove_event_handler RPCs.

Evidence
Yes

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

Evidence
No

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
Yes
No

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

Evidence
Yes

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

Evidence
Compiled GPU script inspection
Yes

niagara.get_compiled_script returns GPU permutations, shader errors and the generated GPU HLSL text.

Evidence
Partial

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

Evidence
Partial

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
No

Searched GetVMExecutableData, ByteCode, GetGPUComputeScript; only enable_gpu_simulation exists.

Evidence
No

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

Evidence
Yes

get_compiled_gpu_hlsl returns compiled GPU HLSL for an emitter.

Evidence
Level-wide Niagara crash-risk audit
Yes

audit_level flags live systems whose DI counts mismatch and would crash on tick; validate reports it; remove_orphan_data_interfaces repairs.

Evidence
No

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
No

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
No

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
No

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

Evidence
No

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

Evidence
Niagara system as readable text
Yes

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

Evidence
Partial

Own get_niagara_info lists emitter names only; structured JSON via wrapped Epic GetSystemSummary/GetEmitterTopology, UE 5.8 only; no text IR.

Evidence
Partial

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
Partial

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

Evidence
Partial

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

Evidence
Partial

JSON readback (export_system_spec, get_system_summary) and create_system_from_spec JSON authoring; no text IR.

Evidence
Stack issues list and apply fix
Yes

list_stack_issues reads stack panel issues and engine fixes; apply_issue_fix runs one and re-lists.

Evidence
Partial

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

Evidence
Yes

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
Partial

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

Evidence
Partial

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

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

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

Evidence
Niagara SubUV grid checked against its atlas texture
Yes

niagara.validate subUVAtlasCheck measures each SubUV renderer's atlas cells and flags NIAGARA_SUBUV_ATLAS_SIZE_MISMATCH.

Evidence
No

Searched SubImageSize, subuv, flipbook; no SubUV grid setting or check.

Evidence
  • grep -i 'SubImageSize|sub_?uv|subimage|flipbook' over src, plugin, docs: no hits
No

Only skill prompt text saying the grid must match the texture; no tool reads or checks it.

Evidence
  • Engine/Plugins/Experimental/Toolsets/NiagaraToolsets/Content/Python/skills/renderers.py:42 SubUV guidance
  • grep -i 'SubImageSize|sub_?uv|subimage' over Toolsets, ModelContextProtocol, ToolsetRegistry: only renderers.py:42
No

Searched SubImageSize, subuv, flipbook; no SubUV grid setting or check.

Evidence
  • grep -i 'SubImageSize|sub_?uv|subimage|flipbook' over src, plugins, docs: no hits
No

Searched SubImageSize, subuv, flipbook; none, and Epic toolsets it uses have no check either.

Evidence
  • grep -i 'SubImageSize|sub_?uv|subimage|flipbook' over Source, Content: no hits
No

configure_subuv only writes SubImageSize from caller columns/rows; never reads the texture to check it.

Evidence
Emitter inheritance: stale-parent detection and merge
Yes

add_emitter keeps the parent link; validate flags EMITTER_PARENT_STALE; refresh_emitter merges parent edits, keeping overrides.

Evidence
No

create_emitter inherit=true makes a child asset; no stale-parent check or merge. Engine merge API is C++ only.

Evidence
No

AddEmitter copies from a template; no parent sync check or merge tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets/NiagaraToolsets/Source/NiagaraToolsets/Private/NiagaraToolset_System.h:463 AddEmitter (template copy, doc :454)
  • grep -i 'MergeChangesFromParent|IsSynchronizedWithParent|ParentEmitter|GetParent' over NiagaraToolsets: no hits
No

Searched merge, parent sync and inheritance terms; no emitter inheritance handling.

Evidence
  • grep -i 'MergeChangesFromParent|UpdateFromMergedCopy|IsSynchronizedWithParent|refresh_emitter|ParentEmitter|GetParent()|inherit' over src, plugins, docs: no Niagara hits
No

Searched merge, parent sync and inheritance terms; none, and Epic toolsets have none either.

Evidence
  • grep -i 'MergeChangesFromParent|UpdateFromMergedCopy|IsSynchronizedWithParent|refresh_emitter|ParentEmitter|GetParent()|inherit' over Source, Content: no Niagara hits
No

get_emitter_parent reads parent path and version only; no stale check or merge.

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

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.

Yes

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.

Yes

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
Partial

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.

Partial

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.

Yes

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

7 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Live Coding compile
Yes

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

Evidence
Yes

project.live_coding_compile via ILiveCodingModule plus live_coding_status; Windows only.

Evidence
Yes

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

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

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

Evidence
Partial

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

Evidence
Yes

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

Evidence
PIE control
Yes

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

Evidence
Yes
Yes

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
Yes

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

Evidence
Yes

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

Evidence
Yes

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

Evidence
Screenshot capture
Yes

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

Evidence
Yes

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

Evidence
Yes

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
Yes
Yes

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

Evidence
Yes

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

Evidence
Viewport camera
Yes

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

Evidence
Yes

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

Evidence
Yes

GetCameraTransform, SetCameraTransform, FocusOnActors on the level viewport.

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

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

Evidence
Yes

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

Evidence
Partial

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

Evidence
Scalability + CVar bulk set
Yes

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

Evidence
Yes

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

Evidence
No

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
Partial

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

Evidence
Yes

SetConsoleVariablesFromJson bulk cvar set; SetScalabilityLevel and SetOverallScalabilityLevel.

Evidence
Partial

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

Evidence
Reflective UFUNCTION invocation
Yes

object.call_function invokes any UFUNCTION with JSON args, returns out params; PIE RPCs use real net routing.

Evidence
Yes

invoke_object_function, invoke_function, invoke_static_function.

Evidence
No

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
Yes
Partial

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

Evidence
Partial

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

Evidence
Live PIE actor manipulation
Yes

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

Evidence
Yes

teleport_runtime_actor, set_runtime_visibility, set_object_property on live PIE actors.

Evidence
Yes

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
Yes
Yes

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

Evidence
Yes
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.
Partial

search_classes filters by parent; inspect_class returns inheritanceChain, properties, functions and interfaces; no usage examples.

Evidence
Yes

class_hierarchy and find_example_usage over engine symbol index and sources.

Evidence
Partial

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
Partial
Partial

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

Evidence
Yes

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.
Yes

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

Evidence
Partial

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

Evidence
No

No commandlet or headless editor tool; only internal ModelContextProtocolToolHashMappingCommandlet.

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

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

Evidence
No

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

Evidence
Partial

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

Evidence
Frame-exact PIE pause and single-frame step
Yes

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

Evidence
No

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

Evidence
No

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
Yes
No

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

Evidence
  • grep over Source returned no matches
No

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

Evidence
Memory report capture
Yes

performance.generate_memory_report runs memreport and returns the file path.

Evidence
Partial

get_perf_stats reads FPlatformMemory stats; memreport only via execute_command.

Evidence
No

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

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

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

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

Searched memreport, MemReport; no memory report capture action.

Evidence
Project C++ reflection index linked to assets
Partial

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

Evidence
Partial

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

Evidence
No

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
No

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

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

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

Evidence
Yes
Test-run verdict with crash attribution (fails closed)
Yes

editor_test_status needs the queue-drain marker for a verdict; crash reports count only when -Abslog and pid match the run; ensures kept apart.

Evidence
No

run_automation_tests runs in the editor and flags abandoned tests; list_crashes is not tied to a run; no drain check.

Evidence
No

AutomationTestToolset runs tests in the editor and reports counts; no crash matching; searched IsEnsure, CrashContext.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AutomationTestToolset/Source/AutomationTestToolset/Public/AutomationTestToolset.h:22-23 GetTestStatus, StopTests
  • grep -E 'IsEnsure|CrashContext|Test Queue Empty|tests performed' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
No

run_tests results go only to the Output Log; the drain marker appears only in CI script native-gates.ps1.

Evidence
  • scripts/native-gates.ps1:169 -TestExit (CI script, not a tool)
  • grep -E 'IsEnsure|CrashContext|Test Queue Empty|tests performed' over src, plugins, docs: no hits
No

No test runner of its own; searched IsEnsure, CrashContext, Test Queue Empty.

Evidence
  • grep -E 'IsEnsure|CrashContext|Test Queue Empty|tests performed' over Source, Content: only PythonExecutionService.cpp:27 FAssertInfo layout comment
No

run_automation_tests runs in the editor; get_crash_context reads the latest crash context, not tied to a run.

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

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.

Yes

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.

Partial

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)
Yes

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.

Partial

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.

Yes

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.
Yes

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.

Yes

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Yes

Editor start/stop/restart (Yes): Proxy tools editor_start and editor_restart (mode visible, offscreen or headless and a reason are required) plus editor.quit RPC.

Windowless (offscreen) editor launch (Yes): editor_start mode offscreen launches without a window on the real renderer; mode headless adds -NullRHI, where render verbs refuse with RENDERING_UNAVAILABLE.

Partial

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.

No

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
Partial

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.

Partial

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.

No

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.
Yes

Automation test runner (Yes): system.run_tests runs automation tests as a job; proxy editor_run_tests starts a capped, detached test editor and returns once the first test starts, and editor_test_status polls it.

Process-isolated automation test groups (Yes): system.run_tests isolateGroups runs each filter group in a bounded child process.

Partial

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Yes

Unreal Insights trace / profiling (Yes): insights: start/stop session, channels, export; snapshot flushes the trace ring buffer without stopping; 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.

Partial

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.

No

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)
Partial

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.

Partial

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.

Partial

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.
Yes

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.

Partial

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.

Partial

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)
Partial

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.

Partial

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.

No

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.
Partial

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.

Yes

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.

No

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)
Partial

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.

Yes

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.

Partial

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

8 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Modal dialog detection
Yes

I/O thread probe reports EDITOR_BLOCKED_ON_MODAL with modal title and seconds blocked, via ping and calls.

Evidence
Yes

Plugin publishes the active modal from the modal loop tick; server watches it and probes on demand.

Evidence
No

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
Yes
Partial

No modal detection; health file reports game thread stall seconds, which a blocking modal would raise.

Evidence
Partial

Passive watcher logs MODAL_OPEN/MODAL_CLOSE to the editor log; no MCP call reports modal state.

Evidence
Asset locking between agents
No

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
Yes

asset lock, unlock, list_locks with TTL; automatic locking of mutating calls is opt in via ue-mcp.yml.

Evidence
No

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
Partial
No

Searched lock/lease/another agent; none. BT and Blackboard edits only refuse while an asset editor is open.

Evidence
No

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)
Yes

Single call tool; namespace and method docs fetched on demand or read from the on disk wiki.

Evidence
Yes

Default micro strategy advertises one tools gateway (search, describe, call), about 2.1k tokens.

Evidence
Yes

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
Yes

Single 'unreal' tool with search, describe, execute operations over the capability catalog.

Evidence
Partial

Tool Search via Epic toolset; VibeUE adds discover_python_* tools and lazy skills via Epic AgentSkill.

Evidence
Yes

Namespace dispatch tools plus monolith_discover lists actions tersely; schema on demand.

Evidence
Includes Epic 5.8 toolsets
No

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
Yes

Wraps 824 Epic toolset tools in 52 toolsets as declared actions via epic_call_tool; UE 5.8 only.

Evidence
n/a

This product is Epic's native 5.8 MCP itself, so wrapping it does not apply.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/ModelContextProtocol.uplugin
No

Searched for Toolset, ModelContextProtocol plugin, Epic native MCP; only its own handlers and own HTTP server.

Yes

Registers into Epic's native MCP server and ToolsetRegistry; Epic toolsets served alongside on one endpoint.

Evidence
No

Searched Epic, ModelContext, native MCP, toolset registry; own HTTP MCP server only.

Evidence
Read dialog text and buttons
Partial

Blocked modal reports only its title; drive.observe reads editor window buttons but not while a modal blocks.

Evidence
Yes

list_dialogs returns title, message, buttons and choices; modal safe on the bridge.

Evidence
No

No tool reads dialog text or buttons; searched dialog/modal/MessageDialog.

Evidence
  • rg dialog over ModelContextProtocol, ToolsetRegistry, Toolsets
No
No

Searched dialog, modal, FMessageDialog; no tool reads dialog text or buttons.

Evidence
Partial

Modal title and message text harvested into the log record; no button list, not readable via MCP.

Evidence
Dialog check on every call path
Yes

Modal block fails every tools/call fast; suppression scope wraps every dispatched handler.

Evidence
Yes

One DialogGuard gates GuardedBridge calls, in-process tool dispatch and the HTTP flow routes.

Evidence
No

No dialog gate on any call route; server dispatch has no modal check.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp
Yes
No

No dialog system to gate calls; bridge RunAsync calls ExecuteTool directly with no gate.

Evidence
No

No dialog gate in dispatch path; searched ExecuteAction and HTTP handlers.

Evidence
Multi-editor write safety
Yes

_expect_editor refuses writes to another editor; saves refuse on disk divergence; quit refuses shared use.

Evidence
Yes

With several editors registered, untargeted mutating calls are refused until an editor is named.

Evidence
No

No cross-editor write coordination; searched lock/instance/multiple editor.

Evidence
  • rg lock|instance over ModelContextProtocol/Source, ToolsetRegistry, Toolsets
No

Searched for cross-editor write coordination; revision pins are per editor process only.

No

No cross editor write coordination; only per PID signal files and port clash logging.

Evidence
No

Searched multi-editor, instance, lock; no cross-editor write coordination.

Evidence
Rejects browser-origin requests
Yes

Requests with a non loopback Origin header get HTTP 403; loopback page origins are allowed.

Evidence
Yes

WebSocket upgrade with any Origin header is refused with 403.

Evidence
Yes

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
Yes

WebSocket handshake tears down any request carrying an Origin header with code 4403.

Evidence
Partial

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
Partial

CORS echoes only loopback origins; requests from other origins still execute, response unreadable.

Evidence
Protected engine roots
Partial

Only animation and skeleton create verbs refuse /Engine targets; other asset writes accept any mount.

Evidence
Yes

UE_MCP_PROTECTED_ENGINE_ROOTS deny list; server refuses a protected engine root.

Evidence
No

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
Partial
Partial
No

Searched /Engine prefix checks; validator test states engine root is writable, no protected roots.

Evidence
Undo transactions + history
Yes

Handlers use FScopedTransaction; editor.undo and editor.redo take steps and return the title of every transaction undone or redone; editor.undo_history lists the titled undo and redo entries.

Evidence
Yes

undo, redo, get_undo_state, get_transaction_history, undo_redo_steps, begin/end_transaction.

Evidence
Partial

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
Partial
Yes

TransactionService: undo/redo, begin/end/cancel transaction, GetHistory, ResetBuffer.

Evidence
Partial

FScopedTransaction used widely, material begin/end_transaction; no undo, redo or history action.

Evidence
Transport auth token (on by default)
Yes

Bearer token required by default, auto generated 64 hex token file, bRequireAuthToken switch.

Evidence
Partial

Editor bridge has no auth (loopback only); bearer token only on the optional flow HTTP server, off by default.

Evidence
No

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
Yes

bRequireCapabilityToken defaults true; token auto-generated at Saved/MCP/capability-token.

Evidence
No

No auth token in VibeUE or Epic server; README says loopback only with no authentication.

Evidence
No

Searched token/auth/bearer in HTTP server and settings; server open on all interfaces.

Evidence
Scoped access tokens (read-only, paths, quota)
No

One project wide token with on/off switch; searched settings for read only, path or quota scopes.

Evidence
No

Searched read-only, quota, path scopes, token scopes; none. Only custom guard code could emulate.

Evidence
No

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
Yes
No

Searched token, auth, read-only mode, quota, allowlist; no scoped access tokens.

Evidence
No

No auth at all; searched token, auth, quota.

Evidence
Guards against Blueprint corruption on edit
Yes

compile, set_default, reparent, modify_scs, compile_bpir refuse LIVE_INSTANCES_WOULD_BE_REINSTANCED unless allowReinstancing; BPIR rollback.

Evidence
Partial

Inherited component writes go to child ICH, orphan node cleanup, validate action; no reinstancing guard.

Evidence
Partial

compile_blueprint raises with node errors after compile; no reinstancing guard found.

Evidence
  • Engine/Plugins/Experimental/ToolsetRegistry/Content/Python/toolset_registry/helpers.py:30
Partial

Compile resets the undo buffer when reinstanced instances would pin worlds and reports diagnostics; no refusal or rollback.

Evidence
Partial

Refuses BP loads during PIE, guards BP class delete crash, PIE spawn rejects REINST/stale classes.

Evidence
Partial

validate_blueprint action and targeted reinstance crash workarounds; no general integrity guard.

Evidence
Writes check the target world first
Yes

Every mutating verb accepts expectWorld; mismatch returns WORLD_MISMATCH before the handler runs.

Evidence
Partial

REQUIRE_EDITOR_WORLD null check on handlers; PIE refusal on some actions; no expected level param.

Evidence
Partial

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
Partial
Partial

World mutating Python refused until editor world and World Partition are ready; several services refuse in PIE.

Evidence
Partial

Only load_level refuses while a PIE smoke session runs; write calls have no world precondition.

Evidence
Memory-capped, low-priority editor, test and build processes
Yes

Offscreen editors, tests and builds: 60% RAM cap (per process on Windows, whole tree on Linux), BelowNormal.

Evidence
No

start_editor and builds spawn with no memory cap or priority; only its status writer thread runs BelowNormal.

Evidence
  • src/editor/editor-control.ts:569 spawn (no cap or priority options)
  • grep -E 'CreateJobObject|JOB_OBJECT_LIMIT|AssignProcessToJobObject|BelowNormal|systemd-run|MemoryMax|setpriority|os.nice|RLIMIT_AS|PriorityClass' over src, plugin, docs: only MCPEngineStatus.cpp:148 TPri_BelowNormal (a thread)
No

Server runs inside the editor and launches no processes; searched Job Object, systemd-run, priority class.

Evidence
  • grep -E 'CreateJobObject|JOB_OBJECT_LIMIT|BelowNormal|systemd-run|MemoryMax|setpriority|RLIMIT_AS' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
No

Build and packaged-game launches spawn uncapped at normal priority; searched Job Object, systemd-run, nice, priority class.

Evidence
  • grep -E 'CreateJobObject|JOB_OBJECT_LIMIT|AssignProcessToJobObject|BelowNormal|systemd-run|MemoryMax|setpriority|os.nice|RLIMIT_AS|PriorityClass' over src, plugins, docs, scripts: no hits
No

No memory cap or priority on any launch; repo launch scripts start processes plainly; searched Job Object, systemd-run, nice.

Evidence
  • grep -E 'CreateJobObject|JOB_OBJECT_LIMIT|BelowNormal|systemd-run|MemoryMax|setpriority|RLIMIT_AS|PriorityClass' over Source, Content, scripts: no hits
No

No process launch; only its indexer threads run BelowNormal.

Evidence
Launched editors survive the agent's process-tree kill
Yes

Editor, test and build supervisors start via WMI Win32_Process.Create (breakaway fallback), setsid on Linux; result reports launchMechanism.

Evidence
Partial

start_editor spawns detached plus unref; on Windows the editor stays a child of the server process, no breakaway or WMI launch.

Evidence
No

Server runs inside an already running editor; no tool launches an editor.

Evidence
  • grep -E 'CreateProc|Win32_Process|setsid|breakaway' over Toolsets, ModelContextProtocol, ToolsetRegistry: no launch tool
No

No editor cold start; restart_editor relaunches from inside the running editor via FUnrealEdMisc::RestartEditor.

Evidence
No

No launch tool; BuildAndLaunchGame.ps1 Start-Process is a repo script, not an MCP operation.

Evidence
No

No editor launch action; its proxy only survives editor restarts.

Evidence
  • grep -E 'CREATE_BREAKAWAY|breakaway|Win32_Process|setsid' over Source, Docs, Skills: no hits
Leaked Python callback tracking and cleanup
Yes

python.callbacks lists and clears leaked Slate tick and shutdown callbacks; python.execute reports leakedCallbacks; EndPIE warns on survivors.

Evidence
No

Registers its own quit callback only; no tracking of script callbacks; searched register_slate_*_callback.

Evidence
  • src/editor/editor-control.ts:621 register_slate_post_tick_callback(_ue_mcp_quit)
  • grep -E 'register_slate_(post|pre)_tick_callback|register_python_shutdown_callback|unregister_slate' over src, plugin, docs: only that hit
No

No unrestricted Python and no callback tracking; searched register_slate_*_callback.

Evidence
  • grep -E 'register_slate_(post|pre)_tick_callback|register_python_shutdown_callback|unregister_slate' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
No

No callback tracking; searched register_slate_*_callback and shutdown callbacks.

Evidence
  • grep -E 'register_slate_(post|pre)_tick_callback|register_python_shutdown_callback|unregister_slate' over src, plugins, docs: no hits
No

Skill doc only warns that a leaked slate callback needs an editor restart; no tracking or cleanup.

Evidence
  • Content/Skills/vibeue/SKILL.md:276
  • grep -E 'register_slate_(post|pre)_tick_callback|register_python_shutdown_callback|unregister_slate' over Source, Content: only that hit
No

No callback tracking; searched register_slate_*_callback and shutdown callbacks.

Evidence
  • grep -E 'register_slate_(post|pre)_tick_callback|register_python_shutdown_callback|unregister_slate' over Source, Docs, Skills: no hits
Safe builds and editor launches when several agents share one machine
Yes

Lease refuses a second build; machine-wide launch lock; stale builds flagged; low-RAM and editor-cap refusals.

Evidence
No

UBT -WaitMutex queues a second build; start_editor checks only this project's editor; no stale or RAM check.

Evidence
No

Runs inside one editor; no build or editor launch tool, so no build guard, launch lock or admission check.

Evidence
  • grep -E 'CreateProc|UnrealBuildTool|Build\.bat|RunUAT|FMonitoredProcess|AvailablePhysical' over ModelContextProtocol/Source, ToolsetRegistry/Source, Toolsets/*/Source: only Build.cs usings
  • Engine/Plugins/Experimental/Toolsets/LiveCodingToolset/Source/LiveCodingToolset/Private/LiveCodingToolset.cpp:132 Live Coding compile only
No

run_ubt spawns UBT with no guard; no editor cold start or launch lock; no stale-build status or memory check.

Evidence
No

No build or launch tool; repo script BuildAndLaunchGame.ps1 kills every UnrealEditor on the machine first.

Evidence
No

No UBT build or editor launch; Live Coding trigger_build refuses only a second compile in the same editor.

Evidence
Dialog answer policyHow modal dialogs get answered: automatically, by pre-armed patterns, by the agent, or only by a human.
Partial

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.

Yes

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.

No

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
Partial

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.

No

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.

Partial

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.
Partial

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.

Yes

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.

Partial

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
Yes

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.

Partial

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.

No

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.
Yes

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.

Partial

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Partial

Dangerous console/script input blocking (Partial): Console verbs refuse quit, PY, EXECFILE, DEBUG crash/hang/memory lines and scalability sets unless force:true; 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.

Partial

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.

Partial

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
Partial

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.

Partial

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.

No

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.
No

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.

Partial

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.

No

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
Partial

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.

Partial

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.

Partial

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.
Partial

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): system.identity plus _expect_editor refuse a wrong editor; editor_list lists every editor on the machine, any project, with launch reason; spawn guard.

Yes

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.

Partial

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
Partial

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.

Partial

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.

Partial

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

9 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Offline capability report
Partial

Wiki and registry.json on disk stay readable with editor off; proxy answers tools/list locally; none before first launch.

Evidence
Yes

project(list_available_actions) says per action whether it runs without an editor (always/editor/unknown).

Evidence
Partial

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
Partial

search/describe and ue://capability/catalog answer from TS manifest without editor; no dedicated report op.

Evidence
No

Searched capability/offline report; only a readiness signal file with version, map and MCP port.

Evidence
Partial

Offline monolith_query.exe lists offline-servable namespaces vs live-only ones in usage/error text only.

Evidence
Per-client MCP compatibility fixes
Partial

Codex .well-known probe answered 404, Gemini httpUrl key, per-client config writers, args sent as a JSON string accepted; no clientInfo adaptation.

Evidence
Yes

Keyed on clientInfo: Claude Code progress collapse note, elicitation relay for clients that truncate.

Evidence
Partial

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
Partial

Adapts to declared client capabilities with fallback pointers; by design never keys on client name.

Evidence
Partial

Per client guide file writer, Gemini array item types, capitalized param fallback; no protocol quirk layer.

Evidence
Yes

Parses stringified params (Claude Code), no dots in tool names, cached tool list for clients ignoring list_changed.

Evidence
Progress notifications on long calls
Yes

Editor streams notifications/progress over SSE when a progressToken is sent; proxy relays frames.

Evidence
Partial

notifications/progress wired, but only editor start and session start report it; bridge calls send none.

Evidence
Yes

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
Yes

progressToken honored; bridge progress forwarded as notifications/progress on both transports.

Evidence
Partial

Epic MCP server sends heartbeat progress on any call with progressToken; VibeUE emits none itself.

Evidence
No

Searched notifications/progress, progressToken in server and both proxies: none; long jobs use poll actions.

Evidence
Per-operation docs generated to disk
Yes

One markdown page per namespace and per operation regenerated at editor startup, about 1500 pages.

Evidence
Partial

Build script writes a single docs/tool-reference.md; no per-action files at runtime; describe_action on demand.

Evidence
No

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
Partial

One generated repo doc table of all capabilities; no per-operation pages written at runtime.

Evidence
No

No generator; skills and Help pages are hand written markdown, GenerateAgentConfig copies one static guide.

Evidence
Partial

Shipped curated Docs/API_REFERENCE.md, not generated per operation; live schema via describe_query action_schema.

Evidence
Oversized results spilled to a file
Yes

Results over a character threshold are written to a file and the response points to it.

Evidence
Partial

No automatic spill; some actions take an opt-in outputPath (read_datatable, bulk_read_properties).

Evidence
No

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
No

Oversized results refused with RESULT_TOO_LARGE; only a few ops take an explicit outputPath.

Evidence
Partial

Terrain water features saves full JSON to file and returns a summary; Python runs logged to Saved for recovery.

Evidence
Partial

No automatic spill; a few actions take opt-in output_path to write results to disk.

Evidence
MCP resources, prompts and completions
No

Only initialize, ping, tools/list, tools/call handled; searched resources/, prompts/, completion/: none.

Evidence
No

index.ts registers tools only; searched for registerResource, registerPrompt, completion handlers, none found.

Evidence
Partial

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)
Yes

Resources plus templates, six workflow prompts, completion/complete on stdio and native transports.

Evidence
No

No AddResourceProvider, prompts or completions; skills are served as tools via Epic AgentSkillToolset.

Evidence
No

Only initialize, tools/list, tools/call, ping handled; searched resources/, prompts/, completion/complete: none.

Evidence
Live scripting-API introspection
Yes
Yes

Live UE reflection: reflect_class/struct/enum/instance, list_classes, editor(list_function_libraries).

Evidence
Partial

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
Yes

describe_reflected_api lists live UFunctions of a class from the installed build.

Evidence
Yes

discover_python_module, discover_python_class, discover_python_function, list_python_subsystems tools.

Evidence
Partial

describe.schema walks live UProperty reflection; cppreflect UFUNCTION lists come from index; Python via run_python.

Evidence
Did-you-mean suggestions for unknown names
Yes
Yes

Unknown actions refused with closest names; describe_action and reflect_class also list close matches.

Evidence
Partial

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
Yes

closestMatches suggestions for unknown capability, tool and action, with nextCall.

Evidence
Partial

Did you mean hints only for UMG slot property names; MetaSound fuzzy pin names; unknown tools get plain not found.

Evidence
Yes

Top 3 fuzzy suggestions for unknown namespaces and actions on dispatch errors, also offline CLI.

Evidence
Read-only / destructive tool annotations
No

Searched readOnlyHint, destructiveHint, annotations; tool descriptor has none, bMutating is internal.

Evidence
Partial

No MCP readOnlyHint or destructiveHint set; per action read/mutate class only via project(describe_action).

Evidence
No

tools/list emits only name, description, inputSchema, outputSchema; searched readOnlyHint, destructiveHint.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:731 ProcessListToolsJsonRpcCall
Partial

No MCP readOnlyHint/destructiveHint; each capability declares effect read/write/destructive plus consent.

Evidence
No

Searched readOnlyHint/destructiveHint/annotations; adapter sets only name, description, input schema.

Evidence
Yes

tools/list emits readOnlyHint, destructiveHint, idempotentHint annotations per tool.

Evidence
Batch many calls in one sandboxed script
Partial

python.execute runs a multi-step script with no sandbox; per-op batch verbs like actor.spawn_batch.

Evidence
Partial

flow(run) runs named YAML flows, not a sandbox; execute_tool_script via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
Partial

No sandboxed multi-call script; only unsandboxed execute_python (explicit consent) and per-domain batch ops.

Evidence
Partial

execute_python_code batches calls in one script; only pattern guards (input, modal, while True), no sandbox.

Evidence
Partial
Tool-set selection (context modes, per-category toggles)Chooses which tools the client sees, from a single gateway tool to per-category switches.
Partial

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.

Yes

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.

Yes

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)
Partial

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.

Partial

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.

Partial

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.
Partial

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.

Yes

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.

Partial

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
Partial

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).

Partial

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.

Yes

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

10 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Per-project engine selection
Yes

editor_start resolves the project's EngineAssociation to its engine root; PINWRIGHT_ENGINE_ROOT override.

Evidence
Yes

selectEngine resolves per project: editor.path/buildToolPath config, EngineAssociation, registry, last launch.

Evidence
n/a

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)
Partial

UBT lookup only: UE_ENGINE_PATH or .uproject EngineAssociation version against hardcoded roots.

Evidence
Partial

Only the build/launch script resolves engine from .uproject EngineAssociation or -UnrealEnginePath.

Evidence
n/a

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)
Partial

Relies on UE ini layering (project Editor.ini, per user per project settings); no global PinWright config file.

Evidence
Yes

Deep merged stack: ~/.ue-mcp/config.yml, ue-mcp.yml, ue-mcp.{env}.yml, ue-mcp.local.yml, env vars.

Evidence
Partial

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
No

One .env loaded, first hit wins (MCP_ENV_FILE, package root, cwd); env vars override; no merged layers.

Evidence
No

Global API key setting plus separate project Saved/Config/VibeUE.ini for disabled tools; no layering.

Evidence
No

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
Yes

bAutoDerivePort defaults on: port derived from project path hash, published to Saved/PinWright/gateway-port.

Evidence
Yes

SHA1 of project root mapped into 49152-65535 by server and C++ bridge; bound port published to port.json.

Evidence
No

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
No

Default ports 8090,8091 for all projects; per project needs ListenPorts in project ini, read by server.

Evidence
No

Uses Epic's default port 8000; override only via -ModelContextProtocolPort; code documents port fights.

Evidence
No

Fixed default port 9316, changed only by editing ServerPort setting; no per project port derivation found.

Evidence
Machine-wide editor census with launch reason
Yes

editor_list lists every Unreal editor on the machine, any project or engine, with mode, map, log, port, launch reason and launching tool.

Evidence
Partial

Enumerates all editors internally, but tools report only the loaded project's (pid, command line); no launch reason.

Evidence
No

No process enumeration; searched Win32_Process, FProcEnumerator, EnumProcesses, /proc.

Evidence
  • grep -E 'Win32_Process|EnumProcesses|FProcEnumerator|CreateToolhelp32Snapshot|tasklist|/proc/' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
No

No process enumeration or launch reason; searched Win32_Process, FProcEnumerator, EnumProcesses, /proc.

Evidence
  • grep -E 'Win32_Process|EnumProcesses|FProcEnumerator|CreateToolhelp32Snapshot|tasklist|/proc/' over src, plugins: only path-policy test strings
Partial

Per-PID readiness files list this project's VibeUE editors with port and map; no machine-wide census or launch reason.

Evidence
No

Only a tasklist check in its self-update script; no census tool.

Evidence
Switch projects and add editors at runtimeChanges the target project or editor set without restarting the server.
No

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:3693-3710 _build_argument_parser (single --port-file, --uproject)
  • git grep switch_project|set_project|use_project over Source, Content/Python, docs/wiki-src at adb239fd: only rendering.set_project_settings hits

Add/drop editors at runtime (No): editor_start/restart manage only this project's editor and refuse a second live one; editor_list is a read-only census; calls go to one endpoint.

Yes

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.

No

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
No

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.

No

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.

No

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

11 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Timed-out calls report an unknown outcome instead of retrying
Partial

Generic TIMEOUT has no outcome unknown flag and work commits; job tickets and idempotent verbs mitigate.

Evidence
Yes

Timeout error carries outcome unknown plus operationId; late editor replies are reconciled in abandonedCalls.

Evidence
No

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
Partial

Timeout sends cancel_request that drops queued work; error says timed out, no outcome unknown flag.

Evidence
Partial

Python runs only: run_id result persisted, recover lost result via vibeue.last_python_result() not rerun.

Evidence
No

30s proxy timeout is reported as 'Editor not running, try again'; outcome unknown not signalled.

Evidence
Out-of-process engine state probe
Yes

Stdio proxy pings before each call and classifies alive, not_ready, unresponsive, modal, stale, not_running.

Evidence
Yes

editor(get_engine_state) reads process table, editor log, plugin status.json writer thread, native windows.

Evidence
No

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
Partial

ue://health reads plugin session snapshot files from disk; bridge counters, last request, pid, no editor state.

Evidence
Yes

Background thread writes Saved/VibeUE/Signals health JSON every 5s with game thread stall seconds.

Evidence
Partial

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
No

Searched wiki and Source for asset registry scan state or health verbs; IsLoadingAssets used only internally.

Evidence
Yes

asset diagnose_registry compares disk vs AssetRegistry and counts ghost entries.

Evidence
No

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
Partial
No

Searched asset registry status, IsLoadingAssets, redirector and broken reference diagnostics; none.

Evidence
  • grep over Source found no asset registry diagnostic operation
Partial

project refresh_assets forces a registry rescan and lists missing files; no registry health or scan-state report.

Evidence
Client session survives editor restarts
Yes

Stdio proxy owns the client session, follows gateway-port file; HTTP endpoint is stateless.

Evidence
Yes

MCP server is a separate Node process; background reconnect loop and ensureConnected on each call.

Evidence
Partial

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
Yes

TS stdio server outlives editor and lazily reconnects on each call via ensureConnected.

Evidence
No

No client proxy; clients hit Epic HTTP endpoint directly. Searched reconnect, session id; skill says restart client.

Evidence
Yes

Stdio proxy stays up across editor restarts, polls health and sends tools/list_changed.

Evidence
Client cancellation drops queued editor requests
No

No notifications/cancelled handling or disconnect cancel in transport or proxy; proxy only stops relaying.

Evidence
No

Searched cancel, notifications/cancelled, AbortSignal in dispatch and bridge: none; only timeout abandons work.

Evidence
Partial

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
Yes

MCP cancel forwards cancel_request; plugin removes queued requests, in-flight ones run to completion.

Evidence
No

Tool adapter ignores request id; searched cancel, notifications/cancelled, queue in bridge.

Evidence
No

Proxy stdin loop is synchronous; notifications/cancelled is forwarded and the server ignores it.

Evidence
Job registry (list, status, cancel)
Yes

system.job_list, job_status and job_cancel over wait:false tickets; cancel errors JOB_CANCEL_UNSUPPORTED when the verb cannot stop.

Evidence
Partial

Per-feature status only: get_standalone_status, get_trace_status, get_build_status, stop_standalone; no job ids or list.

Evidence
  • docs/tool-reference.md:1778 get_trace_status, :1787 get_standalone_status, :1788 stop_standalone, :1808 get_build_status
  • grep -iE 'job_status|jobId|taskId|tasks/get|taskStore|list_jobs|cancel_job' over src, plugin, docs: only an import loop TaskIdx
Partial

No job registry; notifications/cancelled calls CancelAsync on an in-flight tool; test toolset has GetTestStatus and StopTests.

Evidence
  • Engine/Plugins/Experimental/ModelContextProtocol/Source/ModelContextProtocol/Private/ModelContextProtocolServer.cpp:719 CancelAsync, :949 RunAsync
  • Engine/Plugins/Experimental/Toolsets/AutomationTestToolset/Source/AutomationTestToolset/Public/AutomationTestToolset.h:22-23 GetTestStatus, StopTests
  • grep -E 'job_?list|list_?jobs|job_?status|JobRegistry' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
Partial

MCP tasks list/get/cancel cover only read-only search and describe, which finish before the reply; cancel only sets a status.

Evidence
Partial

RunScenario returns an id polled by GetScenario and ended by CancelScenario; PIE scenarios only, no general job list.

Evidence
Partial

Per-feature sessions only: run_pie_smoke returns an id, poll_pie_smoke and stop_pie_smoke; get_mining_status; no job list.

Evidence
Editor readiness and hang reportingSignals when the editor is ready and reports hung or loading states instead of timing out.
Yes

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.

Yes

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.

No

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
Partial

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.

Partial

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.

Partial

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.
Partial

Plugin/server parity + stale build detection (Partial): Proxy flags a plugin older than the proxy (EDITOR_PLUGIN_OUTDATED); editor_build_status reports stale builds.

Protocol/ABI capability handshake (Partial): Standard MCP initialize only; system.identity plus _expect_editor pins pid and plugin_build, no version negotiation.

Yes

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.

Partial

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
Partial

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.

Partial

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.

Partial

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

12 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Credential + identifier scrubbing on outbound text
No

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
Yes

Credential scrub and privacy scrub of paths, project name and username run on feedback text before posting.

Evidence
Partial

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
Yes

Secret masking on receipts and envelopes; plugin redacts host paths and UserId/AccountId/LoginId keys.

Evidence
No

No outbound text scrubbing; only key-based [REDACTED] masking of run metadata in the local workflow journal.

Evidence
No

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
Yes

No HTTP client or telemetry code in Source; server binds loopback; proxy host hardcoded to 127.0.0.1.

Evidence
Partial

No telemetry found, but startup queries registry.npmjs.org for updates by default; UE_MCP_DISABLE_UPDATE_CHECK=1 stops it.

Evidence
No

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
Yes

No HTTP client in src; /metrics is loopback and off without MCP_METRICS_PORT; Fab fetches only on Fab actions.

Evidence
Yes
Yes

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.
Partial

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.

Yes

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.

No

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
No

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.

No

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.

No

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

13 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Typed Project Settings edit with schema
Partial

Typed checked edit for Renderer and Physics settings only; rejects unknown or non-config props; no schema list.

Evidence
Partial

epic_get_section_schema and epic_set_section_properties via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
Partial

Values parsed into typed UProperty via ImportText with INVALID_VALUE errors; schema is only section/key/value strings.

Evidence
Partial

Own code only lists settings classes and property counts; typed get/set_setting via Epic toolset.

Evidence
Partial

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.
Partial

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)
Partial

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.

Partial

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
Partial

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.

Partial

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.

Yes

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

14 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Full-text asset search
Partial

asset.search does substring/wildcard name match over the Asset Registry; no FTS5 or full-text index found.

Evidence
Partial

search_fts is a linear token-scored scan of the asset registry, not an SQLite FTS5 index.

Evidence
Partial

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
Partial

search_assets filters asset registry by class/path plus case-insensitive name substring; no FTS index.

Evidence
Partial

No FTS5 or SQLite index in VibeUE; asset search only via Epic toolset AssetTools.find_assets.

Evidence
Yes

project.search runs FTS5 queries over the SQLite asset index, with an asset_class filter.

Evidence
Find references
Yes

asset.references gives dependencies and referencers; asset.dependencies; get_asset_graph BFS, classified deps.

Evidence
Yes

asset get_referencers and get_dependencies over the asset registry.

Evidence
Yes

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
Partial

Gateway exposes dependencies and struct-only usage search; generic get_asset_references is not in the catalog.

Evidence
Partial

Via Epic toolset AssetTools.get_referencers; own code only returns referencers from unattended delete.

Evidence
Yes

project.find_references lists referencers and dependencies of an asset.

Evidence
Asset CRUD (move/rename/delete)
Yes

asset.move, rename, delete, duplicate, bulk_rename, bulk_delete, fixup_redirectors with readback.

Evidence
Yes

rename, bulk_rename, move, move_folder, delete, delete_batch, duplicate.

Evidence
Yes

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
Yes

move, rename, duplicate, delete, bulk_delete, bulk_rename; destructive ones require elevated consent.

Evidence
Yes

Own dialog-free DeleteAssetUnattended and bulk asset_move (rename); duplicate via Epic AssetTools.

Evidence
Partial

Rename with fixup (batch_rename_assets) and delete_assets exist; renames are name only, no move to another folder.

Evidence
DataTable row CRUD
Yes
Yes

add/set/update/get/remove/rename datatable row actions.

Evidence
Yes

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
Yes

add, update, get, list, delete, clear and bulk import of DataTable rows, plus create table and row struct.

Evidence
Partial

DataTableService was cut; row CRUD via Epic toolset DataTableTools.

Evidence
Yes

Bulk upsert, remove, rename, duplicate rows plus JSON/CSV export and import.

Evidence
Structured asset diff
Yes

asset.dump diff=true writes per-aspect unified diffs of text sidecars against the baseline mirror.

Evidence
Partial

diff covers only Blueprint, Skeleton and SkeletalMesh; other asset classes report unsupported.

Evidence
No

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
Partial

compare_structs diffs two user structs only; no general asset diff. Searched diff, compare_assets.

Evidence
Partial

Type specific pair diffs only: DiffBlueprints, CompareMaterialGraphs, Niagara CompareSystems.

Evidence
Yes

Per type structured diffs: compare_blueprints, niagara.diff_systems, compare_meshes, compare_behavior_trees.

Evidence
Content hygiene audit + fix
Partial

Per-domain audits (static meshes, level, Niagara orphans, BP orphans) plus redirector fixup; no project-wide sweep.

Evidence
Yes

audit_hygiene (unreferenced, broken refs, duplicates, naming, redirectors) plus bulk_fix_hygiene.

Evidence
No

Searched DataValidation, validator, unused, redirector, fixup; no audit or fix tool found.

Evidence
  • grep redirector|fixup|DataValidation|EditorValidator over Experimental\Toolsets: no tool hits
Partial

validate, validate_assets, generate_report and fixup_redirectors; no unused or naming audit with auto fix.

Evidence
Partial

Bulk cleanup_review is report only, never fixes; unused detection needs separate GameIQ plugin.

Evidence
Partial

Read-only audits (orphans, naming, unused audio); fixes need separate rename or delete calls.

Evidence
Migrate assets to another project
Partial

No migrate operation (searched migrat, MigratePackages); reachable only via python.execute escape hatch.

Evidence
Yes

asset migrate copies assets and dependencies into another project's Content dir, dryRun supported.

Evidence
No

Searched migrat in Toolsets, ToolsetRegistry, ModelContextProtocol; no migrate tool.

Evidence
  • grep -i migrat over Engine/Plugins/Experimental/Toolsets: no hits
No
No

Searched Migrat in Source and Skills; no asset migration to another project.

Evidence
No

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
Partial

No batch data-asset upsert op found; per-object property.set or python.execute only, not atomic.

Evidence
Yes

bulk_upsert_data_assets validates all items on transient copies before writing up to 500 assets.

Evidence
Partial

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
Partial

import_data_table_rows validates all rows before mutating one DataTable; no bulk UDataAsset upsert.

Evidence
No

Searched upsert and data asset bulk ops; DataAssetService cut, bulk plan has no data asset op.

Evidence
Partial

seed_data_asset creates and fills one asset with dry_run; no multi asset atomic upsert batch.

Evidence
CurveTable / StringTable authoring
Partial

No CurveTable or StringTable ops (searched UCurveTable, UStringTable); only via python.execute.

Evidence
Yes

CurveTable create/import/rows/keys and StringTable create/entries/CSV import actions.

Evidence
Yes

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
No

Searched stringtable, UStringTable, curvetable, UCurveTable: only widget text bindings reference string tables.

Evidence
Partial

No own code; via Epic toolset CurveTableTools and StringTableTools.

Evidence
Yes

Curve keys and rows, StringTable entries editable; no create action for these table assets found.

Evidence
User enum / struct authoring
Yes

blueprint.create_enum, set_enum_entries, create_struct, add/remove_struct_field, set_struct_field_default.

Evidence
Yes

create/edit user defined enum and struct, rename_struct_field.

Evidence
No

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)
Yes

UserDefinedEnum and UserDefinedStruct create, member edit, rename, reorder, delete.

Evidence
Yes

EnumStructService creates and edits user enums and structs (values, properties, types, defaults).

Evidence
Yes

create_user_defined_enum, create_user_defined_struct, plus add/remove/rename/retype struct fields.

Evidence
UV inspection and editing
Yes

Dedicated UV edit ops plus static mesh round trip; inspection limited to channel counts and hasUVs.

Evidence
Yes

read_uv_channels, check_uvs, unwrap_uvs, transform_uvs, lightmap UVs, export_uv_layout.

Evidence
No

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)
Partial
Yes

UVMappingService: channel list/health, add/copy, unwrap, pack, transform, islands, layout image.

Evidence
Partial

get_mesh_uvs inspects always; compute_uvs needs GeometryScripting plugin and is compiled out of release builds.

Evidence
Asset export to files
Partial

Type-specific exports only: level.export T3D, actor.export, geometry.export_obj/stl, sequencer.export_fbx.

Evidence
Yes

asset export via engine exporters (PNG, FBX, etc.) plus export_texture.

Evidence
Partial

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
Partial

Exposed: export_level, export_struct, export_heightmap, actor export; export_asset handler not in catalog.

Evidence
Partial

Texture, heightmap, weightmap and UV layout image export only; no generic mesh or FBX export.

Evidence
Yes

mesh.export_mesh writes static or skeletal mesh to FBX on disk.

Evidence
Offline greppable text mirror of assets
Yes

asset.dump_folder writes a text mirror (properties.json, bpir.txt, tree.xml, mgir.txt) meant for grep and git.

Evidence
Partial

blueprint export_batch writes per Blueprint JSON/T3D to Saved; Blueprints only, one shot, no sync.

Evidence
No

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

No on-disk text dump of assets found; searched mirror, dump, asset export to text cache.

Evidence
No

No on-disk text mirror; only per-call JSON exports like ExportMaterialGraph and ExportAnimationToJson.

Evidence
Partial

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

No asset op (rename, move, duplicate, delete, fixup) offers a dry run; preflight only refuses bad batches.

Evidence
Partial

bulk_fix_hygiene dryRun defaults true for naming and unreferenced fixes; bulk_rename has no dry run.

Evidence
No

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
No

Gateway refuses options.preview for all capabilities; only migrate_assets has dryRun, not a refactor.

Evidence
Yes

RunBulkMaintenance defaults to dry run, path scoped, rollback per target, resumable report.

Evidence
Partial

Per action dry_run flags (batch rename, table rows, bulk_fill, cleanup); no refactor plan engine.

Evidence
Source control revert with package reload, and file history
Yes

source_control.revert reloads reverted packages, reports stale ones and refuses loaded maps; source_control.log returns per-file history.

Evidence
Partial

No revert or history op; only via execute_python (gated) calling SourceControl.revert_and_reload_packages; history is not script exposed.

Evidence
  • grep -i 'FRevert|RevertAndReload|revert_and_reload|ApplyOperationAndReloadPackages|RevertFiles?\(|GetHistorySize|SetUpdateHistory|file_history|AnnotateFile|source_control_(revert|history|log)' over src, plugin, docs: no hits
  • docs/tool-reference.md:1725 execute_python
  • Engine/Source/Developer/SourceControl/Public/SourceControlHelpers.h:437-438 RevertAndReloadPackages (UFUNCTION, ScriptName SourceControl at :244)
  • Engine/Source/Developer/SourceControl/Public/SourceControlHelpers.h:115-210 FSourceControlState has no history fields; :639 AnnotateFile and :704 GetAssetDataFromFileHistory are not UFUNCTIONs
No

Only can_edit_asset, is_checked_out and checkout on write; searched toolsets for revert and history: none; no Python escape hatch.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/asset.py:372 can_edit_asset, :391 is_checked_out
  • grep -i 'def \w*(revert|history|annotate)|RevertAndReload' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits (RevertFiles only in PluginToolsetTest.cpp)
Partial

source_control has checkout, submit, enable, init, commit_all; revert only via execute_python calling SourceControl.revert_and_reload_packages; no history.

Evidence
  • docs/action-reference.generated.md:189 asset.source_control
  • grep -i 'FRevert|RevertAndReload|revert_and_reload|ApplyOperationAndReloadPackages|RevertFiles?\(|GetHistorySize|SetUpdateHistory|file_history|AnnotateFile|source_control_(revert|history|log)' over src, plugins, docs: no hits
  • docs/action-reference.generated.md:126 system_control.execute_python
  • Engine/Source/Developer/SourceControl/Public/SourceControlHelpers.h:437-438 RevertAndReloadPackages (UFUNCTION, ScriptName SourceControl at :244)
Partial

No revert or history op; only via execute_python_code calling SourceControl.revert_and_reload_packages; history is not script exposed.

Evidence
  • grep -i 'FRevert|RevertAndReload|revert_and_reload|ApplyOperationAndReloadPackages|RevertFiles?\(|GetHistorySize|SetUpdateHistory|file_history|AnnotateFile|source_control_(revert|history|log)' over Source, Content: no hits
  • Source/VibeUE/Public/Tools/PythonTools.h:46 execute_python_code
  • Engine/Source/Developer/SourceControl/Public/SourceControlHelpers.h:437-438 RevertAndReloadPackages (UFUNCTION, ScriptName SourceControl at :244)
  • Engine/Source/Developer/SourceControl/Public/SourceControlHelpers.h:115-210 FSourceControlState has no history fields; :639 AnnotateFile and :704 GetAssetDataFromFileHistory are not UFUNCTIONs
Partial

No revert or history op; only via editor.run_python calling SourceControl.revert_and_reload_packages; git mining is churn stats only.

Evidence
  • grep -i 'FRevert|RevertAndReload|revert_and_reload|ApplyOperationAndReloadPackages|RevertFiles?\(|GetHistorySize|SetUpdateHistory|file_history|AnnotateFile|source_control_(revert|history|log)' over Source, Docs, Skills: no hits
  • Source/MonolithEditor/Private/MonolithEditorActions.cpp:824 run_python
  • Engine/Source/Developer/SourceControl/Public/SourceControlHelpers.h:437-438 RevertAndReloadPackages (UFUNCTION, ScriptName SourceControl at :244)
  • Docs/API_REFERENCE.md:1566 risk (git churn, not file history)
Import and reimport (mesh, texture, anim)Imports source files, authors import pipelines, and detects changed source textures.
Partial

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.

Yes

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.

Partial

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
Partial

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
Partial

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
Partial

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.
Partial

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.

Partial

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
No

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.

Partial

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.

No

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
Yes

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.

Yes

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.

No

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

15 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Place / delete / move actors
Yes

actor.spawn, actor.delete, actor.set_transform, actor.nudge are dedicated ops.

Evidence
Yes

Dedicated place_actor, delete_actor, move_actor, plus aim_actor_at; delete refuses ambiguous labels.

Evidence
Yes

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
Yes

control_actor spawn, delete, set_transform, duplicate actions.

Evidence
Partial

Editor spawn/destroy/move via Epic toolset (SceneTools, ActorTools); own PIEActorService spawns in PIE only.

Evidence
Yes

mesh.spawn_actor, mesh.move_actor, mesh.delete_actors and mesh.duplicate_actor.

Evidence
Actor details / bounds
Yes

actor.describe returns identity, components, properties; actor.get_bounding_box returns bounds.

Evidence
Yes

get_actor_details (optional UPROPERTY dump) and get_actor_bounds returning AABB origin and extent.

Evidence
Yes

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=...)
Yes

get_actor_bounds/get_bounding_box, inspect_object get_actor_details, get_transform.

Evidence
Yes

ActorService.GetAllProperties dumps all actor properties; CalculateActorView returns bounds center/extent.

Evidence
Yes

mesh.get_actor_info returns class, transform, components, bounds; also get_scene_bounds.

Evidence
Bulk batch spawn / translate
Yes

actor.spawn_batch spawns up to 512 per call; actor.set_transform and actor.nudge take actors[] and apply every entry under one undo transaction with per-entry results.

Evidence
Yes

place_actors_batch, spawn_actors_batch (instances, components, along spline), spawn_grid, batch_translate.

Evidence
Partial

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)
Yes
Partial

No batch actor spawn/translate op; only via execute_python_code or Epic ProgrammaticToolset scripts.

Evidence
Yes

Batch blockout spawn, batch BP spawn, batch_execute of 200 ops in one undo, align and randomize.

Evidence
Line trace / snap to floor
Yes

spatial.raycast multiHit peeling, actor/class filters (filteredOut), faceIndex, renderGeometryHit; ground_actors snaps; verify_grounding provenance.

Evidence
Yes

line_trace, bulk_line_trace, snap_actor_to_floor, snap_instances_to_surface for HISM instances.

Evidence
Yes

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
Partial
Partial

BatchLineTrace and BatchLineTraceGrid exist in LandscapeService; no snap-to-floor operation.

Evidence
Yes

query_raycast, query_multi_raycast, snap_to_floor and snap_to_surface.

Evidence
Level CRUD
Yes

level.create, load, save, save_as, duplicate, rename, delete, list.

Evidence
Yes

level create, load, save, list, get_current; no level delete action, asset deletion is separate.

Evidence
Partial

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
Yes

manage_level create, load, save, save_as, duplicate, rename, delete, list, export, import.

Evidence
Partial

Load/current level via Epic toolset SceneTools; new/save level only as documented Python recipes.

Evidence
Yes

create_empty_map, load_level, save_packages; delete through generic editor.delete_assets.

Evidence
World settings / sublevels
Partial

Sublevels dedicated (level.add_sublevel, level.stream); world settings only via property.set or dump.

Evidence
Yes

get/set_world_settings (game mode, killZ, gravity) plus add/remove/list streaming sublevels and props.

Evidence
Partial

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
Yes

manage_level set_world_settings, add_sublevel, stream; inspect get_world_settings.

Evidence
Partial

No world settings or sublevel operation or doc; reachable only through execute_python_code.

Evidence
Partial

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.
Yes

level.build_lighting, lighting.build_lighting and level.build_all.

Evidence
Partial

build_lighting only runs the BUILD LIGHTING console command and returns triggered; no completion or results.

Evidence
No

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
Yes

build_environment.build_lighting and manage_level.build_lighting, plus lightmass config.

Evidence
Partial

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
Partial

No build lighting action (searched BuildLighting, FEditorBuildUtils); only via editor.run_python.

Evidence
Spline editing
Yes

spline namespace: add/remove points, tangents, type, spline meshes; blueprint.scs.set_spline_points edits Blueprint templates.

Evidence
Yes

get_spline_info and set_spline_points with typed points, tangents, closed loop, undo transaction.

Evidence
Partial

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
Yes

edit_spline add/set point position, rotation, scale, tangents, type; remove_spline_point.

Evidence
Partial

Landscape spline point/segment CRUD only; no SplineComponent editing API.

Evidence
Partial

place_spline creates a spline actor with points and mesh segments; no edit of existing splines.

Evidence
Instanced mesh (HISM) instance CRUD
Partial

ISM/HISM read and batch transform update; add/remove instances only for foliage actors.

Evidence
Yes
Partial

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)
Partial

Only foliage instances: add, get, remove; no generic ISM/HISM component instance ops found.

Evidence
Partial

Foliage instance add, query and remove only; no generic ISM or HISM component instance CRUD.

Evidence
Partial

convert_to_hism builds a HISM from actors; no add/remove/update of single instances.

Evidence
Actor motion telemetry
Partial

recorder reads PIE series only after host C++ LogVariable calls; sequencer.measure_motion covers tracks.

Evidence
Yes

read_actor_motion snapshots location, velocity, angular velocity, grounded; caller must loop to sample.

Evidence
No

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
No
No

Searched Source and Skills for velocity, telemetry, trajectory; scenario runner has asserts, no sampling.

Evidence
Yes

PIE time series sampling of dotted member paths on an actor, with input provocations.

Evidence
Weather and time-of-day systems
Partial

Time of day via environment.control.set_time_of_day (sun rotation); searched weather, rain, snow: no ops.

Evidence
Partial

No weather or time of day system; only directional light rotation as sun angle via set_light_properties.

Evidence
Partial

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
Yes
No

Searched Source and Skills for TimeOfDay, SunPosition, weather; only a level template name found.

Evidence
No

Searched TimeOfDay, weather, SkyAtmosphere, VolumetricCloud in Source; no matches in level code.

Evidence
Level-wide placement defect sweep
Yes

level.audit sweeps all actors for bad scale, missing mesh, floating, underground, duplicates.

Evidence
Partial

No sweep action; reads MapCheck via editor get_message_log and pairwise test_component_overlap only.

Evidence
No

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
Yes
No

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
Partial

No level-wide sweep; validate_building checks procedural buildings, validate_interactive_reach checks interactables.

Evidence
Gameplay volume authoring (trigger, kill-Z, nav)
Yes

volume.create_trigger_volume, create_kill_z_volume, create_nav_mesh_bounds_volume and more.

Evidence
Yes

spawn_volume: trigger, blocking, pain, navmesh bounds, post process, audio, cull; killZ via set_world_settings.

Evidence
Partial

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
Yes

create_volume: trigger, blocking, kill Z, pain, physics, nav mesh bounds, nav modifier and more.

Evidence
Partial

No volume ops; skill notes volumes spawn via Python spawn_actor_from_class or Epic SceneTools.

Evidence
Yes

spawn_volume covers trigger, blocking, kill, pain, nav_modifier; nav bounds via ai namespace.

Evidence
Data layers, level instances, packed actors
Yes
Partial

Level instances via wrapped Epic toolset, UE 5.8 only; data layers read only; no packed level actors.

Evidence
Partial

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
Yes
Partial

No data layer, level instance or packed actor ops; only engine subsystems via execute_python_code.

Evidence
Partial

create_prefab makes LevelInstance or PackedLevelActor (opens Save As dialog); no data layer support.

Evidence
Merge actors into a single mesh
Yes

performance.merge_actors merges 2+ static mesh actors into one mesh, optional source replace.

Evidence
Partial

epic_merge_actors via wrapped Epic toolset, UE 5.8 only; no native merge handler.

Evidence
Yes

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
Yes
Partial

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
Yes

generate_proxy_mesh merges actors into one simplified proxy mesh via IMeshMergeUtilities.

Evidence
Gameplay-space analysis (sightlines, chokepoints, pacing)
No

Searched wiki and ops for sightline, line of sight, chokepoint, pacing; only guide prose, no op.

Evidence
No

Searched sightline, chokepoint, line of sight, pacing; only raw line_trace and nav_project_point exist.

Evidence
No

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)
No

Searched sightline, chokepoint, line_of_sight, pacing in src and plugin; only unrelated hits.

Evidence
Partial

Map blockout gates check road connectivity and POI spacing on generated plans; no sightline analysis.

Evidence
Yes

analyze_sightlines, analyze_choke_points, analyze_level_pacing_structure, analyze_pacing_curve.

Evidence
Blockout volumes with asset replacement
Partial

Blocking volumes and geometry primitives exist; no op swaps blockout for final assets.

Evidence
Partial

convert_brushes_to_static_mesh turns BSP blockout into meshes; no replace blockout with chosen asset.

Evidence
Partial

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
No

Searched blockout, greybox; primitives and blocking volumes exist but no blockout to asset swap.

Evidence
Partial

MaterializePoisAsActors spawns placeholder blockout actors; swapping for final assets is manual.

Evidence
Yes

setup_blockout_volume, match_asset_to_blockout and atomic apply_replacement.

Evidence
Lighting writes report a scalability-cvar veto
Yes

Six lighting verbs read the gating cvar back (r.ShadowQuality, r.VolumetricFog, r.LightShaftQuality and others) and return cvarWarning; setup_light_shafts is the only light-shaft op found.

Evidence
No

Light and fog writes never read r.ShadowQuality, r.VolumetricFog or related cvars back; searched cvar names and CVar in light handlers.

Evidence
No

No lighting tools; searched the gating cvar names in Toolsets, ModelContextProtocol and ToolsetRegistry.

Evidence
  • grep 'r\.VolumetricFog|r\.ShadowQuality|r\.LightShaftQuality|AmbientOcclusionLevels|SkylightIntensityMultiplier|sg\.ShadowQuality' over the three Experimental folders (py, cpp, h, md, json): no hits
No

Writes r.ShadowQuality, r.VolumetricFog and VSM cvars but never reads them back to warn that a light or fog setting is vetoed.

Evidence
No

No lighting ops; r.VolumetricFog appears only in an engine-settings skill example, scalability read is generic.

Evidence
No

place_light and set_light_properties return no cvar state; searched the gating cvar names.

Evidence
  • grep 'r\.VolumetricFog|r\.ShadowQuality|r\.LightShaftQuality|AmbientOcclusionLevels|SkylightIntensityMultiplier|sg\.ShadowQuality' over Source, Docs, Skills: no hits
Read a map's actors without loading it
Yes

level.describe_offline parses the .umap for class, world transform, label, tags; OFPA actors by package only.

Evidence
No

list_actor_descs reads WP descriptors of the open map only; query with levelPath opens the map first.

Evidence
No

Searched for umap or package reads; actor queries run on the loaded level after load_level.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:28 load_level, :66 find_actors
No

get_level_info on an unloaded map returns asset registry tags only, no actors; no umap parsing found.

Evidence
No

Searched for umap, package or actor descriptor reads; none. Python would need its own package parser.

Evidence
No

Level indexer loads each map to store actors; no action reads the actors table, only a count.

Evidence
Lighting and post-process authoringPlaces and tunes lights, sky, fog and post-process volumes.
Yes

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.

Yes

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.

Partial

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
Yes

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.

Partial

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.

Partial

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.
Partial

World Partition unloaded actor query (Partial): level.describe_offline reads the .umap unloaded and lists external actors from the asset registry, unresolved.

World Partition rename (Partial): level.rename is a plain UEditorAssetLibrary::RenameAsset on the map; no World Partition specific handling.

Yes

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.

No

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
Partial

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.

Partial

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.

No

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.
Yes

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.

Yes

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.

Yes

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
Yes
Partial

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.

Partial

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.
No

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; only frame luminance and a zero-light count warning.

No

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.

No

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)
No

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.

No

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
Yes

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

16 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Attachment/socket-aware inspection
Yes

actor.describe reports per component attachParent, attachSocket and relativeTransform.

Evidence
Yes

nudge dryRun reports attach parent, socket, absolute flags, bounds; get_component_tree also.

Evidence
Partial

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)
Yes

inspect.get_component_details returns relative and world transform, attachParent and attachSocket.

Evidence
Partial

No own attach/socket query; Epic get_parent_component has no socket; GetAllProperties raw dump.

Evidence
Partial

get_actor_info omits attach parent; BP component tree lists attach socket, PIE anim query gives socket transforms.

Evidence
Relative transform between actors
Partial

measure_distance gives center/pivot distance, edge gap and per axis gap; no relative rotation or transform.

Evidence
Yes

level(get_relative_transform) actor vs actor by path or label; returns rotator only, no quaternion.

Evidence
Partial

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
No

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
No

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)
Partial

get_spatial_relationships gives labels (on_top_of, left_of) and distance; measure_distance; no relative transform.

Evidence
Aim actor at target
Yes

actor.set_transform lookAt aims the actor's +X axis at a world point or another actor, with roll about the aim axis, and reports the measured aim error.

Evidence
Yes
Yes

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
No

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
Partial

Via Epic toolset: ActorTools.look_at; VibeUE skill gives an atan2 Python recipe only.

Evidence
No

Searched look_at, aim, orient, FindLookAtRotation actions; look-at math only used internally for cameras and decals.

Evidence
Viewport pixel hit-test
Yes

spatial.raycast_screen deprojects a capture pixel to a world ray and first blocking hit.

Evidence
Yes

editor(hit_test_viewport_pixel) ray from live viewport projection; not for headless captures.

Evidence
Partial

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
No

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
Partial

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
No

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)
Partial

No transient actor spawn verb; effect.draw_debug_shape draws unsaved in-world markers, cleared by a verb.

Evidence
Yes

spawn/list/destroy_transient_actor: RF_Transient, tagged, destroy refuses real actors.

Evidence
No

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
Partial

No transient actor spawn; draw_debug_shape draws timed unsaved markers, clear_debug_shapes flushes them.

Evidence
Partial

PIEActorService spawns RF_Transient actors into PIE worlds only, tracked by handle; none in editor world.

Evidence
No

highlight_room spawns a normal StaticMeshActor in the level; searched RF_Transient and editor-only flags on actors.

Evidence
Component overlap / penetration test
Partial

measure_overlap gives actor AABB penetration and separating axis, not per component geometry.

Evidence
Yes

level(test_component_overlap) OBB or AABB bounds with penetration depth; bounds only, not mesh geometry.

Evidence
Partial

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
Partial

Placement check reports actor AABB overlaps with penetration depth; not per component or collision shape.

Evidence
Partial

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
Partial

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)
Yes

Duplicate labels refused with AMBIGUOUS_ACTOR_NAME listing candidates; objectPath/actorPath accepted.

Evidence
Yes

Shared MCPResolveActor: actorPath wins; ambiguous label refused listing candidate paths.

Evidence
Yes

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
Partial
Partial

Own lookup takes first label match then substring match; Epic toolset takes actor object refs.

Evidence
Partial

Ambiguous labels refused with match list; internal FName accepted, but full object paths are not resolved.

Evidence
Footprint ground-contact verification
Yes

verify_grounding samples footprint columns, reports coverage, contact points and max gap.

Evidence
Partial

snap_actor_to_floor is one center line trace from bounds top, no footprint check; corners need bulk_line_trace.

Evidence
Partial

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
Partial

One center line trace flags sunk, floating, unsupported with suggestedZ; not a footprint test.

Evidence
Partial

BatchLineTraceGrid gives downward trace grid over a region; no actor footprint check op.

Evidence
Partial

sample_terrain_grid and analyze_building_site cover building footprints; actor snaps use one trace.

Evidence
Declarative placement assertions
Yes

spatial.verify_placement expect{} runs grounded, on actor, noOverlapWith and within checks; returns pass plus per-check detail.

Evidence
Partial

test_component_overlap covers the no-overlap check for one pair; no grounded, on or within assertion.

Evidence
Partial

find_actors with bounds lists actors overlapping a box; no grounded, on or containment assertion.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/scene.py:66 find_actors bounds
Partial
No

No placement check op; searched overlap, within, grounded, intersect in actor services.

Evidence
Partial

get_spatial_relationships labels neighbours on_top_of, inside, adjacent; get_actors_in_volume; no pass or fail expectations.

Evidence
Frame-aware transforms (world/actor/parent)Applies moves and rotations in a chosen reference frame without Euler drift.
Partial

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.

Yes

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.

Partial

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()
Partial

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.

Partial

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.

Partial

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.
Partial

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.

Yes

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Yes

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.

Partial

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.

Partial

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)
No

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.

Partial

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
Partial

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.
Yes

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.

Partial

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.

Partial

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)
Partial

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.

Partial

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.

Partial

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

17 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Collision / physics
Yes

actor.set_collision, static_mesh.set_collision_complexity, geometry collision gen, physics.* ragdoll ops.

Evidence
Yes

set_collision, set_collision_profile, set_simulate_physics, set_physics_properties, add_impulse.

Evidence
Yes

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
Yes

control_actor.set_actor_collision, setup_physics_simulation, geometry collision generation actions.

Evidence
Yes

set_collision_settings sets profile, enabled state, object type and channel responses on BP components.

Evidence
Yes

mesh.set_collision_preset, set_mesh_collision, generate_collision, configure_physics_props, query_raycast.

Evidence
Navigation (rebuild/query)
Partial

navigation.rebuild_navigation and nav settings exist; no path, projection or reachability query op.

Evidence
Yes

rebuild_navigation, find_nav_path, project_to_nav, list_nav_invokers, spawn_nav_modifier, navmesh info.

Evidence
No

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
Partial

Rebuild navigation and navmesh info exist; searched FindPath, ProjectPoint, pathfind: no query action.

Evidence
Partial

No nav service; searched NavMesh/RebuildNav/FindPath. Only via execute_python_code on NavigationSystemV1.

Evidence
Yes

ai.rebuild_navigation, find_path, test_path, project_point_to_navigation, navmesh config actions.

Evidence
Behavior Tree full read and authoring
Yes

behavior_tree.create/add_node/connect/attach_decorator/service plus decompile to BTIR text.

Evidence
Yes
Partial

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
Yes
Yes

BehaviorTreeService: GetTree JSON, AddNode/Decorator/Service, BuildTree, Validate, Repair.

Evidence
Yes

ai BT actions: get_behavior_tree, get_bt_graph, add_bt_node, decorators/services, build_behavior_tree_from_spec.

Evidence
Blackboard CRUD
Partial

Create, add key, set default, set synced, read via decompile; no remove or rename key op.

Evidence
Yes

create_blackboard, add/remove_blackboard_key, read_blackboard, set_blackboard_parent.

Evidence
Partial

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
Partial
Yes

BlackboardService: create, add/remove/rename keys, key references, parent, instance sync.

Evidence
Yes

create/get/list/delete/duplicate blackboard, add/remove/rename bb keys, set_bb_parent.

Evidence
EQS
Yes

eqs.create, add_generator, add_test, set_context_class, set_test_filter, set_test_scoring.

Evidence
Yes

create/read EQS query, add generator/test, remove, reorder, list types, run_eqs_query live.

Evidence
No

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
Yes
Yes

EnvQueryService: create, options/tests CRUD, BuildQuery from JSON, validate, RunQuery against an actor.

Evidence
Yes

EQS query CRUD, generators, tests, scoring, spec build, plus runtime_run_eqs_query.

Evidence
StateTree
Yes

8 ops author states, transitions, tasks, conditions, evaluators, bindings; read back via asset.dump; no compile or validate op.

Evidence
Yes

statetree category: states, tasks, conditions, transitions, bindings, evaluators, compile, validate.

Evidence
Partial

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
Yes
Yes

StateTreeService ~98 methods: states, tasks, conditions, transitions, bindings, compile.

Evidence
Yes

StateTree create, states, tasks, transitions, bindings, compile, spec build; needs WITH_STATETREE.

Evidence
GAS (abilities / effects)
Yes

27 gas.* ops: abilities, effects, modifiers, cues, attribute sets, exec calcs, costs, cooldowns.

Evidence
Yes

gas category: ASC, attribute sets, abilities, effects, cues, live grant/apply/remove.

Evidence
Partial

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
Yes
Partial

No GAS service; gas skill routes to Epic GASToolsets and BlueprintTools. via Epic toolset.

Evidence
Yes

gas namespace ~135 actions: abilities, effects, attribute sets, ASC, cues; needs GameplayAbilities plugin.

Evidence
Networking / replication
Yes

22 networking.* ops: replicated vars, RepNotify, conditions, RPCs, relevance, dormancy, prediction.

Evidence
Yes

networking category: replicates, property replication, dormancy, relevancy, frequency, priority.

Evidence
Partial

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
Yes
Partial

PIE net mode settings, server/client world selectors, read var replication; no replication authoring op.

Evidence
Partial

Replicated vars with condition and OnRep, RPC flags on add_function, list/audit; actor replicates, dormancy, relevance only via set_cdo_property.

Evidence
GameMode and PlayerController authoring
Yes

game_framework.* configures GameMode rules, teams, rounds, spawn, spectating; class props via property.set.

Evidence
Yes

create_game_mode/game_state/player_controller/player_state/hud, set_world_game_mode.

Evidence
Partial

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
Yes
Partial

No GameMode ops (searched GameMode); BP create via Epic toolset, default mode via SetIniValue.

Evidence
Partial

author_map_settings sets map GameMode override and PlayerStarts; class defaults only via set_cdo_property.

Evidence
Enhanced Input asset CRUD
Yes

input.create_input_action, create_input_mapping_context, add_mapping, remove_mapping, get_input_info.

Evidence
Yes

create InputAction and IMC, add/remove/rebind mappings, modifiers, triggers, read back.

Evidence
Partial

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
Yes
Yes

InputService: create actions and mapping contexts, key mappings, modifiers, triggers.

Evidence
Partial

IA/IMC read plus modifier/trigger edits; create only via scaffold_locomotion_input; no delete or add key map.

Evidence
Chooser tables
Yes

chooser.create, add_column, add_row, set_cell, set_result, compile; needs Chooser plugin.

Evidence
Yes

chooser category: create, describe, add_column, add/set/delete rows, remap object references.

Evidence
No

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
No

Searched plugin and server source for Chooser; 0 hits.

Evidence
  • grep -ri chooser plugins/ src/: no matches
No

Searched Chooser across Source, skills, docs and Epic Toolsets; no matches.

Evidence
Yes

chooser namespace: create table, columns, rows, cells, validate, inspect.

Evidence
Mass Entity / ZoneGraph
Partial

Mass entity config create/configure only; ai.add_mass_spawner is a stub; no ZoneGraph ops.

Evidence
Partial

Mass entity config create, read, trait reorder/remove, validate; ZoneGraph is query only, no authoring.

Evidence
Partial

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
Partial

Mass entity config create and trait edits; add_mass_spawner is a stub that only dirties and saves the Blueprint; no ZoneGraph.

Evidence
No

Searched MassEntity, Mass, ZoneGraph in VibeUE and Epic Toolsets; no matches.

Evidence
  • rg -i MassEntity|ZoneGraph VibeUE: 0 files
Yes

Mass entity config CRUD, traits, processors, stats; ZoneGraph list and lane queries (read only).

Evidence
Live Behavior Tree execution path
Yes

ai.get_runtime_state returns active BT node, root first node path and task status in PIE.

Evidence
Yes
No

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
No

Only run/stop BT; searched GetActiveNode, BrainComponent, BehaviorTreeComponent: 0 hits.

Evidence
No

Searched BrainComponent, GetActiveNode, BTDebugger; BT service is asset only, refuses edits in PIE.

Evidence
Yes

ai.runtime_get_bt_execution_path: active branch, current task, decorator states in PIE.

Evidence
Live input action value
Partial

editor.simulate_input injects raw key events into PIE; no input action value read or injection.

Evidence
Yes

get_action_value reads live value, triggerEvent and mapped keys per PIE player.

Evidence
No

Searched Toolsets for InputAction, EnhancedInput, action value; no tools found.

Evidence
  • grep -iE 'InputAction|EnhancedInput' over Engine/Plugins/Experimental/Toolsets: only test files
Partial

simulate_input injects an action value into PIE; no readback of current action value.

Evidence
Partial

InjectAction pushes a typed value into PIE for one tick; no readback of current action value.

Evidence
Partial

editor.pie_inject_input_action injects values; no action to read a live action value.

Evidence
Enhanced Input validation audit
No

Searched input.* and Source for IMC or action validation audit; only get_input_info asset readback.

Evidence
Yes

validate_input audits unmapped actions, bad keys, duplicates, null triggers, missing swizzle.

Evidence
No

No Enhanced Input tools of any kind in Toolsets.

Evidence
  • grep -iE 'InputMappingContext|EnhancedInput' over Engine/Plugins/Experimental/Toolsets: only test files
No
No

Searched validate/audit/unused/orphan in InputService and enhanced-input skill; only existence checks.

Evidence
Yes

input.validate_input_mappings reports missing actions, invalid keys, duplicate key warnings.

Evidence
GAS cue coverage / attribute audit
No

Searched gas.* and Source for cue coverage or attribute audit; none found.

Evidence
Yes

validate_cue_coverage and audit_attributes (clamping, replication, OnRep, Max pairs).

Evidence
Yes

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
No

Searched GAS domain for cue coverage or attribute audit; only cue authoring actions.

Evidence
Partial

Epic GameplayCueToolset FindCueTagsWithoutNotifies; nothing in VibeUE. via Epic toolset.

Evidence
Yes

gas.validate_cue_coverage finds unhandled and orphan cues; validate_attribute_set audits sets.

Evidence
SaveGame slot inspection
No

Searched USaveGame, LoadGameFromSlot, DoesSaveGameExist in Source; none, only CPF_SaveGame flag handling.

Evidence
Yes

reflection inspect_save_game loads a slot read only and returns SaveGame properties.

Evidence
No

Searched Toolsets for SaveGame and save slot; no tools found.

Evidence
  • grep -i 'SaveGame' over Engine/Plugins/Experimental/Toolsets: no hits
No

Searched USaveGame, SaveGame, LoadGameFromSlot, DoesSaveGameExist: 0 hits.

Evidence
  • grep -ri SaveGame plugins/ src/: no matches
Partial

Searched SaveGame; no op. Only via execute_python_code on GameplayStatics load_game_from_slot.

Evidence
Partial

Only C++ SaveGame scaffolding (ui.scaffold_save_game); slot reads only via run_python.

Evidence
Collision profile resolution
Partial

set_view_mode collision report gives per actor channel response; BodyInstance readable; no profile resolver.

Evidence
Yes

resolve_collision_profile gives per channel responses; get_component_collision per component.

Evidence
No

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
Partial
Partial

Profile can be set, not resolved to channel responses; reads only via execute_python_code.

Evidence
Partial

No profile resolver; set_collision_preset only checks name exists; raw ini via config.resolve_setting.

Evidence
Player-mappable input settings
No

Searched PlayerMappable, UEnhancedInputUserSettings, MappableKey in Source and wiki; none.

Evidence
Yes

set_player_mappable_settings authors PlayerMappableKeySettings on InputAction; no runtime user remap.

Evidence
Partial

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
No

Searched EnhancedInputUserSettings and PlayerMappable: 0 hits.

Evidence
  • grep -r EnhancedInputUserSettings|PlayerMappable plugins/ src/: no matches
No

Searched PlayerMappable, Mappable, EnhancedInputUserSettings; ConfigureAction lacks mappable settings.

Evidence
Partial

get_input_action reports player mappable flags; ui.scaffold_input_remapping emits setup guidance only.

Evidence
Physics asset bodies and constraints authoring
Yes

skeleton.create_physics_asset, configure_physics_body, add_physics_constraint, configure_constraint_limits.

Evidence
Partial

Own read only (get_physics_asset_info); bodies/shapes/constraints via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
Yes

edit_physics_asset: create asset, add/configure bodies, add constraints, set limits.

Evidence
Partial

SkeletonService only reports physics asset path; bodies and constraints via Epic PhysicsToolsets.

Evidence
Partial

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.
Partial

gameplay_tags.add and remove on INI sources; remove refuses a referenced tag with TAG_IN_USE and lists the referencing packages, and gameplay_tags.find_referencers lists them per tag; no rename.

Evidence
Partial

Own create_gameplay_tag; rename, remove, find referencers via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
No

add_tag_to_asset needs pre-registered tags; no tag registry add, rename or remove.

Evidence
Partial

VibeUE has bulk add_tags only; add/remove/rename and FindReferencersByTag via Epic toolset.

Evidence
Yes

gas add_gameplay_tags, rename_tag across assets (dry_run), remove_gameplay_tags with reference check.

Evidence
Gameplay tag query builder
Yes

gameplay_tags.build_query builds FGameplayTagQuery from JSON tree and can write it to an asset.

Evidence
No

Searched TagQuery, tag_query in src, plugin, docs, skills; only internal StateTree use; epic query is WorldCondition.

Evidence
No

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
No

Searched FGameplayTagQuery and GameplayTagQuery: 0 hits.

Evidence
  • grep -r GameplayTagQuery plugins/ src/: no matches
Partial

No query builder (searched TagQuery); request_tag_container builds tag values for Python calls.

Evidence
No

Searched FGameplayTagQuery and tag_query actions; only internal use and a UI text param.

Evidence
AI archetype scaffold library
No

Searched ai.*, behavior_tree.* and wiki for archetype or template scaffolds; none.

Evidence
No

Searched archetype, patrol, enemy AI templates in docs, src, skills; only per-asset BT/EQS ops.

Evidence
  • no matches in docs/, src/, skills/
No

No AI archetype or AI template scaffolding tools found.

Evidence
  • Engine/Plugins/Experimental/Toolsets/AIModuleToolset has BT read tools only
No

Searched AI domain for archetype, template, preset, patrol; only create_ai_controller.

Evidence
No

Searched archetype, template, scaffold, preset in AI skills and services; none.

Evidence
Yes

21 AI scaffolds: boss, companion, turret, stealth, flying, horror stalker, patrol, etc.

Evidence
Static replication audit (RPCs, OnRep)
Partial

networking.get_networking_info lists RPCs, reliability, validation, OnRep per Blueprint; no project wide audit.

Evidence
Partial
Partial

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
Partial
Partial

GetVariableInfo reports per variable Replicated or RepNotify; no RPC listing or project audit.

Evidence
Yes

network.list_rpc_functions, list_onrep_handlers, audit_unbalanced_onreps from UHT reflection index.

Evidence
Third-party state-machine / combo graph authoring
No

Searched Source and wiki for third party state machine or combo graph plugins; none.

Evidence
  • wiki page index
No

Searched LogicDriver, ComboGraph, SMStateMachine, FlowGraph in src, plugin, docs, skills.

Evidence
  • no matches in src/, plugin/, docs/, skills/
No

No toolsets for third party state machine or combo graph plugins.

Evidence
  • ls Engine/Plugins/Experimental/Toolsets: engine toolsets only
No

Searched LogicDriver, SMInstance, ComboGraph: 0 hits; configure_combo_system is native.

Evidence
No

No third party graph plugins; searched combo, state machine. Only engine AnimBP and montage sections.

Evidence
Yes

logicdriver (66 actions) and combograph (13 actions); need Logic Driver Pro and ComboGraph plugins.

Evidence
Game Feature plugin activation control
Partial

game_features.list reads Game Feature plugin states; activation calls exist only in test fixtures.

Evidence
Partial

Activate/deactivate/state of Game Features via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
No

Searched GameFeaturesSubsystem and GameFeatureData: 0 hits.

Evidence
  • grep -r GameFeaturesSubsystem|GameFeatureData plugins/ src/: no matches
Partial

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
Partial

No dedicated action; searched UGameFeaturesSubsystem; only via run_console_command or run_python.

Evidence
Chaos Vehicle setup
Yes

vehicle.* wheel assets, wheel setups, suspension on Chaos wheeled vehicles; needs ChaosVehicles plugin.

Evidence
No

Searched ChaosVehicle, WheeledVehicle, VehicleMovement in src, plugin, docs, skills.

Evidence
  • no matches in src/, plugin/, docs/, skills/
No

Searched Toolsets for ChaosVehicle and WheeledVehicle; no tools found.

Evidence
  • grep -iE 'ChaosVehicle|WheeledVehicle' over Engine/Plugins/Experimental/Toolsets: no hits
Partial

configure_vehicle tunes a placed actor's Chaos movement (engine RPM, torque, gears, mass); no wheel assets; wheel radius/width/friction writes miss.

Evidence
No

Searched ChaosVehicle, Vehicle; only the ECC_Vehicle collision channel.

Evidence
Partial

Searched ChaosVehicle, WheeledVehicle: none; only generic blueprint.add_component and set_cdo_property.

Evidence
PIE network emulation (latency, packet loss)
Yes

editor.play networkEmulation {enabled, target, profile} applies to one session, off by default, never saved; editor.pie_status reads it back.

Evidence
Partial

configure_pie has no emulation fields; only via execute_command running NetEmulation.PktLag or NetEmulation.PktLoss.

Evidence
  • grep -i 'emulat|PktLag|PktLoss|PacketSimulation|NetworkEmulation|NetEmulation' over src, plugin, docs: no hits
  • docs/tool-reference.md:1724 execute_command
  • Engine/Source/Runtime/Engine/Private/Net/NetEmulationHelper.cpp:353 NetEmulation.PktLoss, :356 NetEmulation.PktLag (world console commands)
  • Engine/Source/Runtime/Engine/Private/NetDriver.cpp:779-781 persistent emulation applied to each new net driver
Partial

StartPIE has no net options; emulation only via ConfigSettings SetSectionProperties on PlayIn NetworkEmulationSettings, saved to user prefs.

Evidence
  • grep -i 'emulat|PktLag|PktLoss|PacketSimulation|NetworkEmulation|NetEmulation' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
  • Engine/Plugins/Experimental/Toolsets/ConfigSettingsToolset/Source/ConfigSettingsToolset/Private/ConfigSettingsToolset.h:96 SetSectionProperties
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:899 StartPIE uses the saved EditorPlaySettings
  • Engine/Source/Editor/UnrealEd/Classes/Settings/LevelEditorPlaySettings.h:506 NetworkEmulationSettings
Partial

play has no emulation; only via set_preferences on LevelEditorPlaySettings NetworkEmulationSettings, or console NetEmulation.PktLag.

Evidence
Partial

SetPIESettings has no emulation fields; only via execute_python_code calling SystemLibrary.execute_console_command with NetEmulation.PktLag.

Evidence
  • grep -i 'emulat|PktLag|PktLoss|PacketSimulation|NetworkEmulation|NetEmulation' over Source, Content: only an unrelated SKILL.md word
  • Source/VibeUE/Private/PythonAPI/UEngineSettingsService.cpp:618 SetPIESettings (net mode, clients, one process)
  • Engine/Source/Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h:604 ExecuteConsoleCommand
  • Engine/Source/Runtime/Engine/Private/Net/NetEmulationHelper.cpp:353 NetEmulation.PktLoss, :356 NetEmulation.PktLag (world console commands)
Partial

start_pie has no net options; only via editor.run_console_command running NetEmulation.PktLag or NetEmulation.PktLoss.

Evidence
  • grep -i 'emulat|PktLag|PktLoss|PacketSimulation|NetworkEmulation|NetEmulation' over Source, Docs, Skills: no hits
  • Source/MonolithEditor/Private/MonolithEditorActions.cpp:522 run_console_command
  • Engine/Source/Runtime/Engine/Private/Net/NetEmulationHelper.cpp:353 NetEmulation.PktLoss, :356 NetEmulation.PktLag (world console commands)
  • Engine/Source/Runtime/Engine/Private/NetDriver.cpp:779-781 persistent emulation applied to each new net driver
Live AI path-following status
Yes

ai.get_runtime_state pathFollowing: status, valid and partial path, reached goal, request id to tell a blocked pawn from an abort loop.

Evidence
Partial

No path-following op; only via execute_python calling AAIController GetMoveStatus and HasPartialPath.

Evidence
No

No runtime AI move status tool; AI toolset reads assets only, and there is no Python escape hatch.

Evidence
  • grep -iE 'PathFollowing|GetMoveStatus|DidMoveReachGoal|HasPartialPath|EPathFollowingStatus' over Experimental Toolsets, ModelContextProtocol, ToolsetRegistry (*.py, *.h, *.cpp): no hits
Partial

No path-following action; only via execute_python calling AAIController GetMoveStatus and HasPartialPath.

Evidence
  • grep -iE 'PathFollowing|GetMoveStatus|DidMoveReachGoal|HasPartialPath|path.?follow' over src, plugins, docs: no hits (only unrelated bHasValidPaths in AssetQuerySearch.cpp)
  • src/tools/catalog/capabilities/records/system-control/system-ops.ts:316 execute_python
  • Engine/Source/Runtime/AIModule/Classes/AIController.h:246 GetMoveStatus, :250 HasPartialPath (BlueprintCallable)
Partial

No path-following op; only via execute_python_code calling AAIController GetMoveStatus and HasPartialPath.

Evidence
  • grep -iE 'PathFollowing|GetMoveStatus|DidMoveReachGoal|HasPartialPath|path.?follow' over Source, Content: no hits
  • Source/VibeUE/Private/Tools/PythonToolsRegistration.cpp:169 execute_python_code
  • Engine/Source/Runtime/AIModule/Classes/AIController.h:246 GetMoveStatus, :250 HasPartialPath (BlueprintCallable)
Partial

No move status action; PIE smoke move_to reports only the request result; status only via editor.run_python.

Evidence
Multi-client PIEConfigures net mode and client count and runs multi-client PIE.
Yes

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.

Yes

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.

Partial

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
Partial
Yes

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.

Partial

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.
Yes

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.

Yes

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.

Partial

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
Yes
No

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
Yes

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.
Partial

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.

Yes

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.

Partial

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
Partial

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.

Partial

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.

Yes

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.
Partial

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.

No

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/
No

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
Yes

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.

No

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
Partial

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.
Partial

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.

Yes

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.

No

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
Partial

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.

Partial

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.

Partial

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

18 / 26
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.
Yes

Project setting bDisableBackgroundThrottleWhileAgentActive (on by default) turns off the editor's 3 FPS background throttle while an agent is active and restores the user's preference afterwards.

Evidence
Partial

pie-studio plugin only: CPU throttle suppressed during sessions; core does it only for automation tests.

Evidence
No

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)
Yes
Yes

PerformanceService.set_background_throttling toggles bThrottleCPUWhenNotForeground for session.

Evidence
No

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
Partial

editor.play lists blueprintsWithErrors at start; runtime errors only if code logs journal events.

Evidence
Partial

Core get_message_log reads the PIE Message Log and get_log reads output; no per-session capture.

Evidence
Partial

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
Partial
Partial

Scenario report stores log delta since start; errors only via assert_log not_contains.

Evidence
Yes

PIE smoke counts post marker log hits; defaults include Blueprint Runtime Error and Accessed None.

Evidence
Gameplay telemetry recorded from game code
Yes

FJournalRecorder LogVariable/LogEvent and PW_JOURNAL_LOG; editor-only module, host code must call it.

Evidence
No

Searched telemetry, journal in src/tools and bridge; only read_actor_motion one-shot polled snapshots.

Evidence
No

No gameplay telemetry journal API; only log file reading via LogsToolset.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/LogsToolset.h:29
No

No gameplay telemetry journal; telemetry files are server metrics, Insights is profiling. Searched journal.

Evidence
No

Workflow journal logs agent runs, notes and artifacts, not gameplay telemetry from game code.

Evidence
No

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)
Yes

recorder.get_state, summarize_change (extrema), get_series, find_events, list_segments, query.

Evidence
Partial

pie-studio plugin only: pie_record_read/pie_observe_read return raw artifacts; no extrema or event query.

Evidence
No

No recorded sessions to query; searched for session, record, journal tools.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep record|journal|replay: none)
No

No query over recorded sessions; demo replays can be played or seeked but not queried for state.

Evidence
No

get_scenario and list_runs return step reports only; no state, extrema or event query.

Evidence
Partial

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
Yes

editor.start_recording and stop_recording run a GameInstance demo replay recording in the PIE world.

Evidence
No

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

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
Yes
Partial

No demo recording API; demorec reachable only via scenario console_command escape hatch.

Evidence
No

No demo recording; searched DemoNetDriver, demorec, ReplaySubsystem, StartRecordingReplay.

Evidence
  • rg -il 'DemoNetDriver|demorec|StartRecordingReplay' Source Docs Skills wiki: no hits
Record Event Dispatcher broadcasts on a live object
Yes

blueprint.record_dispatcher binds a recorder job: params per broadcast, count and timeout bounds, pauseOnFire.

Evidence
No

Authors dispatchers and fires widget delegates; nothing records broadcasts; Python needs custom code.

Evidence
No

Blueprint toolset only lists and authors dispatchers; no runtime binding or broadcast recording.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/blueprint.py:110 (list_event_dispatchers, authoring)
  • grep multicast|BindUFunction|AddDelegate|add_callable in ModelContextProtocol, ToolsetRegistry, Toolsets: no runtime binding
No

No dispatcher listener or event watch tool; execute_python would need hand-written binding and recording.

Evidence
No

Scenario runner injects input and asserts logs; no delegate recording; Python needs custom code.

Evidence
No

get_event_dispatchers reads definitions only; no runtime broadcast recording; run_python needs custom code.

Evidence
Input record and replay with drift reportRecords play input, replays it through Enhanced Input, and reports per-frame drift from a reference run.
No

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.

Partial

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.

No

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)
Partial

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.

No

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.

Partial

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.
Partial

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.

Partial

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.

Partial

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
No

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.

No

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.

Partial

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.
Partial

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): drive.expect asserts UI and journal_event conditions now, drive.wait_for until met; recorded sessions only via recorder.query Python; no always/eventually.

Partial

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.

No

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)
Partial

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
Partial

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.

Partial

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

19 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Landscape CRUD
Yes

landscape.create, edit, sculpt, get_heights, set_material; deletion goes through the generic actor delete.

Evidence
Yes

create, get_info, set_material, layers, proxies; delete goes through generic level(delete_actors).

Evidence
No

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')
Yes
Yes

LandscapeService create, list, info, resize, delete, save and property setters.

Evidence
Partial

No landscape actions (no ALandscape use outside indexer); only reachable via editor.run_python.

Evidence
PCG graph CRUD
Yes

pcg.create_graph, add_node, remove_node, connect_pins, set_node_property, inspect, decompile, pcgir.

Evidence
Yes

create_graph, add/remove/connect nodes, set_node_settings, JSON import/export of whole graphs.

Evidence
Yes

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
Partial

Create graph, subgraph, add nodes, connect pins, set settings; no node delete, disconnect or graph read action.

Evidence
Partial

No VibeUE PCG service (no PCG symbols in Source); via Epic toolset PCGToolset or Python per pcg skill.

Evidence
Partial

No PCG actions or PCG module use; only via editor.run_python with the PCG plugin enabled.

Evidence
Runtime Virtual Texture authoring
Partial

No RVT verb or handler; RVT assets and volumes only via generic python.execute, actor.spawn and property.set.

Evidence
Yes

create_rvt, read_rvt, add_rvt_volume, sampler/output nodes, assign_rvt_to_landscape.

Evidence
No

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)
No

Searched RuntimeVirtualTexture, runtime_virtual, rvt in src and plugins: no hits; only texture VT streaming config.

Evidence
Yes

RVT asset create, RVT volume create, assign RVT to landscape.

Evidence
Partial

No RVT authoring action; only reads MFI RVT params; authoring only via editor.run_python.

Evidence
Real-world GPS terrain
No

Searched wiki and source for GPS, latitude, longitude, SRTM, GeoTIFF, Cesium: only image georeference, no terrain.

Evidence
Partial

plan_real_world sizes tile from lat/lon bounds, geo projection both ways; no DEM download, user supplies file.

Evidence
No

No GPS, geo, elevation data or real world terrain tool found in any toolset.

Evidence
  • Engine/Plugins/Experimental/Toolsets (searched landscape, heightmap, terrain terms)
No

Searched gps, geotiff, srtm, mapbox, dem, elevation; elevation and latitude only used for sun and weather.

Evidence
Yes

terrain_data tool makes heightmaps from lng/lat via hosted vibeue.com; needs free VibeUE API key.

Evidence
No

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)
Partial

No slope or flat-area finder; get_heights region min/max/mean, audit_shape, pcg.add_slope_filter node.

Evidence
Yes

analyze_terrain returns height/slope histograms and largestFlatArea; slope map and slope at point.

Evidence
Partial

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
No

Searched slope, flatness, flat_area, analyze_terrain; slope only a PCG filter node and AI nav settings.

Evidence
Yes

AnalyzeTerrain, slope at location, slope map, normals, FindFlatAreas.

Evidence
Partial

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
Yes

spatial.ground_instances seats each ISM/HISM instance on its own footprint and re-measures.

Evidence
Yes

snap_instances_to_surface projects ISM/HISM instances onto geometry, dry run default, keeps rotation/scale.

Evidence
Partial

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
Partial
Partial

Foliage instances traced to ground and normal aligned at placement; no reseat op for existing ISM instances.

Evidence
Partial

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)
Yes

water.spawn_water_body River/Lake/Ocean/Custom; river width and depth set per spline point in UWaterSplineMetadata; material verbs.

Evidence
Partial

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
Partial

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)
Yes
Partial

No WaterBody service; real world river/lake/ocean splines as data, WaterBody spawn only via Python.

Evidence
Partial

No water actions; only via editor.run_python with the Water plugin enabled.

Evidence
PCG generation with spawned-output readback
Yes

pcg.generate async job reports instanceCount, spawnedActorCount, instancesByMesh, pointCount.

Evidence
Partial

own execute reports seed only; node output readback via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
Partial
Partial

Only via Epic toolset PCGToolset or Python; pcg skill counts ISM instances on the PCG volume.

Evidence
Partial

No PCG generate or output readback action; only via editor.run_python with PCG plugin.

Evidence
Procedural map blockout from landscape
No

Searched blockout, level-building pages and landscape verbs; blockout is guide text, no generator from landscape.

Evidence
No

searched blockout, generate_level/map, layout; only BSP to static mesh conversion exists.

Evidence
No

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)
No

Searched blockout, greybox, map layout actions; only hit is an editor camera file, nothing derives blockout.

Evidence
Yes

MapBlockoutService runs roads, POIs, fields, foliage, railway pipeline from a landscape and materializes.

Evidence
No

Blockout tools work from blockout volumes, not landscape; searched blockout actions for landscape input.

Evidence
Landscape shape audit (stair-stepping)
Yes

landscape.audit_shape measures axisFraction and stepFraction per region; pass:false on grid-locked or stepped terrain, unmeasurable region fails.

Evidence
No

No shape audit; GPS terrain import only warns up front that vertical precision over 10 cm will terrace gentle slopes.

Evidence
No

No landscape tools; searched stair-step and landscape audit terms.

Evidence
  • grep -i 'axis.?fraction|stair.?step|staircase|terrac' and '(audit|validate|verify|check)_?(landscape|terrain)' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
No

No terrain shape audit; searched stair-step and landscape audit terms.

Evidence
  • grep -i 'axis.?fraction|stair.?step|staircase|axis_locked|terrace.?artifact' and '(audit|validate|verify|check)_?(landscape|terrain)' over src, plugins, docs: no landscape hits
No

No shape audit; blocky-terrace wording is a comment on its resampler.

Evidence
No

No terrain shape audit; searched stair-step and landscape audit terms.

Evidence
  • grep -i 'axis.?fraction|stair.?step|staircase|terrac' and '(audit|validate|verify|check)_?(landscape|terrain)' over Source, Docs, Skills: no hits
Foliage stored vs drawn instance verification
Yes

get_instances, add_instances, paint report ledgerMatchesRendered, orphans, builtInstanceCount, clusterTreeUpToDate, expectedDrawnInstances.

Evidence
No

Foliage listing returns the HISM GetInstanceCount only; no ledger, built-tree or density-cull comparison.

Evidence
No

No foliage tools; searched built-instance and density-scale APIs.

Evidence
  • grep 'NumBuiltInstances|IsTreeFullyBuilt|foliage\.DensityScale|bEnableDensityScaling|GetInstanceCount' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
No

Foliage queries read ledger instances only; searched NumBuiltInstances, IsTreeFullyBuilt, density cvars.

Evidence
No

GetInstanceCount returns the foliage ledger count only; nothing compares it with the drawn component.

Evidence
No

No foliage actions; searched built-instance and density-scale APIs.

Evidence
  • grep 'NumBuiltInstances|IsTreeFullyBuilt|BuildTreeIfOutdated|foliage\.DensityScale|bEnableDensityScaling|PerInstanceSMData\.Num' over Source, Docs, Skills: no hits
Landscape layer-paint impact report
Yes

Layer paint reports otherLayerTexelsLost, each layer's measured blend method and zero-sampled layers; refuses on orphaned layer weight.

Evidence
No

paint_layer reports the painted layer's changed vertices only; other layers are read back by hand with get_layer_weight_region.

Evidence
No

No landscape paint tools; searched SetAlphaData, LandscapeLayerInfo, paint_landscape.

Evidence
  • grep -i 'SetAlphaData|paint_landscape|PaintLayer|LandscapeLayerInfo' over Toolsets (py, cpp, h): no hits
No

paint_landscape_layer returns layer name and strength only; no other-layer census or orphan guard.

Evidence
No

No impact report; GetWeightsInRegion reads one layer's raw weights for manual comparison.

Evidence
No

No landscape layer paint; searched SetAlphaData, LandscapeLayerInfo, PaintLayer.

Evidence
  • grep -i 'SetAlphaData|paint_landscape|PaintLayer|LandscapeLayerInfo' over Source: no hits
Landscape grass authoring and grass-cache refresh
Yes

create_grass_type reports effective density after grass.densityScale; flush_grass rebuilds one grass type's consumers and keeps grass maps.

Evidence
Partial

Grass type via generic create_asset_by_class and set_property, grass node via add_expression; refresh only via execute_command grass.FlushCache.

Evidence
No

No grass tools and no Python or console escape hatch; data_asset.create accepts DataAsset subclasses only.

Evidence
  • grep 'LandscapeGrassType|FlushGrass|RemoveGrassInstances|grass\.FlushCache|LandscapeGrassOutput' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/data_asset.py:27 asserts DataAsset subclass
Partial

create_landscape_grass_type makes a one-variety grass type; no refresh op, only console_command grass.FlushCache.

Evidence
Partial

CreateGrassOutput wires grass types into a landscape material; grass type asset and grass.FlushCache only via Python.

Evidence
Partial

No grass op; only via editor.run_python with LandscapeGrassTypeFactory and editor.run_console_command grass.FlushCache.

Evidence
  • grep 'LandscapeGrassType|FlushGrass|grass\.FlushCache|LandscapeGrassOutput' over Source, Docs, Skills: no hits
  • Source/MonolithEditor/Private/MonolithEditorActions.cpp:824 run_python, :522 run_console_command
  • Engine/Source/Editor/FoliageEdit/Private/LandscapeGrassTypeFactory.h:21 ULandscapeGrassTypeFactory
  • Engine/Source/Runtime/Landscape/Private/LandscapeGrass.cpp:3483 grass.FlushCache console command
Heightmap and weightmap read, write, importImports and exports heightmaps and edits height or layer-weight regions.
Partial

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.

Yes

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.

Partial

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
Partial

Heightmap import/export (Yes): import_heightmap and export_heightmap actions under build_environment, raw 16 bit files, optional region.

Height/weight region read-write (Partial): Region height write and region height export to file; region weight paint write; no weight read.

Yes

Heightmap import/export (Yes): ImportHeightmap, ExportHeightmap, ResizeHeightmap plus weightmap import and export.

Height/weight region read-write (Yes): Get/SetHeightInRegion and Get/SetWeightsInRegion arrays.

Partial

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.
Partial

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.

Yes

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.

No

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)
No

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.

Yes

Erosion simulation (Yes): ApplyErosion operation on landscape heights.

Procedural terrain feature stamps (Yes): CreateMountain, Valley, Ridge, Plateau, Crater, Terraces, BlendTerrainFeatures.

No

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.
Yes

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.

Yes

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.

Partial

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
Yes

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.

Yes

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.

Partial

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

20 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Mesh ops (UV, simplify, remesh, boolean)
Yes

geometry.* verbs: unwrap_uv, simplify_mesh, remesh_uniform, booleans; extrude, inset, bevel, shell, bridge, bend, twist, taper, noise.

Evidence
Yes

Own GeometryScript actions: apply_mesh_simplify, apply_mesh_remesh, mesh_boolean, unwrap_uvs, transform_uvs.

Evidence
Partial

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)
Yes
Partial

Dedicated UV ops only (unwrap, pack, lightmap UVs, transform); no simplify, remesh or boolean found.

Evidence
Partial

boolean, simplify, remesh, compute_uvs exist but need GeometryScripting plugin; release zip DLLs omit them.

Evidence
Collision generation
Yes

geometry.generate_collision (box, convex, decomposition, auto), generate_complex_collision, simplify_collision.

Evidence
Yes

generate_mesh_collision: boxes, spheres, capsules, convex hulls, swept hulls, level sets; also clear op.

Evidence
Yes

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
Yes

generate_collision, generate_complex_collision and simplify_collision actions in manage_geometry.

Evidence
Partial

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
Yes

set_mesh_collision always registered (simple shapes, complex); auto convex and generate_collision need GeometryScripting.

Evidence
Fracture / Dataflow graphs
Partial

No fracture op; only via python.execute calling engine UDataflowEditorBlueprintLibrary (fracture nodes need GeometryCollectionPlugin).

Evidence
Partial

apply_mesh_fracture only plane cuts into separate StaticMeshes, no GeometryCollection; Dataflow via Epic toolset, 5.8 only.

Evidence
Yes

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
Partial

No fracture op (destructible only adds a tag); only via execute_python calling engine UDataflowEditorBlueprintLibrary (needs GeometryCollectionPlugin).

Evidence
Partial

No own fracture code; Dataflow via Epic DataflowAgent (not enabled) or execute_python calling engine UDataflowEditorBlueprintLibrary.

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
  • Source/VibeUE/Public/Tools/PythonTools.h:46 execute_python_code
  • Engine/Plugins/Dataflow/Source/DataflowEditor/Private/Dataflow/DataflowEditorBlueprintLibrary.h:20 AddDataflowNode, :26 ConnectDataflowNodes
Partial

create_fragments plane slicing only; Dataflow graphs only via editor.run_python calling engine UDataflowEditorBlueprintLibrary.

Evidence
Batch static-mesh geometry defect audit
Yes

audit_static_meshes flags inverted, open, non-manifold, degenerate, z-fighting and (opt-in) self-intersecting.

Evidence
Partial

measure_mesh_geometry: manifold, holes, signedVolume, isClosed but no inverted verdict; check_uvs; one asset per call, no batch.

Evidence
No

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

No batch mesh defect audit; get_mesh_info is per mesh, repair ops modify; audit_placement checks actor placement only.

Evidence
Partial

Per mesh UV health only (lightmap overlaps, texel density); no batch geometry defect scan.

Evidence
Yes

batch_validate: SQL prefilter on mesh catalog then deep load; flags collision, LODs, degenerate geo, pivot.

Evidence
Static mesh LOD generation and Nanite toggle
Yes

asset.generate_lods, geometry.set_lod_settings; asset.nanite_rebuild_mesh toggles Nanite per mesh.

Evidence
Partial

Own set_nanite_settings toggles Nanite; LOD generation only epic_generate_lods via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
Yes
Partial

No own LOD or Nanite tool; Epic StaticMeshTools only reads LOD counts; possible via execute_python_code.

Evidence
Partial

auto_generate_lods writes LODs (GeometryScripting); set_lod_screen_sizes; Nanite only read, no toggle.

Evidence
Customizable (Mutable) character graph authoring
No

No Mutable op; python.execute reaches only engine NewCustomizableObject and compile, no graph node or pin API.

Evidence
  • Grep CustomizableObject|MutableTools over Plugins/PinWright Source, Content/Python, docs/wiki-src: no hits
  • Saved/PinWright/wiki has no mutable or customizable pages
  • operation python.execute
  • Engine/Plugins/Mutable/Source/CustomizableObjectEditor/Public/MuCOE/CustomizableObjectEditorFunctionLibrary.h:66 CompileCustomizableObjectSynchronously, :74 NewCustomizableObject (only BlueprintCallable Mutable editor calls)
Yes

create_customizable_object and compile_customizable_object; nodes via generic add_graph_node, connect_graph_pins.

Evidence
No

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
No

Mutable only planned in Roadmap 36.3; execute_python reaches only engine NewCustomizableObject and compile, no graph API.

Evidence
  • docs/Roadmap.md:1642-1647
  • searched CustomizableObject outside docs: no matches
  • Engine/Plugins/Mutable/Source/CustomizableObjectEditor/Public/MuCOE/CustomizableObjectEditorFunctionLibrary.h:66 CompileCustomizableObjectSynchronously, :74 NewCustomizableObject
Yes

CustomizableObjectService creates CO assets, adds and wires nodes, compiles; needs Mutable plugin.

Evidence
No

No Mutable actions; editor.run_python reaches only engine NewCustomizableObject and compile, no graph node or pin API.

Evidence
Edit skinned-mesh geometry, write back with skinning
Yes

create_from_skeletal_mesh loads bones and weights for any geometry.* op; convert_to_skeletal_mesh writes back, refusing unskinned verts.

Evidence
Partial

unwrap_uvs round-trips a SkeletalMesh via GeometryScript (UVs only); other edits only via execute_python calling CopyMeshToSkeletalMesh.

Evidence
No

skeletal_mesh tools cover import, counts, bones, materials and sockets; no geometry edit tool and no unrestricted Python.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/skeletal_mesh.py:16-436 (full tool list)
  • grep 'CopyMeshToSkeletalMesh|UDynamicMesh|GeometryScript' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
Partial

skin_mesh_to_skeleton writes a mesh as a new skinned SkeletalMesh; no geometry op loads a skeletal mesh except via execute_python.

Evidence
Partial

No skinned-mesh geometry op; only via execute_python_code calling GeometryScript CopyMeshTo/FromSkeletalMesh (GeometryScripting plugin).

Evidence
  • grep 'CopyMeshToSkeletalMesh|CopyMeshFromSkeletalMesh|FSkeletalMeshAttributes' over Source, Content: no hits
  • Source/VibeUE/Private/Tools/PythonToolsRegistration.cpp:169 execute_python_code
  • VibeUE.uplugin enables MeshModelingToolset, not GeometryScripting
  • Engine/Plugins/Runtime/GeometryScripting/Source/GeometryScriptingCore/Public/GeometryScript/MeshAssetFunctions.h:410 CopyMeshFromSkeletalMesh, :423 CopyMeshToSkeletalMesh
Partial

No skinned-mesh geometry op; only via editor.run_python calling GeometryScript CopyMeshTo/FromSkeletalMesh.

Evidence
  • grep 'CopyMeshToSkeletalMesh|CopyMeshFromSkeletalMesh|FSkeletalMeshAttributes' over Source, Docs, Skills: no hits
  • Source/MonolithEditor/Private/MonolithEditorActions.cpp:824 editor.run_python
  • Monolith.uplugin:51 GeometryScripting (enabled, optional)
  • Engine/Plugins/Runtime/GeometryScripting/Source/GeometryScriptingCore/Public/GeometryScript/MeshAssetFunctions.h:410 CopyMeshFromSkeletalMesh, :423 CopyMeshToSkeletalMesh
Mesh geometry as text or buffers (OBJ/STL, vertex arrays)
Yes

export_obj/export_stl return text inline; import_obj/import_stl take text; append_buffers bulk-writes vertices and triangles.

Evidence
Partial

get_mesh_geometry reads positions, UVs, normals, triangles as JSON; OBJ only as whole-file asset import; no buffer write.

Evidence
Partial

static_mesh import_file imports an OBJ from disk; no mesh export, vertex read or buffer write.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py:15 import_file
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/tests/test_static_mesh.py:213 test_import_file_obj
Partial

append_triangle adds one triangle per call; get_mesh_info returns counts only; no text or bulk buffer I/O.

Evidence
Partial

No mesh text or buffer op; only via execute_python_code calling AssetExportTask (OBJ exporter) or GeometryScript buffer functions.

Evidence
  • grep -i 'Wavefront|\.obj|GetAllVertexPositions|AppendBuffersToMesh' over Source, Content: no hits
  • Source/VibeUE/Private/Tools/PythonToolsRegistration.cpp:169 execute_python_code
  • Engine/Source/Runtime/Engine/Classes/Exporters/Exporter.h:255 RunAssetExportTask
  • Engine/Source/Editor/UnrealEd/Classes/Exporters/StaticMeshExporterOBJ.h:17 UStaticMeshExporterOBJ
  • Engine/Plugins/Runtime/GeometryScripting/Source/GeometryScriptingCore/Public/GeometryScript/MeshBasicEditFunctions.h:430 AppendBuffersToMesh
Partial

mesh.get_vertex_data reads positions and normals, 5000 per call; no text export or buffer write.

Evidence
Skinned-mesh separation audit across animation frames
Yes

geometry.audit_skeletal_animation_floating poses the mesh in an animation's frames and reports islands that separate from the body.

Evidence
No

Searched floating, disconnected component, interpenetration, per-frame separation; no skinned-mesh animation audit.

Evidence
  • grep -i 'floating_component|floating.?part|disconnected.?component|interpenetrat|poke.?through|separation.*frame|detach.*frame' over src, plugin, docs: no hits
No

No mesh audit tools; floating hits are editor window and UI layout text only.

Evidence
  • grep -i 'floating|interpenetrat|disconnected' over Toolsets, ModelContextProtocol, ToolsetRegistry: only EditorAppToolset.h:42 floating window and unrelated UI hits
No

Only actor placement interpenetration checks; no skinned-mesh separation audit over animation frames.

Evidence
No

Searched floating, disconnected component, interpenetration, per-frame separation; no mesh audit.

Evidence
  • grep -i 'floating_component|floating.?part|disconnected.?component|interpenetrat|poke.?through|separation.*frame|detach.*frame' over Source, Content: no hits
No

analyze_skeletal_mesh is a static bind-pose quality check; no per-frame separation audit.

Evidence
Vertex colour painting and ambient-occlusion bake
Yes

set_vertex_color paints vertices; bake_ambient_occlusion ray-casts AO into chosen vertex-colour channels.

Evidence
Partial

No vertex colour or AO op; only via execute_python calling GeometryScript SetMeshPerVertexColors and BakeVertex (GeometryScripting plugin).

Evidence
  • grep -i 'VertexColor|vertex_color|BakeVertex|MakeBakeType|AmbientOcclusion' over src, plugin, docs: only SkeletalMeshHandlers.cpp:864 bUpdateVertexColors=false
  • src/tools/editor.ts:126 execute_python (gated last resort)
  • Engine/Plugins/Runtime/GeometryScripting/Source/GeometryScriptingCore/Public/GeometryScript/MeshVertexColorFunctions.h:156 SetMeshPerVertexColors
  • Engine/Plugins/Runtime/GeometryScripting/Source/GeometryScriptingCore/Public/GeometryScript/MeshBakeFunctions.h:636 BakeVertex, :583 MakeBakeTypeAmbientOcclusion
No

No vertex colour or AO tools; searched vertex_color, VertexColor, AmbientOcclusion over Toolsets; no unrestricted Python.

Evidence
  • grep -i 'vertex_color|vertexcolor|ambient_occlusion|AmbientOcclusion' over Toolsets, ModelContextProtocol, ToolsetRegistry: no hits
Partial

set_vertex_color sets one vertex or all on a DynamicMeshActor; AO bake only via execute_python calling GeometryScript BakeVertex.

Evidence
Partial

No vertex colour or AO op; only via execute_python_code calling GeometryScript SetMeshPerVertexColors and BakeVertex (GeometryScripting).

Evidence
  • grep -i 'VertexColor|vertex_color|BakeVertex|AmbientOcclusion' over Source, Content: no hits
  • Source/VibeUE/Private/Tools/PythonToolsRegistration.cpp:169 execute_python_code
  • Engine/Plugins/Runtime/GeometryScripting/Source/GeometryScriptingCore/Public/GeometryScript/MeshVertexColorFunctions.h:156 SetMeshPerVertexColors
  • Engine/Plugins/Runtime/GeometryScripting/Source/GeometryScriptingCore/Public/GeometryScript/MeshBakeFunctions.h:636 BakeVertex, :583 MakeBakeTypeAmbientOcclusion
Partial

Reads has_vertex_colors only; painting and AO only via editor.run_python calling GeometryScript SetMeshPerVertexColors and BakeVertex.

Evidence
Bake a transform into a static mesh asset (all LODs)
Yes

static_mesh.bake_transform bakes rotation, translation and uniform scale into all LODs, hi-res source, simple collision and sockets.

Evidence
Partial

recenter_pivot translates LOD0 only, to the bounds center; no rotation, scale or other LODs.

Evidence
No

static_mesh toolset covers LODs, materials and Nanite; no transform bake.

Evidence
  • grep -iE 'pivot|ApplyTransform|transform' over Engine/Plugins/Experimental/Toolsets/EditorToolset/Content/Python/editor_toolset/toolsets/static_mesh.py: no hits
No

translate_mesh edits a DynamicMeshActor in the level, not a static mesh asset; no asset transform bake.

Evidence
No

No mesh transform op; Python would need a per-LOD GeometryScript loop, as no engine API bakes a transform into all LODs.

Evidence
  • grep -iE 'pivot|ApplyTransform|BuildScale3D' over Source, Content: no transform bake (FStaticMeshOperations used for UVs only, UUVMappingService.cpp)
  • Engine/Source/Editor/StaticMeshEditor/Public/StaticMeshEditorSubsystem.h:90 SetLodBuildSettings (BuildScale3D, scale only)
No

center_pivot recenters components of a prefab Blueprint, not mesh geometry; no asset transform bake.

Evidence
Procedural mesh modeling (primitives, sweeps, lofts)Generates parametric primitives and sweeps, lofts or revolves profiles along splines.
Yes

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.

Partial

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.

Partial

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
Yes

Parametric blockout primitives (stairs, arches) (Yes): create_stairs, create_spiral_stairs, create_arch, create_ramp primitives spawn DynamicMeshActors.

Spline-driven sweep, loft and revolve (Yes): sweep along a spline actor, loft, revolve and extrude_along_spline actions in manage_geometry.

No

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.

Partial

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

21 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Widget Blueprint CRUD
Yes

create_widget_blueprint, add, set, describe, remove_widget, rename, reparent, duplicate.

Evidence
Yes

create, read_tree, add_widget, remove_widget, move_widget, set_property, set_style, list, bulk_set_properties.

Evidence
Yes

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
Yes
Partial

WidgetService edits tree and properties; asset create only via Python factory script.

Evidence
Yes

ui.create_widget_blueprint, add_widget, remove_widget, rename_widget, move_widget, get_widget_tree, set_widget_property.

Evidence
UMG animation CRUD
Yes

Create/delete animations, add tracks and keyframes, JSON export/import of animation tracks.

Evidence
Yes

create/delete/get animation, add/remove track, add/remove key and event key, bind animation events.

Evidence
No

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
Yes

create_widget_animation, add_animation_track, add_animation_keyframe, delete_animation; set_animation_loop and _speed store nothing.

Evidence
Yes

List, create, remove animations, add tracks and keyframes.

Evidence
Yes

ui.create_animation, add_animation_keyframe, list_animations, get_animation_details, remove_animation.

Evidence
MVVM bindings
No

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
Partial

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
Yes

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)
No

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
Yes

List/add/remove ViewModels and ViewModel bindings with binding modes.

Evidence
No

Searched MVVM and ViewModel across Source; only Niagara editor ViewModel includes, no MVVM binding actions.

Evidence
Audio PCM decode
Partial

SoundWave PCM decode ships but feeds only analysis, granular and export checks; no verb returns decoded samples.

Evidence
Yes

extract_pcm decodes a SoundWave to 16 bit interleaved PCM returned as base64.

Evidence
No

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
No

Searched RawPCMData, GetImportedSoundWaveData, RawData.Lock; get_audio_info returns duration, rate, channels.

Evidence
  • grep -iE 'RawPCMData|ImportedSoundWave|RawData.Lock' plugins/McpAutomationBridge/Source src: empty
No

Searched for PCM, RawPCMData, decode; SoundWave info returns duration, rate, channels only.

Evidence
No

Searched RawPCM, DecodeCompressed, ImportedSoundWave, GetPCM; get_sound_wave_info returns metadata only.

Evidence
  • grep RawPCM|DecodeCompressed|ImportedSoundWave|GetPCM Source/ (no hits)
Extract widget subtree
Partial

export_xml/describe take widgetName for subtree export, widget.duplicate copies subtrees; no extract to new WBP op.

Evidence
Yes

extract_subtree lifts a designer subtree into a new WBP via the UMG clipboard serializer, dryRun default.

Evidence
Partial

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
No

Searched extract_widget and subtree ops; get_widget_info lists the whole tree flat, no subtree extraction.

Evidence
No

Searched for subtree extract or convert to user widget: not found; only reparent and remove.

Evidence
No

Searched subtree/extract actions; dump_ui_spec takes whole WBP only, no extract to new WBP.

Evidence
Widget tree as markup (export/import)
Yes

widget.export_xml and widget.import_xml round trip the tree as XML markup.

Evidence
Partial

Export only: read_tree JSON, epic_get_widget_description text dump (UE 5.8); no markup import found.

Evidence
Partial

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
Partial

get_widget_info exports tree as JSON (class, parent, slot, text); no markup import or round trip.

Evidence
Partial

GetWidgetSnapshot exports tree, slots, properties as structs; no markup format or import.

Evidence
Yes

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
Yes

widget.screenshot_designer captures the Designer preview to PNG without PIE; showOnly, hide and visibility overrides auto-revert.

Evidence
Partial

No widget renderer; capture_screenshot target=window of an open designer, or epic_screenshot (UE 5.8 only).

Evidence
Partial

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
Partial
Yes

CapturePreview renders the WBP offscreen with FWidgetRenderer to a PNG.

Evidence
Yes

editor.capture_scene_preview with asset_type widget renders a WBP via FWidgetRenderer.

Evidence
Widget tree refactors (wrap, change class)
Yes

widget.wrap wraps in a new panel; widget.replace_class swaps class keeping children and slot.

Evidence
Partial

Native wrap_root only; wrap any and change class via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
Partial

reparent_widget moves a widget to another panel; no wrap or change widget class op.

Evidence
Partial

ReparentWidget moves a widget to another panel; no wrap or change class op.

Evidence
Partial

Class change only for Button/TextBlock/Border to CommonUI and reparent_widget_root; no generic wrap.

Evidence
Wait-for and assert on live UI
Yes

drive.wait_for and drive.expect assert conditions against the live UI surface.

Evidence
Partial

epic_wait_for checks text present or gone once, no blocking wait; via wrapped Epic toolset, UE 5.8 only.

Evidence
Partial

Slate Inspector WaitFor checks text present or gone once and returns immediately; no blocking wait, caller polls.

Evidence
  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:170-175 WaitFor ("Non-blocking: checks once and returns immediately. Poll to wait.")
No

Searched catalog and handlers for wait, assert, expect, poll UI actions; none.

Evidence
  • grep action: '*wait*|*assert*|*expect*' src/tools/catalog: empty
Partial

PIE scenarios offer fixed waits and generic Python or log asserts; no widget specific wait.

Evidence
No

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
Yes

decompile_metasound emits MSIR text; decompile_sound_cue emits SCIR text; decompile only, no text import yet.

Evidence
Partial

JSON readback (metasound_read_document, cue_get_graph) and JSON spec authoring; no text IR.

Evidence
No

No sound graph text export; grep SoundCue/MetaSound across Toolsets found nothing.

Evidence
  • Engine/Plugins/Experimental/Toolsets (rg: no hits)
No

get_audio_info returns SoundCue node count and root name only; no MetaSound or cue graph dump.

Evidence
Partial

Structured node and connection lists for both graph types; no text format or import.

Evidence
Partial

JSON readback (get_metasound_graph, get_sound_cue_graph) and build_*_from_spec JSON authoring; no text IR.

Evidence
Level acoustics and sound propagation analysis
No

Searched wiki for acoustic, propagation, occlusion analysis; only reverb volume creation exists.

Evidence
No

Searched acoustics, propagation, reverb analysis; only AudioVolume placement exists, no analysis.

Evidence
No

No acoustics or propagation analysis; searched Toolsets for sound, audio, occlusion.

Evidence
  • Engine/Plugins/Experimental/Toolsets (rg -i sound|audio|occlusion)
No

Only creates audio and reverb volumes; no acoustics or propagation analysis found.

Evidence
No

Searched for acoustics, occlusion, reverb volume, propagation: not found.

Evidence
  • grep Occlusion|Acoustic over Source: only material AmbientOcclusion hits
Yes

mesh.analyze_room_acoustics RT60 and mesh.analyze_sound_propagation occlusion plus navmesh paths.

Evidence
UMG property bindings (create and validate)
Yes

widget.bind writes the Bindings entry, checks it with IsBindingValid and generates the handler graph; multicast events refused.

Evidence
Partial

list_bindings and clear_binding only; no action creates a designer property binding.

Evidence
No

No property binding tool; BindToEventProperty binds multicast events only; Bindings are read only for reference tracing.

Evidence
  • Engine/Plugins/Experimental/Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h:411 BindToEventProperty (multicast delegate)
  • Engine/Plugins/Experimental/Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.cpp:457-464 Bindings read for variable references
No

create_property_binding returns NOT_SUPPORTED and writes nothing; Bindings is not script-exposed, so no Python route.

Evidence
No

BindEvent binds multicast events only; no designer property binding (MVVM bindings are a separate row).

Evidence
Partial

ui.get_widget_bindings reads designer bindings; no create or validation.

Evidence
Widget animations as data (export and import)
Yes

export_ and import_animations_json round trip float, color, byte, vector, text, 2D transform, material tracks; event tracks export only.

Evidence
Partial

get_animation reads every track and key value; writes are per key (add_animation_key), no document import.

Evidence
No

No widget animation tools; UMGToolSet reads animations only for variable reference tracing.

Evidence
  • grep -i WidgetAnimation over Toolsets, ModelContextProtocol, ToolsetRegistry sources: only UMGToolSet.cpp (reference tracing)
  • Engine/Plugins/Experimental/Toolsets/UMGToolSet/Source/UMGToolSet/Private/UMGToolSet.h (no animation UFUNCTION)
No

get_animation_info returns name, duration and track count; per-key writes only, no export or import.

Evidence
No

ListAnimations returns name, duration, track count; AddKeyframe writes one key; no export or import.

Evidence
Partial

create_animation_v2 builds tracks and keys from a document; readback gives key counts only, dump_ui_spec a two-key envelope.

Evidence
Drive embedded web UI (WebBrowser/CEF) during play
Yes

Real input, occlusion refusal and settle on web; drive.type writes via DOM; CEF host cannot start HTML5 drags.

Evidence
Partial

No web UI op; only via execute_python (gated) calling WebBrowser.execute_javascript on a live widget; no DOM readback.

Evidence
  • grep -i 'SWebBrowser|IWebBrowserWindow|ExecuteJavascript|WebBrowserWidget|UWebBrowser|WebBrowser|CEF|BLUI' over src, plugin, docs: no hits
  • docs/tool-reference.md:1725 execute_python
  • Engine/Plugins/Runtime/WebBrowserWidget/Source/WebBrowserWidget/Public/WebBrowser.h:46-47 ExecuteJavascript (BlueprintCallable)
  • Engine/Plugins/Experimental/PythonScriptPlugin/Source/PythonScriptPlugin/Private/PyCore.cpp:871 unreal.ObjectIterator
No

Searched toolsets, MCP and registry for WebBrowser, CEF, ExecuteJavascript: none; no Python or console escape hatch.

Evidence
  • grep -i 'SWebBrowser|IWebBrowserWindow|ExecuteJavascript|WebBrowserWidget|UWebBrowser|WebBrowser|CEF|BLUI' over Engine/Plugins/Experimental/{Toolsets,ModelContextProtocol,ToolsetRegistry}: no hits
Partial

No web UI op; only via execute_python calling WebBrowser.execute_javascript; its own JS bridge drives only the Fab browser.

Evidence
Partial

No web UI op; only via execute_python_code calling WebBrowser.execute_javascript on a live widget; no DOM readback.

Evidence
  • grep -i 'SWebBrowser|IWebBrowserWindow|ExecuteJavascript|WebBrowserWidget|UWebBrowser|WebBrowser|CEF|BLUI' over Source, Content: no hits
  • Source/VibeUE/Public/Tools/PythonTools.h:46 execute_python_code
  • Engine/Plugins/Runtime/WebBrowserWidget/Source/WebBrowserWidget/Public/WebBrowser.h:46-47 ExecuteJavascript (BlueprintCallable)
  • Engine/Plugins/Experimental/PythonScriptPlugin/Source/PythonScriptPlugin/Private/PyCore.cpp:871 unreal.ObjectIterator
Partial

No web UI op; only via editor.run_python calling WebBrowser.execute_javascript on a live widget; no DOM readback.

Evidence
  • grep -i 'SWebBrowser|IWebBrowserWindow|ExecuteJavascript|WebBrowserWidget|UWebBrowser|WebBrowser|CEF|BLUI' over Source, Docs, Skills: no hits
  • Source/MonolithEditor/Private/MonolithEditorActions.cpp:824 run_python
  • Engine/Plugins/Runtime/WebBrowserWidget/Source/WebBrowserWidget/Public/WebBrowser.h:46-47 ExecuteJavascript (BlueprintCallable)
  • Engine/Plugins/Experimental/PythonScriptPlugin/Source/PythonScriptPlugin/Private/PyCore.cpp:871 unreal.ObjectIterator
Checked UI actions (occluded target refused, settle, before/after diff)
Yes

drive.* refuse occluded (TARGET_OCCLUDED) or stale (TARGET_CHANGED) targets, settle per frame without sleeps, and return a before and after diff.

Evidence
No

invoke_runtime_function broadcasts the widget delegate with no hit test, settle or diff; searched settle, appeared, ui diff, occlusion.

Evidence
  • docs/tool-reference.md:1672 invoke_runtime_function
  • grep -i 'settle|stable_?ticks|appeared|disappeared|ui_?diff|widget.?diff|occlud|LocateWindowUnderMouse|GetCursorCaptor' over src, plugin, docs: only unrelated promise and dialog hits
No

Slate Inspector Click, Hover, Type and Drag return a bool; an unresolved ref fails, but no occlusion check, settle or diff.

Evidence
  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Public/SlateInspectorToolset.h:129-165 Click, Hover, Type, Drag
  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolset.cpp:292-305 Click
Partial
No

No live UI click op; searched settle, appeared, ui diff, occlusion in Source and Content: only unrelated hits.

Evidence
  • grep -i 'settle|stable_?ticks|appeared|disappeared|ui_?diff|widget.?diff|occlud|LocateWindowUnderMouse|GetCursorCaptor' over Source, Content: only unrelated hits (UWidgetService.cpp:2809 thumbnail layout)
No

Only CommonUI focus and stack actions; searched settle, appeared, ui diff, occlusion: only stat and asset hits.

Evidence
Real OS pointer input and mouse-capture diagnosis
Partial

input_state: captor, capture, lock mode, X grabs; os_input and os_gesture: real mouse on X11, Windows untested.

Evidence
No

Only the keyboard focus path; searched mouse capture and lock mode, cursor captor and OS input APIs: none.

Evidence
No

Snapshot flags keyboard focus; clicks are Slate events after SetCursorPos; no captor or capture mode readout, no OS input.

Evidence
  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolsetSnapshotRenderer.cpp:380-382 focused flag
  • Engine/Plugins/Experimental/Toolsets/SlateInspectorToolset/Source/SlateInspectorToolset/Private/SlateInspectorToolset.cpp:115 FSlateApplication::SetCursorPos
  • grep -i 'GetMouseCaptureMode|GetMouseLockMode|HideCursorDuringCapture|GetCursorCaptor|HasMouseCapture' over Toolsets: no hits
Partial

Mouse click result names the widget holding mouse capture; no capture or lock mode readout, no OS input injection.

Evidence
No

Searched capture and lock mode, cursor captor and OS input APIs; only PostMessageW WM_CLOSE to end a standalone game.

Evidence
  • grep 'XTest|SendInput\(|mouse_event\(|keybd_event|PostMessage[AW]?\(|SetCursorPos\(|CGEventPost|xdotool|robotjs|pyautogui' over Source, Content: only Source/VibeUE/Private/PythonAPI/UPerformanceService.cpp:120 PostMessageW WM_CLOSE
  • grep -i 'GetMouseCaptureMode|GetMouseLockMode|HideCursorDuringCapture|GetCursorCaptor|HasMouseCapture' over Source: no hits
No

Only CommonUI focus actions (force_focus, get_focus_path); searched mouse capture and lock mode, captor and OS input: none.

Evidence
SoundCue and MetaSound graph authoringBuilds and edits SoundCue and MetaSound graphs.
Yes

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, presets, interface add/remove/list, compile, validate.

Yes

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.

No

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)
Yes

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.

Yes

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.

Yes

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.
Yes

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; runtime push/pop mix and class override.

Yes

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.

Partial

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
Partial

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.

Partial

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.

Yes

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.
Yes

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): create_sound_wave_from_pcm builds a USoundWave from float PCM; set_sound_wave_gain sets peak or LUFS level.

No

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.

No

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
No

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
Partial

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.

Partial

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.
Yes

Objective audio measurement (loudness, spectrum) (Yes): audio.analysis.analyze reports BS.1770 loudness, spectral descriptors, pitch, stereo; renders waveform, spectrogram, constant-Q PNGs.

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.

Partial

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.

No

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)
No

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.

No

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.

Partial

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.
Partial

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): drive.* walk every UMG root and take world (server, client:N); live widget.describe has no client selector.

Partial

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Partial

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
Yes

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.

Partial

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)
No

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
No

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
Yes

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.
Partial

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.

Yes

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.

Partial

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
No

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
No

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.

Partial

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.
Yes

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.

No

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.

No

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
No

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.

No

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.

No

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.
Yes

Play sound / ambient (Yes): play_sound_2d, play_sound_at_location, play_sound_attached, create_ambient_sound, fades, list_active_sounds.

Attenuation, spatialization, occlusion, concurrency authoring (Yes): Attenuation assets, distance, spatialization, occlusion, reverb send, and concurrency authoring ops.

Yes

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.

Partial

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
Yes

Play sound / ambient (Yes): play_sound_2d, play_sound_at_location, play_sound_attached, create_ambient_sound, fade actions.

Attenuation, spatialization, occlusion, concurrency authoring (Yes): Attenuation, spatialization, occlusion authored; concurrency only assigned from existing asset.

Partial

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.

Partial

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

22 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Idempotent operations (safe retry)
Partial

create_* verbs update an existing same class asset in place so reruns are idempotent; subset of verbs.

Evidence
Yes

Natural key plus onConflict skip|update|error convention (49 handler files); demo steps and execute_command exempt.

Evidence
Partial

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
Partial

Gateway idempotencyKey replay ledger (TS and native) keyed per capability; not per handler state checks.

Evidence
Partial

Idempotency in selected handlers (BT EnsureGraph, EnvQuery, Fab import) and bulk resume skip; no contract.

Evidence
Partial

idempotentHint MCP annotation on a few actions; skip_existing/upsert params on some; no general guarantee.

Evidence
Domain knowledge / skills
Yes

Embedded wiki (about 1,500 generated pages, 10 workflow guides) served by call(); no skill packs.

Evidence
Yes

6 SKILL.md guides installed to .claude/skills by init (Claude Code only); plugins add per-category knowledge md.

Evidence
Yes

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/
Partial

5 static knowledge topics via ue://knowledge resource plus 6 MCP workflow prompts; no skill files.

Evidence
Yes

39 markdown skill packs (90 docs) plus native UPerformanceTriageSkill, served via Epic AgentSkill.

Evidence
Yes

18 Claude skill files in Skills/ plus monolith.guide action serving MONOLITH_GUIDE.md sections.

Evidence
Custom code tasks in workflows
Partial

No workflow tasks; python.execute runs arbitrary scripts, which docs use as rebuildable build scripts.

Evidence
Yes

class_path to a project .ts/.js class extending UeMcpTask; can call other tasks and wrap built-ins.

Evidence
Partial

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

No workflow code tasks; standalone system_control execute_python action exists outside any workflow.

Evidence
Partial

Scenario python_assert and python_assert_number evaluate a Python expression as a step.

Evidence
Partial

editor.run_python runs arbitrary Python as a standalone action; no workflow tasks.

Evidence
Skill docs checked against live tools
Partial

No skills; wiki regenerates from live handler registry and a test lints overlays against served slugs.

Evidence
Yes

checkSkills flags category(action=...) refs absent from the action surface; CLI plugin check-skills.

Evidence
No

ListSkills/GetSkills/CreateSkill do no check of skill text against registered tools.

Evidence
  • ToolsetRegistry/Source/ToolsetRegistry/Private/ToolsetRegistry/AgentSkill.cpp:26
Partial

prompts/get refuses a prompt whose capability id is missing from the registry; tests assert it too; no skills.

Evidence
No

check_skills_consistency.py checks dispatcher routes vs packs on disk, not vs live API.

Evidence
No

lint_agent_tools.py checks .claude/agents tool allowlists, not skills against the live registry.

Evidence
Skill install/list/get via tools
Partial

call() lists namespaces and call(path) returns any page; nothing to install, no skill packs.

Evidence
Partial

Own skills install only via CLI init/deploy; list/get/create via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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

No skill tools; prompts are listed via MCP prompts/list and prompts/get, no install.

Evidence
Partial

List/get via Epic AgentSkillToolset ListSkills/GetSkills (via Epic toolset); no install tool.

Evidence
Partial

monolith.guide section skills_map lists skills and paths; install is manual copy to ~/.claude/skills.

Evidence
Built-in reference workflows
Partial

10 task workflow guide pages (level building, profiling, flythrough...); documentation, not executable.

Evidence
Yes

Ships niagara_fire, beacon, texture_bomb, neon_shrine and neon_shrine_cleanup flows.

Evidence
No

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
Partial

6 versioned workflow prompts (inspect-fix, asset-import, level-build...) are guidance only, not executable.

Evidence
No

No runnable workflow files shipped; skill workflows.md files are prose recipes.

Evidence
Partial

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.
Partial

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.

Yes

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.

Partial

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
No

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.

Partial

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.

Partial

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.
Partial

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.

Partial

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.

Works without a running editor
Partial

Seven proxy-local tools run with no editor (start, restart, build, build status, tests, test status, editor_list); every call() needs an editor.

Evidence
Partial

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

Evidence
No

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
Partial

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

Evidence
No

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

Evidence
Yes

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

Evidence
Network MCP transport (HTTP/SSE)
Yes

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

Evidence
No

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

Evidence
Yes

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
Yes

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

Evidence
Partial

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

Evidence
Yes

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
No

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

Evidence
No

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

Evidence
No

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
Yes

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

Evidence
No

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

Evidence
No

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

Evidence

Extensibility (plugin system)

23 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Aggregate external MCP servers as tools
No

mcp_proxy.py only bridges stdio to its own editor; no aggregation of other MCP servers.

Evidence
No

Searched for MCP client SDK imports, StdioClientTransport, mcpServers; only client config writing, no proxying.

Evidence
Yes

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
No

Searched src for MCP client SDK imports (sdk/client) and proxying. The server does not aggregate other servers.

Evidence
  • src/
Partial

Via Epic toolset: engine MCPClientToolset is the outbound MCP client; VibeUE has none of its own.

Evidence
No

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++.
Partial

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.

Yes

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Partial

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.

Partial

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.

Partial

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
No

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.

Partial

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.

Partial

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.
No

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.

Yes

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.

Yes

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
No

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.

Partial

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.

No

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.
Partial

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.

Yes

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.

Partial

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
No

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.

No

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.

Partial

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.
Partial

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.

Partial

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.

Partial

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
Partial

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.

Partial

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.

Partial

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

24 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Sequencer FBX animation import/export
Yes

sequencer.import_fbx and sequencer.export_fbx wrap the engine Level Sequence FBX importer and exporter.

Evidence
Partial

Only epic_export_fbx, epic_import_fbx and rig FBX actions; via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

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
Partial

No Sequencer FBX import/export; FBX only in asset import. Reachable via execute_python only.

Evidence
Partial

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
Partial

No Sequencer FBX import/export action (searched ExportLevelSequenceFBX, SequencerFBX). Only via run_python.

Evidence
Component bindings and actor rebinding
Yes

add_actor/add_actors take componentName for nested component bindings; sequencer.repoint_actor rebinds actors.

Evidence
Partial

Native only creates actor possessable bindings; rebind_component and replace_binding via wrapped Epic.

Evidence
Yes

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
Partial
Partial

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
Partial

level_sequence.list_bindings reads possessable/spawnable bindings; no rebind action, run_python needed.

Evidence
Camera rig rail/crane and shot tracks
Yes

add_camera_rig_rail, add_camera_rig_crane, add_camera_track (camera cut) and get_camera_cut_track.

Evidence
Partial

Native CameraCut track and section only; no rail, crane or shot track support found.

Evidence
Partial

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
Yes

configure_camera_rig_rail/crane spawn rig and set position, pitch, yaw, arm; add_shot_track exists.

Evidence
Partial

No rail/crane or shot op; Epic toolset has create_camera and generic add_track_to_sequence; else Python.

Evidence
Partial

No rail/crane rig, camera cut or shot track actions (searched CameraRigRail, ShotTrack). run_python only.

Evidence
Movie Render Queue rendering
Yes

mrq namespace creates, lists and runs MRQ jobs, authors presets; run_jobs returns a ticket and output facts.

Evidence
Partial

render_sequence_frames writes PNGs via SceneCapture2D, not Movie Render Queue; no MRQ actions found.

Evidence
No

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)
Yes
Partial

No MRQ op in VibeUE or Epic toolsets; only via execute_python_code escape hatch.

Evidence
Partial

No Movie Render Queue action (searched MoviePipeline, MovieRenderQueue). Only via editor.run_python.

Evidence
Movie Render Queue output verification (decoded frames, bitrate)
Yes

mrq.run_jobs decodes sample frames, flags blank, crushed or flat ones, fails uniform output, checks bits per pixel; create_job adds preflight.

Evidence
No

No MRQ; render_sequence_frames writes SceneCapture PNGs with timings only, no frame content or bitrate checks.

Evidence
No

No MRQ tools, so no output checks; searched MovieRender and MoviePipeline.

Evidence
  • grep -iE 'movierender|moviepipeline' over Experimental Toolsets, ModelContextProtocol, ToolsetRegistry: only a NiagaraToolsets .pdb hit
Partial

MRQ render reports output files (executor data or file deltas) and render passes; no frame decode, content or bitrate check.

Evidence
No

No MRQ op; frame checks would be agent-written analysis over execute_python_code output.

Evidence
  • grep -iE 'MoviePipeline|MovieRender' over Source, Content: no hits
No

No MRQ op; frame checks would be agent-written analysis over editor.run_python output.

Evidence
  • grep -iE 'MoviePipeline|MovieRenderQueue' over Source, Docs, Skills: no hits
Control Rig keying and baking to AnimSequenceKeys Control Rig in Sequencer, bakes spaces, and bakes performances to animation assets.
Yes

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.

Partial

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.

Yes

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
Partial

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.

Partial

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.

Partial

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.
Yes

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.

Yes

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.

Yes

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
Partial

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.

Partial

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
Partial

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

25 / 26
FeaturePinWrightue-mcpEpic UE 5.8 MCPChiR24 Unreal_mcpVibeUEMonolith
Diagnostic view modes for captures
Yes

viewMode param on capture verbs renders one capture and restores both viewport mode slots on exit.

Evidence
Partial

set_view_mode is a separate persistent call with rollback; captures take no view mode, no auto restore.

Evidence
No

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
Partial

set_view_mode is a separate global viewport op; screenshot takes no view mode and restores nothing.

Evidence
Partial

set_view_mode exists as a separate call; captures take no view mode and nothing restores it afterward.

Evidence
Partial

capture_with_overlay sets 5 show flags on a transient capture of one static mesh; nothing to restore.

Evidence
Screenshots with measured overlays
Yes

render.capture_annotated paints axes, Z=0 grid, actor AABBs with size labels; image.annotate adds world marks.

Evidence
Partial

Grid and actor label/position overlay only via wrapped Epic toolset, UE 5.8 only; native run_stat overlays.

Evidence
Yes

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
No

Screenshot returns PNG plus camera pose and size; no drawn overlays. Searched overlay, annotate, DrawLine.

Evidence
Partial

Via Epic toolset: CaptureViewport annotations overlay a world grid and actor labels; VibeUE adds none.

Evidence
No

Searched annotate, ruler, DrawText, FCanvas on images; overlays are show flags or spawned boxes only.

Evidence
Per-capture preview lighting rig with measured restore
Yes

previewScene on asset captures sets key aim, intensity, colour, sky and floor for one capture, then restores the rig and measures the restore.

Evidence
No

render_preview and capture_scene_png take no lighting input; searched AssetViewerSettings, key light, light direction.

Evidence
  • docs/tool-reference.md:797 render_preview
  • docs/tool-reference.md:1762 capture_scene_png
  • grep -i 'AssetViewerSettings|SetLightDirection|SetLightBrightness|SetSkyBrightness|key_light|keyLight|light_azimuth|sky_intensity|light_direction|DirectionalLightIntensity' over src, plugin, docs: no hits
No

CaptureAssetImage renders a default thumbnail with no lighting parameter; searched AssetViewerSettings and light params.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.h:216 CaptureAssetImage
  • grep -i 'AssetViewerSettings|SetLightDirection|SetLightBrightness|SetSkyBrightness|key_light|keyLight|light_azimuth|sky_intensity|light_direction|DirectionalLightIntensity' over Toolsets: no hits
No

generate_thumbnail has no lighting input; lighting actions light the level, not a capture.

Evidence
  • docs/action-reference.generated.md:82 generate_thumbnail
  • grep -i 'AssetViewerSettings|SetLightDirection|SetLightBrightness|SetSkyBrightness|key_light|keyLight|light_azimuth|sky_intensity|light_direction|DirectionalLightIntensity' over src, plugins: only level create_light examples (KeyLight test fixture)
No

CaptureScene takes pose, size and exposure only; searched AssetViewerSettings and light params.

Evidence
  • Source/VibeUE/Public/PythonAPI/UViewportService.h:431 CaptureScene
  • grep -i 'AssetViewerSettings|SetLightDirection|SetLightBrightness|SetSkyBrightness|key_light|keyLight|light_azimuth|sky_intensity|light_direction|DirectionalLightIntensity' over Source, Content: no hits
No

capture_scene_preview takes camera, seek time and size, no lighting; searched AssetViewerSettings and light params.

Evidence
Capture readiness and contamination report
Yes

Captures refuse CAPTURE_NOT_READY and MATERIAL_FALLBACK, warm up until frames settle, and report engine warning text burned into the frame.

Evidence
Partial

capture_scene_png force-streams textures (fullyLoadTextures) before capture; compile state and contamination are not reported.

Evidence
Partial

CaptureAssetImage waits for compile and streaming (10 s timeout); CaptureViewport hides gizmos and selection; nothing is reported.

Evidence
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:118-146 compile and streaming poll
  • Engine/Plugins/Experimental/Toolsets/EditorToolset/Source/EditorToolset/Private/EditorAppToolset.cpp:1110-1126 ModeWidgets, Selection hidden
No

Screenshot only flushes rendering commands; searched shader compile, fallback material and on-screen message checks on capture paths.

Evidence
No

CaptureScene only flushes rendering commands; searched shader compile, fallback material and on-screen message checks.

Evidence
Partial

Niagara and widget captures finish shader compilation first; nothing is reported and no fallback material or warning text check.

Evidence
Texture pixel statistics per region or tile
Yes

texture.get_pixel_stats: per-channel mean/min/max, grayscale flag and content hash for any mip, sub-rectangle or tile grid.

Evidence
No

No pixel read; compare_textures checks size, format and source id equality only.

Evidence
No

Texture toolset has only import_file and get_size.

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

Texture info returns size, format, mips and compression; source pixels are read only by pixel-editing ops.

Evidence
No

Searched texture source mip reads and channel stats; only viewport and render-target ReadPixels for captures.

Evidence
  • grep -E 'LockMip|GetMipData|histogram|channel.?stat' over Source: no hits
Partial

editor.inspect_texture_channels: per-channel min/max/mean over whole source mip 0, BGRA8 only; no region or tile.

Evidence
Asset captures (isolated, multi-angle)Captures an asset without placing it in a level, from one or several fixed angles.
Yes

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.

Partial

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.

Partial

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
Partial

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.

Partial

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.

Partial

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.
Yes

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 (Persona) and camera.animation_shots (Level Sequence in the level) return numeric pose-change proof per frame.

Partial

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): render_sequence_frames and capture_screenshot give frames, sample_pose/analyze_animation give numbers; no pose diff between frames.

Partial

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
No

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.

Partial

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.

Partial

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.
Yes

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.

No

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
Partial

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
No

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
No

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
Partial

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

26 / 26

These are tasks your coding assistant 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.

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.
Yes

Headless build command (Yes): Proxy tool editor_build builds the project's editor target through UnrealBuildTool with the editor closed, detached and capped; editor_build_status reports the result. No standalone CLI.

Headless UBT build (Yes): editor_build runs UnrealBuildTool for the editor target out of process and refuses while an editor of this checkout is running; editor_build_status polls it.

Yes

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.

No

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
Yes

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.

Partial

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.

No

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.
Partial

editor_build_status returns UBT's Result line and every compiler, linker and UBT error line; live coding returns its log tail; editor.standalone_status tails a game process log; no editor log read or search op.

Evidence
Yes

build_project returns compiler output; get_log, search_log over 4096 line ring, get_message_log.

Evidence
Yes

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
Yes
Partial

GetEnvironment reports last build status; Analyse scans trace; log search via Epic toolset LogsToolset.

Evidence
Yes

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.
No

Searched GenerateProjectFiles and ProjectFiles; no op. editor_build builds the editor target only.

Evidence
Yes

project.generate_project_files launches GenerateProjectFiles script or UBT; needs live editor.

Evidence
No

Searched GenerateProjectFiles, UnrealBuildTool; no project file generation tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets (grep GenerateProjectFiles: no hits)
No

Searched GenerateProjectFiles, generate_project_files, projectfiles; no op.

Evidence
  • rg GenerateProjectFiles|projectfiles|generate_project over src and plugins: README mention only
No

Searched GenerateProjectFiles in Source, scripts and docs; no matches.

Evidence
  • grep GenerateProjectFiles returned no matches
No

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.
Partial

No header lint or source symbol check; reflection lookups only confirm live UCLASS/UFUNCTION symbols.

Evidence
Yes

verify_symbols, lint_cpp_header, suggest_build_deps against a regex engine symbol index.

Evidence
No

Searched symbol, header, lint, include; no C++ symbol verification or header lint tool.

Evidence
  • Engine/Plugins/Experimental/Toolsets (no matching AICallable or tool_call)
No

Searched symbol verify, header lint, header; no C++ source analysis ops.

Evidence
  • rg header|lint in capability records: no C++ lint op
No

Searched for symbol verification, header lint, include checks; none found.

Evidence
  • grep over Source for header lint/symbol verify returned nothing
Yes

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.
Partial

launch_standalone starts 1 to 8 -game processes; standalone_status: exit code, log tail; trace via extraArgs.

Evidence
Yes

launch_standalone with -trace/-tracefile, get_standalone_status, stop_standalone.

Evidence
No

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
Partial
Yes

StartStandalone launches separate game process with Insights trace; Stop and status verify PID and file.

Evidence
No

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.
No

Searched SetEnabled, enable_plugin, uplugin; only game_features.list reads plugin state.

Evidence
Yes

enable_plugin, disable_plugin edit .uproject; list_available_plugins.

Evidence
Yes

PluginToolset SetPluginEnabled, IsEnabled, ListEnabledPlugins, ListDiscoveredPlugins.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:293 SetPluginEnabled, :170 ListEnabledPlugins
Yes
Partial

VibeUE only lists enabled plugins in GetEnvironment; toggle via Epic toolset PluginToolset.

Evidence
No

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).
No

Searched plugin creation and .uplugin edit ops; none found.

Evidence
  • wiki page index
Partial

epic_create_plugin, epic_update_plugin_descriptor via wrapped Epic toolset, UE 5.8 only.

Evidence
Yes

CreatePlugin from templates, GetPluginDescriptor, UpdatePluginDescriptor, Add/RemovePluginDependency.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PluginToolset/Source/PluginToolset/Private/PluginToolset.h:271 CreatePlugin, :313 UpdatePluginDescriptor, :325 AddPluginDependency
No

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
Partial

No VibeUE plugin authoring; via Epic toolset PluginToolset CreatePlugin, UpdatePluginDescriptor.

Evidence
  • Engine/Plugins/Experimental/Toolsets/PluginToolset
No

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.
No

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)
Yes

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.

No

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)
Partial

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.

Partial

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
Partial

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.
No

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
Partial

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).

No

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)
No

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
No

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
Yes

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.
Partial

Saved/Crashes is scanned only inside test run verdicts; no RPC lists crash reports.

Evidence
Yes

editor list_crashes, get_crash_info, check_for_crashes backed by C++ handlers.

Evidence
No

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
Partial

read_log source=previous reads earlier run logs; previous-session snapshot; no Saved/Crashes listing.

Evidence
No

Searched CrashReportClient, Saved/Crashes, crash report in Source, Python, skills; only launch script kill.

Evidence
Partial

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.
Partial

Read INI (Partial): No generic INI key read; rendering and physics get_project_settings only; else property.get or python.

Write INI (Partial): Scoped writers: Renderer and Physics settings to DefaultEngine.ini, gameplay tags to their ini; else python.

Yes

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.

Partial

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
Yes

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.

Yes

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.

Partial

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.
Yes

localization.gather and localization.compile run GatherText configs as tracked commandlet jobs.

Evidence
No

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
No

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
No

Searched GatherText, localiz, culture: only widget set_localization_key and bind_localized_text.

Evidence
No

Searched Localiz, GatherText, LocalizationCommandlet; only an FText type label.

Evidence
No

Localization namespace has 4 read-only actions; searched GatherText, Commandlet; no gather or compile.

Evidence

Audited versions

PinWright
master ae877ccc (2026-10-03); rows audited at 71c91649, re-checked 2026-09-29 at 93d342bc, 2026-09-30 at adb239fd, 2026-10-03 at 7230b41d and ae877ccc
ue-mcp
db-lyon/ue-mcp e6a706f (2026-09-26)
Epic UE 5.8 MCP
UE 5.8.2 engine plugins (changelist 56702186)
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.