How PinWright compares
At a glance
224 of 341 features fully supported, the most of any tool compared
- PinWright : 224 Yes, 87 Partial, 30 No, of 341 graded features
- ue-mcp : 177 Yes, 115 Partial, 49 No, of 341 graded features
- Monolith : 110 Yes, 151 Partial, 79 No, of 340 graded features
- ChiR24 Unreal_mcp : 100 Yes, 132 Partial, 109 No, of 341 graded features
- Epic UE 5.8 MCP : 73 Yes, 124 Partial, 142 No, of 339 graded features
- 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
| Product | Yes | Partial | No |
|---|---|---|---|
| PinWright | 224 | 87 | 30 |
| ue-mcp | 177 | 115 | 49 |
| Epic UE 5.8 MCP | 73 | 124 | 142 |
| ChiR24 Unreal_mcp | 100 | 132 | 109 |
| VibeUE | 59 | 188 | 94 |
| Monolith | 110 | 151 | 79 |
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
On a narrow screen, untick products to compare two side by side.
CLI and setup
2 / 26| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Generates agent instruction files | PartialSeeds CLAUDE.md and AGENTS.md only in the asset dump root; server instructions sent via MCP, no project files. Evidence
|
Partialinit copies shipped SKILL.md files into .claude/skills (Claude Code only); no CLAUDE.md or AGENTS.md writer. Evidence
|
NoWrites only MCP server config files; searched CLAUDE.md, AGENTS.md, GEMINI.md, cursorrules, copilot writers. Evidence
|
NoNo instruction file writer; NativeMCPInstructions setting is sent only in the MCP initialize response. Evidence
|
YesVibeUE.GenerateAgentConfig writes CLAUDE.md, GEMINI.md, AGENTS.md or copilot file as a managed block. Evidence
|
NoREADME 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. | PartialDoctor 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.
|
YesDoctor 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).
|
NoDoctor diagnostics command (No): No doctor command; console cmds are only RefreshTools, StartServer, StopServer, GenerateClientConfig.
Install feasibility check (No): No install feasibility or prerequisite check; searched doctor, diagnos, health, setup, install in MCP and Toolsets.
|
PartialDoctor 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.
|
PartialDoctor 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.
|
PartialDoctor 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. | YesInteractive 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.
|
YesInteractive 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.
|
PartialInteractive setup wizard (No): No setup wizard; searched MCP, ToolsetRegistry, Toolsets for menus, tabs, Slate UI, setup commandlets.
In-editor setup screen with config drift check (Partial): Project Settings page has port, URL path, autostart, tool search; no client config drift check.
|
PartialInteractive 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. |
NoInteractive 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. |
NoInteractive 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Function CRUD | Yesadd_function (incl. overrides), remove_function, set_function_settings, decompile_function. Evidence |
Yescreate_function, delete_function, rename_function, list_functions, set_function_properties, param CRUD. Evidence
|
Yesadd_function_graph, remove_function_graph, add/remove function params, list_functions. Evidence
|
Partialadd_function with inputs/outputs and remove_function exist; no function rename or signature edit found. Evidence
|
PartialCreate, read, params and locals in VibeUE; no function delete, remove_function_graph via Epic toolset. Evidence
|
Yesadd/remove/rename_function, set_function_params, override_parent_function, get_functions. Evidence
|
| Node CRUD + connect | Yescreate_node, delete_node, set_node_property, connect_pins, break_pin_links, reroute nodes. Evidence |
Yesadd_node, delete_node, set_node_property, refresh_node, connect_pins, disconnect_pins. Evidence
|
Yescreate_node, delete_node, connect_pins, break_pins, set_pin_value, add/remove dynamic pins. Evidence
|
Yescreate_node, delete_node, break_pin_links, connect_pins, set_node_property, set_pin_default_value. Evidence
|
Yescreate_node_by_key, delete_node, connect_nodes, disconnect_pin, set_node_pin_value, configure_node. Evidence |
Yesadd_node, remove_node, connect_pins, disconnect_pins, set_pin_default, set_node_position. Evidence |
| Batch connect (single compile) | Yesblueprint.graph.connect_pins_batch wires many pin pairs in one call and one undo transaction; compile=true compiles once after all links. Evidence
|
Yesconnect_pins_batch applies many connections then compiles and saves once. Evidence
|
Yesconnect_pins does not compile; write_graph_dsl wires a whole graph then compiles once; execute_tool_script batches calls. Evidence
|
Yesbuild_graph runs up to N create/connect/default steps then compiles and saves once. Evidence
|
Yesbuild_graph creates nodes, wires connections, sets defaults in one transaction with optional compile. Evidence |
Yesconnect_pins_bulk wires many links in one transaction; batch_execute has compile_on_complete. Evidence
|
| Auto-layout graph | PartialBPIR 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
|
Yesauto_layout topological layered layout, returns previous positions for undo. Evidence
|
Yesarrange_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
|
Partialbuild_graph places unpositioned nodes on a column grid with overlap checks; no whole graph layout op. Evidence |
Yesauto_layout_graph, auto_layout_selected_nodes, analyze_graph_layout quality report. Evidence
|
Yesauto_layout: built-in Sugiyama layout, all/new_only/selected modes, optional Blueprint Assist. Evidence |
| Bulk graph rewrite (T3D/JSON) | Yescompile_bpir upserts whole entry graphs from BPIR text; format is BPIR, not T3D or JSON. Evidence |
Yesexport_nodes_t3d and import_nodes_t3d (Ctrl+C/Ctrl+V T3D round trip); also export_batch. Evidence
|
Yeswrite_graph_dsl rewrites event and function bodies from S-expression text and deletes stale nodes; no T3D or JSON. Evidence
|
Partialbuild_graph takes a JSON list of additive edits; no T3D import or whole graph replace found. Evidence
|
Partialbuild_graph adds from JSON style descriptors, no clear or replace of existing graph, no T3D. Evidence
|
Yesbuild_blueprint_from_spec builds a graph from JSON; export_graph emits it; copy_nodes uses T3D. Evidence
|
| Set class default (CDO) property | Yesblueprint.set_default writes CDO property via reflection and compiles. Evidence |
Yesset_class_default on Blueprint CDO; set_cdo_property for any C++ class CDO. Evidence
|
YesObjectTools.set_properties on a Blueprint targets its CDO via JSON values; reset_properties also exists. Evidence
|
Yesset_default writes any CDO property incl. nested paths; inspect_cdo reads CDO. Evidence
|
Yesset_property writes a CDO property by native name from a string value. Evidence
|
Yesset_cdo_property and set_cdo_properties write Blueprint CDO values via ImportText. Evidence
|
| Compile / batch compile | Yesblueprint.compile_batch compiles an asset list or folder in one job, one row per Blueprint with errors. Evidence
|
Yescompile reports errors and messages; compile_all batch compiles and saves with per path status. Evidence
|
Yescompile_blueprint with warnings_as_errors returns node error messages; batch only by looping in execute_tool_script. Evidence
|
Partialcompile handles one Blueprint with diagnostics and optional save; no multi Blueprint batch compile. Evidence
|
Partialcompile_blueprint returns errors per asset; no multi asset batch compile operation. Evidence |
Partialcompile_blueprint compiles one asset; no multi-asset compile, only editor.list_errored_blueprints scan. Evidence
|
| Validate without saving | Yesblueprint.compile is in-memory only and returns errors and warnings; saving is a separate asset.save. Evidence |
Yesvalidate compiles with SkipSave and returns diagnostics. Evidence
|
Partialcompile_blueprint reports errors without saving but mutates the in memory asset; no dry run validator. Evidence
|
Yescompile defaults to saveAfterCompile false: compiles in memory, returns diagnostics, does not save. Evidence |
Yescompile_blueprint compiles in memory and returns error text without saving the asset. Evidence
|
Yesvalidate_blueprint reports unused vars, disconnected nodes, stored compiler messages; no save. Evidence
|
| Interfaces / dispatchers / macros | Yesadd_interface, remove_interface, add_dispatcher, add_macro, decompile_macro. Evidence |
Yescreate/add/remove/list interface, add/list/remove event dispatcher, create/delete macro. Evidence
|
PartialDispatchers add/list; engine standard macro nodes placeable; no add interface or macro graph tools. Evidence
|
PartialStandard macro nodes, bound events, fixed interactable interface only; no interface add or dispatcher op. Evidence
|
Yesadd/remove_interface, add_event_dispatcher with params, create_macro_graph, add_macro_instance_node. Evidence
|
Yesimplement_interface, add_event_dispatcher, add_macro plus remove/rename and detail queries. Evidence
|
| Construction script preview | Yesblueprint.preview_construction runs construction scripts on a transient instance; reports components, bounds. Evidence
|
Yesrun_construction_script spawns temp actor and returns generated components and transforms. Evidence
|
NoSearched toolsets for construction script run or preview; only Niagara C++ gets the UCS graph for editing. Evidence
|
Noadd_construction_script only ensures the graph exists; searched RerunConstructionScripts, preview: none. Evidence |
Partialrefresh_blueprint_editor reruns construction script in open editor viewport; no preview result returned. Evidence
|
Partialget_construction_script only lists CS nodes; running it needs spawn_blueprint_actor into a level. Evidence
|
| Auto-rollback when an edit breaks compile | Yescompile_bpir and insert_bpir roll back when the compile fails; allowPreexistingErrors keeps edits on an already-broken BP; undo_last_bpir. Evidence
|
PartialWraps Epic write_graph_dsl, which rolls back on transpile error (UE 5.8 only); own flow rollback ignores compile errors. Evidence
|
Partialwrite_graph_dsl rolls back new nodes on transpile error; no rollback when the following compile fails. Evidence
|
Nobuild_graph prechecks steps but keeps applied steps on failure and only warns if compile fails. Evidence |
PartialBulk maintenance undoes the transaction when compile or save fails; interface and metadata ops only. Evidence
|
NoSearched rollback/Undo/BS_Error in MonolithBlueprint; compile errors are reported, edits not reverted. Evidence |
| Reparent Blueprint to new parent class | Yesblueprint.reparent changes parent UClass and recompiles. Evidence |
Yesreparent changes ParentClass, recompiles and saves, checks writability first. Evidence
|
Yesset_parent calls BlueprintEditorLibrary.reparent_blueprint. Evidence
|
Partialset_parent_class works on Widget Blueprints only; other Blueprints only via execute_python. Evidence
|
PartialNo reparent in VibeUE (only get_parent_class); set_parent via Epic toolset. Evidence
|
Yesreparent_blueprint changes a Blueprint's parent class. Evidence
|
| Dead Blueprint code detection and cleanup | Yesfind_orphaned_nodes, delete_orphaned_nodes and delete_unused_variables with dryRun. Evidence |
Partialaudit_dead_code detects but is report only; cleanup_graph removes only broken nodes, not dead code. Evidence
|
Partialwrite_graph_dsl deletes nodes unreachable from exec roots as a side effect; no detection tool. Evidence
|
PartialNo dedicated op; only via consent gated execute_python calling engine BlueprintEditorLibrary. Evidence
|
PartialNo dead node detection; unused variable sweep only via engine BlueprintEditorLibrary in Python. Evidence
|
Partialvalidate_blueprint detects unused variables and disconnected nodes; no cleanup or removal action. Evidence
|
| Callable-API index and node pin preview | Yesbuild_api_index and search_api over reflection; get_node_type_pins previews pins of a node type. Evidence |
Partialsearch_node_types indexes callables without pins; pin preview via Epic tool (UE 5.8) or reflect_class. Evidence
|
Yesfind_node_types and find_node_categories index spawnable actions; get_node_type_pins previews pins. Evidence
|
Partiallist_node_types lists K2Node classes by name only; no function index or pin preview. Evidence |
Partialdiscover_nodes indexes spawnable nodes without pins; get_node_type_pins preview via Epic toolset. Evidence
|
Yessearch_functions indexes BP-callable functions; resolve_node dry-runs a node and returns its pins. Evidence |
| Timeline authoring (tracks and keys) | YesBPIR 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 |
Yesadd_timeline_track creates timeline, curve and keys; add only, no track edit or removal action. Evidence
|
NoSearched toolsets for timeline; no track or key authoring tools. Evidence
|
NoOnly a Timeline to K2Node_Timeline alias; searched TimelineTemplate, AddNewTimeline: no track or key ops. Evidence |
Yesadd_timeline, float/vector/color/event tracks and keys, rename, remove, clear keys. Evidence
|
Yesadd_timeline, add_timeline_track, set_timeline_keys, get_timeline_data. Evidence
|
| Blueprint override drift vs native defaults | Partialinspect includeProperties lists CDO values differing from immediate parent CDO; no dedicated drift report. Evidence
|
NoSearched drift, Identical, overridden, nonDefault in BP handlers; only variable vs authored default check. Evidence
|
NoSearched for override diff; only reset_properties to parent defaults, no drift report. Evidence
|
NoSearched override drift, CDO diff vs parent defaults; nothing found beyond plain inspect_cdo reads. Evidence
|
NoSearched drift and non-default vs parent CDO; diff_blueprints and compare_components compare two assets. Evidence
|
Yesblueprint.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. | YesRead 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. |
YesRead 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.
|
YesRead blueprint structure (Yes): BlueprintTools list_graphs, list_functions, list_events, list_variables, list_event_dispatchers, get_parent.
Full graph (nodes, pins, connections) (Yes): get_node_infos returns nodes with pins, types, values and connected pins; find_nodes and get_connected_subgraph.
|
YesRead 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.
|
YesRead 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.
|
YesRead 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. | YesVariable 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. |
YesVariable 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.
|
YesVariable CRUD (Yes): add_variable, add_struct_variable, add_object_variable, list_variables, remove_variable, category and replication setters.
Component CRUD (Yes): ActorTools add_component, remove_component, get_components, set_parent_component work on Blueprints via SDS.
|
YesVariable 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.
|
YesVariable 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.
|
YesVariable 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. | YesProject-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. |
YesProject-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.
|
PartialProject-wide call-site search (Partial): Only asset level get_referencers and semantic asset search; no function call site search across Blueprints.
Execution flow trace (Partial): read_graph_dsl renders exec flow as structured code; get_connected_subgraph walks links; no trace tool.
|
NoProject-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.
|
PartialProject-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.
|
PartialProject-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. | YesBlueprint 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. |
PartialBlueprint 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.
|
PartialBlueprint logic authored as text code (Yes): write_graph_dsl transpiles S-expression code (event, fn, if, for, while, switch) into nodes.
Decompile Blueprint graphs to editable text (Yes): read_graph_dsl decompiles a graph to DSL text that write_graph_dsl accepts back.
Inline text-expression Blueprint node (No): Searched for MathExpression; DSL arithmetic expands to separate operator nodes, not one expression node.
|
NoBlueprint 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.
|
PartialBlueprint 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.
|
PartialBlueprint 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.
|
| Targeted graph edits (splice, swap node)Inserts logic at a chosen node or replaces a node while keeping its links. | YesSplice 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. |
PartialSplice 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.
|
PartialSplice new logic at a chosen node (Partial): DSL writes whole event or function bodies; splicing mid chain needs manual break_pins and 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.
|
NoSplice new logic at a chosen node (No): Searched splice, insert_node, insert_between, insertAfter in Blueprint handlers; none found.
Swap node type preserving connections (No): Searched ReplaceNode, swap_node, replace_node, MovePinLinks; none found.
|
PartialSplice 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.
|
NoSplice new logic at a chosen node (No): Searched splice, insert_after, insert_before in MonolithBlueprint; only ABP pose-chain splicing exists.
Swap node type preserving connections (No): Searched replace_node, swap_node and node retype actions across Source; none found.
|
Materials
4 / 26| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Build graph from JSON | Yescompile_mgir builds full wired graphs from MGIR text (not JSON); create_nodes takes a JSON node array, no wires. Evidence |
Partialbuild_graph spawns nodes and output-property links only; no node-to-node edges, values only for Constant/ScalarParam. Evidence
|
PartialNo JSON graph builder; sandboxed execute_tool_script can chain add/connect tool calls in one script. Evidence
|
Yesbuild_material_graph runs up to 200 additive node, wire and property steps from one JSON call. Evidence |
PartialNo single JSON import; recreation is a documented multi step flow over batch create/connect calls. Evidence
|
Yesbuild_material_graph takes a JSON graph_spec; import_material_graph overwrite or merge. Evidence
|
| Custom HLSL node | Yesmaterial.authoring.add_custom_expression adds a Custom HLSL node; HLSL errors reported in shaderCompile. Evidence |
Yesset_custom_expression reads/writes code, named inputs, outputType on Custom nodes, also inside functions. Evidence
|
PartialNo HLSL tool; add_expression with MaterialExpressionCustom then object set_properties for Code. Evidence
|
Yesadd_custom_expression and update_custom_expression for Custom HLSL nodes. Evidence
|
YesDedicated Custom HLSL expression creation with code, output type and inputs. Evidence
|
Yescreate_custom_hlsl_node and update_custom_hlsl_node with inputs, outputs, includes, defines. Evidence
|
| Recompile dependent materials | Yescompile_material and compile_mgir recompile, recache dependent instances and rebuild landscape component MICs (consumerRefresh). Evidence
|
Yesrecompile with recompileChildren walks MaterialInstanceConstants whose parent chain reaches it. Evidence |
Yesrecompile on a MaterialFunction also recompiles referencing Materials; get_referencing_materials. Evidence
|
Partialcompile_material recompiles one material or function via PostEditChange; no dependent cascade found. Evidence
|
PartialCompileMaterial calls ForceRecompileForRendering on one material; no explicit instance or dependent cascade. Evidence
|
Yesupdate_material_function recompiles and cascades to users; also recompile_material, batch_recompile. Evidence
|
| Render preview PNG | Yesasset.generate_thumbnail renders a material to PNG on sphere, cube, plane, shaderBall or mesh with camera angles. Evidence |
Yesrender_preview writes lit thumbnail PNG; falls back to flat base color swatch if renderer unavailable. Evidence |
YesCaptureAssetImage renders an asset thumbnail (materials included) as an image; no preview options. Evidence
|
Yesgenerate_thumbnail renders any asset thumbnail (incl. materials) and writes a PNG to outputPath. Evidence |
PartialNo material preview render; own capture_image grabs an editor window, editor open/capture via Epic toolset. Evidence
|
Yesrender_preview writes PNG on plane, sphere or cube; get_thumbnail also returns PNG. Evidence |
| Material function authoring | Yescreate_material_function, add_function_input/output, use_material_function; MGIR decompiles functions. Evidence |
Yescreate_function, add/connect/list_function_expressions; set_expression_value and delete accept functionPath. Evidence |
Yescreate_function plus all graph tools accept MaterialFunction; FunctionInput/Output allowed. Evidence
|
Yescreate_material_function, add_function_input/output, use_material_function, get_material_function_info. Evidence
|
YesCreate function, add inputs/outputs, add, connect and set function expressions, export graph. Evidence
|
Yescreate_material_function, build_function_graph, export, metadata, function instances. Evidence
|
| Shader stats / graph validation | Yesget_material_stats measures instruction counts and samplers; material.audit checks graphs; compile errors. Evidence
|
Partialvalidate finds orphans, null textures, UV mismatch; shader stats only count samplers and params, no instructions. Evidence
|
Partialrecompile raises with compile error list; no shader stats or instruction counts found. Evidence
|
Partialget_material_stats counts nodes and params but instructionCount is hardcoded -1; compile returns errors. Evidence
|
PartialDiagnostics give compile errors, textures and node counts; instruction stats only via Python MEL.get_statistics. Evidence
|
Yesget_compilation_stats (instructions, samplers) and validate_material with optional fix_issues. Evidence
|
| Material graph decompile to editable text | Yesmaterial.decompile_mgir exports material or function graph and properties to MGIR text; compile_mgir round trips. Evidence |
Partialexport_graph JSON is lossy: no node-to-node wiring, 4 value types, 8 outputs; import only re-adds nodes. Evidence
|
NoOnly object-level get_expressions/get_expression_inputs; searched for text IR or decompile tool, none. Evidence
|
Noget_material_info returns read only JSON node list; no text form that replays into build_material_graph. Evidence
|
PartialExports full graph JSON for materials and functions; no import, text is rebuilt by manual batch calls. Evidence
|
Partialexport_material_graph gives JSON that import_material_graph reads back; no readable text DSL. Evidence
|
| Material layer and layer-blend stacks | Yescreate_material_layer, create_material_layer_blend, set_material_layer_stack fills Layers/Blends arrays. Evidence |
PartialNo UE Material Layers support; only Material Designer layer stacks, needs Material Designer plugin. Evidence
|
NoSearched Toolsets and MCP for MaterialLayer, layer blend, MaterialAttributeLayers; no tools. Evidence
|
NoSearched MaterialLayer, MaterialLayersFunctions, layer_stack; configure_layer_blend is landscape only. Evidence |
NoSearched MaterialFunctionMaterialLayer, MaterialAttributeLayers, layer stack; only landscape LayerBlend nodes exist. Evidence
|
PartialCreates MaterialLayer and LayerBlend functions, get_layer_info; no op to assign layer stacks. Evidence
|
| Material Parameter Collection authoring | Yescreate_parameter_collection, add collection scalar/vector params, set defaults, remove, info, graph node. Evidence |
Partialread_mpc native; create only via generic create_asset_by_class or Epic toolset; params need raw set_property. Evidence
|
Partialcreate_parameter_collection makes an empty MPC; adding params only via object set_properties. Evidence
|
NoSearched MaterialParameterCollection and parameter_collection in C++ and TS; only Niagara collection include. Evidence
|
PartialOnly adds CollectionParameter nodes referencing an existing MPC; no MPC asset create or edit. Evidence
|
PartialOnly generic create_data_asset with class MaterialParameterCollection; no MPC parameter ops. Evidence
|
| Procedural texture generation and processing | Yestexture namespace: noise, gradient, pattern, normal from height, blur, levels, curves, channel pack. Evidence |
NoOnly import, export, compare, settings, render target create; searched noise, create_texture, channel pack, bake. Evidence
|
NoTexture toolset has only import_file and get_size; searched texture/render target tools, none else. Evidence
|
Yescreate_noise/gradient/pattern textures, normal from height, AO, blur, levels, channel pack, resize. Evidence |
NoSearched NewObject<UTexture2D>, Source.Init, texture generation; only file import and RVT asset creation found. Evidence
|
PartialNo texture generation op; only import/preview/tiling checks; generation only via editor.run_python. Evidence |
| Landscape auto-material (height/slope blend) | PartialNo auto material op; slope/height blend only by hand from generic graph nodes. LB_HeightBlend is painted, not auto. Evidence
|
NoNo auto-material builder; searched LandscapeLayerBlend, auto material, slope blend; only set_material and weight writes. Evidence
|
NoSearched all Toolsets and MCP source for landscape; only a PCG node name, no landscape material tools. Evidence
|
Partialcreate_landscape_material, add_landscape_layer, LandscapeLayerBlend node; no height or slope auto blend. Evidence
|
PartialCreateAutoMaterial 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
|
NoSearched Landscape, LayerBlend, slope, auto_material; none; only manual build_material_graph. Evidence
|
| Material instance base-property overrides (blend mode, shading model, two-sided) | Yesset_material_instance_base_property_overrides sets or clears each override, rebuilds the static permutation, returns effective values. Evidence
|
PartialNo override op; only via generic asset set_property on the BasePropertyOverrides struct, then PostEditChange. Evidence
|
PartialNo override tool; only via generic object set_properties writing the BasePropertyOverrides struct. Evidence
|
PartialNo override op; only via generic set_object_property on a nested BasePropertyOverrides path, then PostEditChange. Evidence
|
PartialNo override op; MaterialService set_property can ImportText the BasePropertyOverrides struct on an instance, then PostEditChange. Evidence
|
PartialNo 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 | Yesget_material_info measures atlas compatibility off the shader map; set_light_function_atlas_compatible overrides and reads back. Evidence
|
PartialNo atlas check; override flag only via generic asset set_property on bForceCompatibleWithLightFunctionAtlas. Evidence
|
PartialNo atlas check; override flag only via generic object set_properties on bForceCompatibleWithLightFunctionAtlas. Evidence
|
PartialNo atlas check; override flag only via generic set_object_property on bForceCompatibleWithLightFunctionAtlas. Evidence
|
PartialNo atlas check; override flag only via generic MaterialService set_property on bForceCompatibleWithLightFunctionAtlas. Evidence
|
PartialNo 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 | Yestexture.create_text_texture rasterises a font into a Texture2D; create_from_pixels takes base64 RGBA8/Gray8. Evidence
|
PartialNo text or pixel texture op; import_texture reads a disk file; only via gated execute_python. Evidence
|
NoTexture toolset has only import_file from a disk image and get_size; no text or pixel data tool. Evidence
|
PartialProcedural noise, gradient and pattern only, no text or caller pixels; only via execute_python. Evidence
|
PartialImportTexture reads a disk file; 5x7 text is internal to blockout images; only via execute_python_code. Evidence
|
Partialui.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. | YesExpression 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. |
YesExpression 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.
|
YesExpression graph CRUD (Yes): add_expression, delete_expression, get_expressions, list_expression_classes, layout, delete_unused.
Connect expressions (Yes): connect_expressions, disconnect_expressions, connect_to_output, disconnect_from_output.
|
YesExpression 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).
|
PartialExpression 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.
|
YesExpression 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. | YesCreate 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. |
YesCreate 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.
|
YesCreate material / instance (Yes): MaterialTools.create_material and MaterialInstanceTools.create tools.
Instance parameter set (Yes): Get/set scalar, vector, texture, static switch params plus set_parameter_override, clear_parameters.
|
YesCreate 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.
|
PartialCreate 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.
|
YesCreate 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Anim Blueprint CRUD | Yescreate_animation_bp, authoring.create_anim_blueprint, graph node ops, AGIR compile/decompile. Evidence |
Yescreate_anim_blueprint, read_anim_blueprint, read_anim_graph, set_anim_blueprint_skeleton, node actions. Evidence
|
PartialOnly generic Blueprint tools; create uses BlueprintFactory, not an AnimBlueprint factory; no AnimGraph ops. Evidence
|
Yescreate_anim_blueprint, add_blend_node, add_cached_pose, set_anim_graph_node_value; get_animation_info reads it. Evidence
|
PartialAnimGraphService reads and edits AnimBP graphs; creation is only a Python AnimBlueprintFactory recipe in a skill. Evidence
|
Yescreate_anim_blueprint, get_abp_info, add_anim_graph_node, remove_node_slice, duplicate_reparent_and_sanitize. Evidence
|
| State machine CRUD | Yesadd_state_machine, add_state, add_state_alias, add_transition, set_transition_rules, set_state_machine_entry. Evidence |
Yescreate_state_machine, add/remove_state, add/remove_transition, set_transition_condition, read_state_machine. Evidence
|
NoNo state machine, state or transition tools; searched StateMachine, state_machine, AnimGraph. Evidence
|
Yesadd_state_machine, add_state, add_transition, set_transition_rules, delete_transition. Evidence
|
YesAdd state machine, states, conduits and transitions, remove them, set rules, entry state and priority, validate. Evidence
|
Yescreate_state_machine, build_state_machine, add_state_to_machine, add_transition, remove_anim_state/transition. Evidence
|
| Curves CRUD | Yesset_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 |
Yesadd_curve, remove_curve, set_anim_curve_keys, edit_curve_metadata on skeleton. Evidence
|
NoNo animation curve tools; only curve_table.py for CurveTable assets; searched FloatCurve, add_curve. Evidence
|
Partialset_curve_key writes keys and info lists curve names; no curve delete or key read found. Evidence
|
YesList, add, remove curves, set and add curve keys, read values; skeleton curve metadata CRUD too. Evidence
|
Yesadd_curve, remove_curve, set_curve_keys, get_curve_keys, list_curves, get_skeleton_curves. Evidence |
| Montage CRUD | Yescreate_montage plus section, slot, notify, blend in/out, section timing and link_sections verbs. Evidence |
Yescreate_montage, author_montages_batch, sections, segments, slot, properties, read_montage. Evidence
|
NoNo montage tools; SlotAnimTracks and CompositeSections are not Edit properties, so set_properties cannot reach them. Evidence
|
Yescreate_montage, add_montage_section/slot/notify, link_sections, set_blend_in/out, info read. Evidence
|
YesCreate, duplicate montages; sections, slot tracks, segments, notifies, branching points, blend settings. Evidence
|
Yescreate_montage, add/delete_montage_section, add_montage_slot, set_montage_blend, get_montage_info. Evidence
|
| Blendspace CRUD | Yescreate_blend_space_1d/2d, create_aim_offset, add_blend_sample, add_aim_offset_sample. Evidence |
Yescreate_blendspace, create_blendspace_1d, populate_blendspace, add/set_blend_sample, read_blendspace. Evidence
|
PartialNo blend space tools; existing asset axes and samples editable via generic set_properties; no create. Evidence
|
Yescreate_blend_space_1d/2d, create_aim_offset, add_blend_sample, set_axis_settings, info read. Evidence
|
PartialNo blend space service; creation only via execute_python_code with engine BlendSpaceFactoryNew. Evidence
|
Yescreate_blend_space(_1d), aim offsets, add/edit/delete_blendspace_sample, set_blend_space_axis. Evidence
|
| IK rig / retargeter | Yescreate_ik_rig, add_ik_chain, create_ik_retargeter, set_retarget_chain_mapping. Evidence |
YesNative create/read/configure IK rig and retargeter; configure_* actions are UE 5.8 only. Evidence
|
NoNo IK Rig or retargeter tools; retarget hits are Blueprint node class retargeting. Evidence
|
Yescreate_ik_rig, add_ik_chain, create_ik_retargeter, set_retarget_chain_mapping. Evidence
|
PartialNo IK Rig or retargeter code; only RetargetPreview and bone retarget modes; rest via execute_python_code. Evidence
|
Yescreate_ik_rig, add_ik_solver, add_retarget_chain, create_ik_retargeter, retarget pose and chain settings. Evidence |
| Pose Search | Partial3 verbs: schema with any channel kind set by reflection, database, add animation; no index build. Evidence
|
YesPose search database, schema, channels, normalization set, index build, motion matching node. Evidence
|
PartialGeneric DataAsset create plus set_properties can make PoseSearch schemas; database anim list not editable. Evidence
|
NoSearched PoseSearch, motion matching across whole repo (plugin C++, TS, docs); no hits. |
NoSearched PoseSearch, pose search, motion matching in Source, skills and docs; no code or docs. Evidence
|
YesPose Search schema/database create, channels, normalization sets, index rebuild, validation. Evidence
|
| Control Rig authoring | Yescreate_control_rig plus CRIR compile of RigVM graph, functions and hierarchy with controls. Evidence |
PartialNative create_control_rig plus graph reads; controls and graph edits via wrapped Epic toolset, UE 5.8 only. Evidence
|
YesControlRigTools: create rig, add bones, nulls, controls, graphs, nodes, pins, links, variables. Evidence
|
Partialcreate_control_rig creates asset from skeleton or mesh; no hierarchy or RigVM graph editing actions. Evidence |
PartialNo Control Rig code; only via execute_python_code; Epic AnimationAssistantToolset not enabled by VibeUE. Evidence
|
Yesadd_control_rig_element, add_control_rig_node, connect_control_rig_pins, get_control_rig_graph. Evidence
|
| Skin weights / cloth binding | Yesset_vertex_weights, auto_skin_weights, copy/normalize/prune weights, bind_cloth_to_skeletal_mesh. Evidence
|
Yesread/set_skeletal_mesh_skin_weights (256 verts per call), bind_cloth_to_section, set_cloth_config. Evidence
|
PartialCloth binding to mesh sections via ChaosClothAssetToolset plugin; no skin weight tools. Evidence
|
Yesset_vertex_weights writes a weight profile, bind_cloth_to_skeletal_mesh; copy/mirror/prune refuse, normalize/auto only rebuild. Evidence
|
PartialNo own skin weight op; only via execute_python_code calling engine SkinWeightModifier (MeshModelingToolset, enabled); no cloth. Evidence
|
PartialNo own skin weight op; only via editor.run_python calling engine SkinWeightModifier (MeshModelingToolset); no cloth binding. Evidence
|
| Non-destructive Control Rig sessions | PartialNo session verbs; a documented chain bakes a clip to Control Rig, keys controls in batch, exports a new clip. Evidence
|
Yesbegin/read/apply/bake_control_rig_edit sessions over a LevelSequence; source unchanged; UE 5.8 only. Evidence
|
PartialSequencer layered Control Rigs, bake to rig, collapse layers and linked AnimSequence export. Evidence
|
NoSearched ControlRig session, RigVMController, RigHierarchyController; only asset creation exists. |
PartialNo Control Rig; non-destructive preview sessions exist for AnimSequence bone edits (stack, cancel, bake). Evidence
|
NoControl Rig edits apply directly to the asset; searched session/transaction actions, only material ones exist. Evidence
|
| Batch retarget animations | Yesretarget_animations runs the IK Retargeter batch export and verifies outputs; setup_retargeting only copies. Evidence
|
Yesbatch_retarget_animations via IK Retargeter with mapping completeness report and rollback. Evidence
|
NoNo batch retarget; searched Retarget, IKRetargeter, batch. Evidence
|
Yessetup_retargeting runs UIKRetargetBatchOperation::RunBatchRetarget on assets; UE 5.8+ only. Evidence |
PartialNo batch retarget op; only reachable through execute_python_code with engine retarget Python API. Evidence
|
Yesbatch_retarget_animations action. Evidence
|
| Curve-to-morph target check | Yesanimation.check_morph_curves checks each curve matches a mesh morph and carries the MorphTarget flag. Evidence
|
Yescompare_curves_to_morph_targets matches curve names against mesh morph target names. Evidence
|
NoOnly morph target name listing; no curve to morph comparison. Evidence
|
NoSearched curve to morph checks; only list_morph_targets and runtime set_morph_target_value. |
PartialReads and sets the curve morph target flag; no check against the mesh's morph targets. Evidence
|
Noget_skeletal_mesh_info lists morph names only; searched morph across Source, no curve to morph check. Evidence
|
| Morph target creation and vertex deltas | Yescreate_morph_target, set_morph_target_deltas, set_morph_target_value, list and delete. Evidence |
NoSearched UMorphTarget/create_morph in src, plugin, docs: only name reads and curve flag; no creation. Evidence
|
NoMorph targets can only be listed by name; no creation or vertex delta tools. Evidence
|
Yescreate_morph_target and set_morph_target_deltas write per vertex deltas. Evidence |
NoNo morph target creation or deltas; only MorphTargetCount in mesh info and Epic morph name listing. Evidence
|
NoSearched MorphTarget across Source; only morph name read in get_skeletal_mesh_info; no creation or deltas. Evidence |
| Skeletal sockets and virtual bones CRUD | Yescreate/configure/delete/list sockets and create/delete/list virtual bones. Evidence |
Yesadd/remove/list_sockets, set_socket_transform (asset); add/remove_virtual_bone (animation). Evidence
|
PartialSkeletal mesh socket add, list, transform, rename, remove; no virtual bone tools. Evidence
|
Yesadd/modify/list/delete_socket and create/list/delete_virtual_bone. Evidence
|
PartialSocket CRUD via Epic toolset (SkeletalMeshTools); no virtual bone support found. Evidence
|
Yesadd_socket, remove_socket, set_socket_transform, get_skeleton_sockets, add_virtual_bone, remove_virtual_bones. Evidence |
| Sync markers, sync groups and notify states | Yesadd/set/remove/list sync markers, set_sync_group, add_notify_state, set_notify_state_property. Evidence |
Partialset_sync_markers and add/remove_notify_state exist; no sync group action (searched SyncGroup, sync_group). Evidence
|
NoNo sync marker, sync group or anim notify tools; Notifies and sync markers are not editable properties. Evidence
|
Partialadd_sync_marker and add_notify_state exist; no sync group support found. Evidence
|
PartialSync markers and notify states CRUD exist; no sync group setting on graph nodes found. Evidence
|
Yesadd/remove/rename_sync_marker, derive_foot_sync_markers, set_sync_group, add_notify_state. Evidence |
| Learned bone rotation limits and pose validation | NoSearched for rotation limit, joint limit, pose validation; only physics constraint limits exist. Evidence |
NoSearched rotation limit, joint limit, RotationLimit, pose validation; only guidance prose in doc. Evidence
|
NoNo learned rotation limits or pose validation; searched limit, validate, pose in animation toolsets. Evidence
|
NoSearched RotationLimit, JointLimit, pose validation; only physics constraint limits exist. |
YesLearns per bone rotation limits from animations, stores constraints, validates rotations and poses. Evidence
|
NoSearched rotation limit, joint limit, validate_pose; only validate_pose_search_database exists. Evidence |
| Skin-weight quality audit | Yesskeleton.audit_skin_weights gates zero-influence verts, weight sums, influences over the LOD limit and seam splits; reports bone coverage. Evidence
|
NoNo mesh-wide audit; read_skeletal_mesh_skin_weights returns weightSum and influenceCount for 1 to 256 named vertices only. Evidence
|
Noskeletal_mesh toolset reads LODs, vertex counts, bones, sockets; no skin weight reads or checks. Evidence
|
NoSearched audit, zero influence, unweighted, bone coverage; auto_skin_weights only rebuilds and reports maxBoneInfluences. Evidence
|
NoSearched skin weight, influence, audit terms in Source and Content; no skin weight reads or checks. Evidence
|
Noanalyze_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) | Yesedit_mesh_bones batches add, remove, rename, reparent, move via SkeletonModifier; needs Mesh Modeling Toolset. Evidence
|
Yesbegin/edit/commit_skeleton_edit sessions: add, remove, rename, reparent, move; needs Mesh Modeling Toolset. Evidence
|
NoSkeletalMeshTools only reads bone names, parents, children; SkeletonModifier appears only in a test setup. Evidence
|
PartialMesh gets set_bone_transform only; add/remove/rename/reparent edit USkeleton; Python reaches SkeletonModifier. Evidence
|
PartialSkeletonService adds, removes, renames, moves bones; reparent is remove+re-add, subtree weights fall to root. Evidence
|
PartialNo 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. | YesSkeleton 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.
|
NoSkeleton 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.
|
NoSkeleton compiled from text source (No): No text to skeleton compiler; skeletons only created by mesh import.
Animation clip compiled from text source (No): No text to animation clip compiler; clips come from FBX import or Sequencer bake.
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.
|
NoSkeleton 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.
|
PartialSkeleton 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.
|
PartialSkeleton compiled from text source (No): Searched skeleton import/build/spec actions; none compile a skeleton from text.
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. | YesAnim 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. |
YesAnim 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.
|
PartialAnim sequence read/write (Partial): Bake a Sequencer binding to an AnimSequence and load one into a Control Rig; no direct frame or key reads.
Bone track keys (Partial): Indirect only: load AnimSequence into a Sequencer Control Rig, key controls, bake back to AnimSequence.
|
YesAnim 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.
|
YesAnim 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.
|
YesAnim 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. | YesAnim 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. |
PartialAnim 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.
|
PartialAnim Blueprint graph text round-trip (Partial): Generic Blueprint graph DSL read/write; no AnimGraph or state machine support in the DSL.
Control Rig graph text round-trip (No): Control Rig graph editable node by node only; no text export or import.
|
PartialAnim 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. |
PartialAnim 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.
|
PartialAnim 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. | PartialSkeleton 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.
|
PartialSkeleton 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.
|
PartialSkeleton asset bone hierarchy edits (No): Searched toolsets for USkeleton bone edits; add_bone edits a Control Rig hierarchy; no unrestricted Python.
Create skeleton from skeletal mesh (Partial): import_file creates a Skeleton when importing a mesh file without one; no tool for existing meshes.
|
PartialSkeleton 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. |
PartialSkeleton 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.
|
PartialSkeleton asset bone hierarchy edits (Partial): No skeleton bone action; editor.run_python reaches engine SkeletonModifier, whose commit updates the Skeleton.
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. | YesDeterministic 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. |
YesDeterministic 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.
|
NoDeterministic animation analysis (No): No animation analysis tools; searched analysis, foot sliding, root motion, velocity terms.
Locomotion speed measurement (No): No locomotion speed measurement; searched speed, velocity, root motion.
|
NoDeterministic 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. |
PartialDeterministic 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.
|
PartialDeterministic 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. | PartialLive 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. |
YesLive 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.
|
PartialLive PIE bone reads (No): No runtime bone transform reads during PIE; bone tools read static mesh hierarchy only.
Live post-process AnimBP override (Partial): No dedicated tool; generic set_properties can set a mesh PostProcessAnimBlueprint (asset edit, not live).
|
PartialLive 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. |
PartialLive 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.
|
PartialLive 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. | PartialContact 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.
|
YesContact 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.
|
PartialContact constraints (hand/foot lock) (Partial): Snap controls to an actor over a frame range and space switching; no dedicated hand or foot lock.
Viewport pose capture + propagation (Partial): Keys current control values at listed frames; viewport capture is an image only, no pose capture.
|
NoContact 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. |
PartialContact constraints (hand/foot lock) (No): Searched foot lock, hand lock, contact, foot sliding in Source and skills; nothing found.
Viewport pose capture + propagation (Partial): No viewport pose capture; CopyPose copies frame poses and preview edits bake across a frame range.
|
PartialContact 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Create system | Yesniagara.create_system creates an empty UNiagaraSystem asset. Evidence |
Yescreate (idempotent) and create_system_from_spec; Epic epic_create_niagara_system also wrapped (5.8 only). Evidence
|
YesCreateNiagaraSystem AICallable in NiagaraToolsets; a template system is required, no empty create. Evidence
|
Yescreate_niagara_system subAction of manage_effect creates a UNiagaraSystem asset. Evidence |
PartialVia Epic toolset: NiagaraToolset_System CreateNiagaraSystem; VibeUE NiagaraService create was trimmed. Evidence
|
Yesniagara.create_system action; create_system_from_spec builds a full system from JSON. Evidence
|
| Module CRUD | Yesadd_module, remove_module, move_module, set_module_input, set_module_script, reset_module_input. Evidence |
Yesadd/remove/enable module, set input, dynamic inputs, static switches; list_module_inputs returns no current values. Evidence
|
YesAddModule, RemoveModule, SetModuleEnabled, SetStackInputData, SetParameters module ops; no reorder tool. Evidence
|
Yesadd_niagara_module plus presets, set module inputs and dynamic inputs, remove_niagara_node, modules listed in info. Evidence
|
PartialVia Epic toolset: AddModule/RemoveModule/SetStackInputData; VibeUE own module add is private helper only. Evidence
|
Yesadd/remove/move/duplicate module, set_module_input_value, set_module_enabled, get_module_inputs. Evidence |
| User parameters | Yesadd/set/remove/rename_parameter with user scope; effect.set_niagara_parameter sets them at runtime. Evidence
|
PartialNative: list system user params, set override on a placed component; adding params to asset only via Epic toolset 5.8. Evidence
|
YesSystem Get/Add/RemoveUserVariables plus component level Get/SetVariable overrides. Evidence
|
Yesadd_user_parameter, set_parameter_value, bind_parameter_to_source; get_niagara_info lists them; no remove. Evidence
|
PartialVia Epic toolset: AddUserVariables/RemoveUserVariables; VibeUE skill warns add can crash (issue 464). Evidence
|
Yesadd/remove/rename_user_parameter, get_user_parameters, set_parameter_default. Evidence
|
| HLSL module create | Yesniagara.create_module_script builds a module asset from HLSL with typed pins and compiles it; UE 5.5+. Evidence
|
Yescreate_module_from_hlsl, create_scratch_module, get_custom_hlsl and set_custom_hlsl read/rewrite node bodies. Evidence
|
PartialOnly inline HLSL expressions on stack inputs via SetStackInputData; no custom HLSL module or script creation. Evidence
|
NoSearched hlsl, CustomHlsl, UNiagaraNodeCustomHlsl; HLSL only appears in material custom expression code. Evidence
|
YesNiagaraScratchPadService creates scratch modules, adds Custom HLSL nodes and sets their code. Evidence
|
Yescreate_module_from_hlsl and create_function_from_hlsl; set_custom_hlsl_text edits Custom HLSL nodes. Evidence
|
| Spawn VFX in level | Yesniagara.spawn_actor places an ANiagaraActor; effect.spawn_niagara also spawns systems. Evidence |
Yesspawn (transient component) and spawn_actor (persistent labeled actor), plus reactivate. Evidence
|
YesGeneric EditorToolset add_to_scene_from_asset spawns an asset; Niagara level placement skill guides it. Evidence
|
Yesspawn_niagara and spawn_niagara_actor place a Niagara actor in the level. Evidence |
PartialNo Niagara spawn op; skills route actor spawning to Python EditorActorSubsystem or engine toolsets. Evidence
|
PartialNo Niagara spawn action; mesh.spawn_actor spawns a class but cannot set the system asset without run_python. Evidence
|
| Niagara emission validation | Yesvalidate checks emitters, renderers, compile and activation; niagara.simulate measures live particle counts. Evidence
|
Partialvalidate_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
|
NoSearched toolsets for particle count, activation, runtime emit checks; only compile state and stack issues. Evidence
|
Partialvalidate_niagara_system checks stack issues and empty or disabled emitters; no particle count read. Evidence
|
Partialdebug_activation reads validity, enabled flags, loop and spawn rate params; does not simulate or count particles. Evidence |
Partialvalidate_system flags emitters with no spawn module; preview_system screenshots; no live particle count. Evidence
|
| Simulation stages / event handlers | Yesadd/remove_simulation_stage and add/remove_event_handler RPCs. Evidence
|
Yesadd/remove simulation stage and add/remove event handler; stage/handler settings go through asset set_property. Evidence
|
NoNo add or edit tools for sim stages or event handlers; topology covers four stacks; only compile state lists them. Evidence
|
Yesadd_simulation_stage creates generic stage; add_event_receiver calls Emitter->AddEventHandler. Evidence
|
NoSearched SimulationStage, EventHandler in VibeUE and Epic NiagaraToolsets; scratch stages are spawn/update only. Evidence |
Yesadd/remove/get simulation stages and event handlers, plus stage and handler property setters. Evidence
|
| Compiled GPU script inspection | Yesniagara.get_compiled_script returns GPU permutations, shader errors and the generated GPU HLSL text. Evidence
|
Partialget_compiled_hlsl returns only GPU script name and IsCompilable flag, no HLSL text; compile reports per-script events. Evidence
|
PartialGetSystemCompileState gives per script status and compile events incl GPU compute; no generated HLSL access. Evidence
|
NoSearched GetVMExecutableData, ByteCode, GetGPUComputeScript; only enable_gpu_simulation exists. Evidence |
NoSearched HLSL/GPU script readers; only get_compile_messages returns compiler diagnostics text. Evidence
|
Yesget_compiled_gpu_hlsl returns compiled GPU HLSL for an emitter. Evidence
|
| Level-wide Niagara crash-risk audit | Yesaudit_level flags live systems whose DI counts mismatch and would crash on tick; validate reports it; remove_orphan_data_interfaces repairs. Evidence
|
NoSearched crash, audit, risk across src, plugin, docs; level handler only reports asset/active/visible per component. Evidence
|
NoSearched NiagaraToolsets and EditorToolset for level wide Niagara scans or audits; none found. Evidence
|
NoSearched TActorIterator of Niagara types, audit, crash; Niagara actor lookups are per action only. Evidence
|
NoSearched Niagara audit, crash, level scan in services and skills; profiling only has a niagara stat channel. Evidence |
NoSearched audit/level/crash actions; only audit_cross_asset_refs (stale C++ class refs), nothing per level. Evidence
|
| Niagara system as readable text | Yesniagara.decompile_nir returns NIR text; asset dumps write nir.txt per Niagara asset. Evidence |
PartialOwn get_niagara_info lists emitter names only; structured JSON via wrapped Epic GetSystemSummary/GetEmitterTopology, UE 5.8 only; no text IR. Evidence
|
PartialStructured JSON via GetSystemSummary, GetEmitterTopology and input value calls; no single text dump. Evidence
|
Partialget_niagara_info returns a JSON summary of emitters, modules, inputs, user params; no text IR. Evidence |
PartialVia Epic toolset: GetSystemSummary and topology structs; VibeUE compare_systems diffs two systems. Evidence
|
PartialJSON readback (export_system_spec, get_system_summary) and create_system_from_spec JSON authoring; no text IR. Evidence
|
| Stack issues list and apply fix | Yeslist_stack_issues reads stack panel issues and engine fixes; apply_issue_fix runs one and re-lists. Evidence
|
PartialVia wrapped Epic toolset, UE 5.8 only (epic_get_stack_issues, epic_apply_stack_issue_fix; Fix style only). Evidence
|
YesGetStackIssues lists issues with fixes; ApplyStackIssueFix applies Fix style fixes and returns post fix issues. Evidence
|
PartialStack Error and Warning issues listed by validate_niagara_system; no apply fix action (no GetFixes use). Evidence
|
PartialVia Epic toolset: GetStackIssues and ApplyStackIssueFix; no VibeUE own operation. Evidence
|
Partialget_system_diagnostics and validate_system list issues; no stack issue API or fix apply found. Evidence
|
| Niagara SubUV grid checked against its atlas texture | Yesniagara.validate subUVAtlasCheck measures each SubUV renderer's atlas cells and flags NIAGARA_SUBUV_ATLAS_SIZE_MISMATCH. Evidence |
NoSearched SubImageSize, subuv, flipbook; no SubUV grid setting or check. Evidence
|
NoOnly skill prompt text saying the grid must match the texture; no tool reads or checks it. Evidence
|
NoSearched SubImageSize, subuv, flipbook; no SubUV grid setting or check. Evidence
|
NoSearched SubImageSize, subuv, flipbook; none, and Epic toolsets it uses have no check either. Evidence
|
Noconfigure_subuv only writes SubImageSize from caller columns/rows; never reads the texture to check it. Evidence
|
| Emitter inheritance: stale-parent detection and merge | Yesadd_emitter keeps the parent link; validate flags EMITTER_PARENT_STALE; refresh_emitter merges parent edits, keeping overrides. Evidence
|
Nocreate_emitter inherit=true makes a child asset; no stale-parent check or merge. Engine merge API is C++ only. Evidence
|
NoAddEmitter copies from a template; no parent sync check or merge tool. Evidence
|
NoSearched merge, parent sync and inheritance terms; no emitter inheritance handling. Evidence
|
NoSearched merge, parent sync and inheritance terms; none, and Epic toolsets have none either. Evidence
|
Noget_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. | YesEmitter 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. |
YesEmitter 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.
|
YesEmitter CRUD (Yes): AddEmitter from template, RemoveEmitter, Get/SetEmitterData, GetEmitterTopology/Summary.
Renderer CRUD (Yes): AddRenderer, RemoveRenderer, Get/SetRendererData, GetRendererSchema per renderer class.
|
PartialEmitter 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.
|
PartialEmitter 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.
|
YesEmitter 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Live Coding compile | Yessystem.live_coding_compile triggers in-process Live Coding and returns result plus LogLiveCoding tail. Evidence |
Yesproject.live_coding_compile via ILiveCodingModule plus live_coding_status; Windows only. Evidence
|
YesCompileLiveCoding triggers Live Coding, waits, returns status plus compiler diagnostics. Evidence
|
PartialNo compile op; LiveCoding.Compile reachable only via console_command; read_log reads the Live Coding log. Evidence
|
PartialNo VibeUE code for Live Coding; via Epic toolset LiveCodingToolset (CompileLiveCoding). Evidence
|
Yeseditor.trigger_build / live_compile trigger a Live Coding compile, optional wait. Evidence |
| PIE control | Yeseditor.play, stop, pause, resume, step_frame, possess, eject, status, pie_status. Evidence |
Yesplay_in_editor with pieAction start, stop, status only; no pause. Evidence |
YesStartPIE, StopPIE, IsPIERunning with async wait for PIE start and shutdown. Evidence
|
Yesplay, stop, pause, resume, eject, possess actions. Evidence
|
YesPerformanceService StartPIE/StopPIE plus RunScenario start_pie/wait_for_pie/stop_pie steps. Evidence
|
Yesstart_pie / stop_pie plus async run_pie_smoke / poll_pie_smoke / stop_pie_smoke sessions. Evidence |
| Screenshot capture | Yeseditor.screenshot, editor.screenshot_window, render.capture_* and camera.* capture ops. Evidence |
Yescapture_screenshot (pie, editor, window targets) and capture_scene_png at chosen size. Evidence |
YesCaptureViewport with optional grid and actor labels, CaptureEditorImage, CaptureAssetImage. Evidence
|
Yesscreenshot with editor_viewport, game_viewport and full_editor_window modes. Evidence |
Yescapture_image tool (game incl. UMG, window, editor) and ViewportService CaptureScene from arbitrary camera. Evidence
|
Yescapture_scene_preview (asset preview), capture_pie_movement_clip (PIE frames); no plain level viewport shot. Evidence
|
| Viewport camera | Yeseditor.set_camera, focus_actor, bookmarks; system.inspect.get_viewport_info reads camera. Evidence |
Yesset_viewport (pose, projection), set_viewport_view (fov, clip), focus_on_actor, get_viewport_state. Evidence |
YesGetCameraTransform, SetCameraTransform, FocusOnActors on the level viewport. Evidence
|
Yesset_camera sets editor viewport position/rotation/FOV; focus_actor and bookmarks too. Evidence
|
YesActorService SetViewportCamera and actor framing; ViewportService FOV, clip planes, camera speed. Evidence
|
Partialget_viewport_info reads camera; set only via mesh camera bookmarks or select_actors focus, no free set. Evidence
|
| Scalability + CVar bulk set | Yesperformance.set_scalability plus editor.set_preferences sets a map of CVars in one call. Evidence |
Yesset_scalability plus set_cvars bulk set with old/new values, get_cvars. Evidence |
NoSearchCVars reads only; ConfigSettings writes ini settings without applying cvars; no Scalability or SetCVar. Evidence
|
Partialset_scalability per group, set_cvar single CVar, baseline profiles; no multi CVar batch. Evidence |
YesSetConsoleVariablesFromJson bulk cvar set; SetScalabilityLevel and SetOverallScalabilityLevel. Evidence |
PartialNo scalability or bulk CVar action; console commands via run_console_command or console_script array. Evidence
|
| Reflective UFUNCTION invocation | Yesobject.call_function invokes any UFUNCTION with JSON args, returns out params; PIE RPCs use real net routing. Evidence
|
Yesinvoke_object_function, invoke_function, invoke_static_function. Evidence |
NoOnly UFUNCTIONs on UToolsetDefinition or MCP tool library subclasses are callable; no generic invoke. Evidence
|
Yesinvoke_reflected_function calls any UFUNCTION (elevated consent); call_actor_function too. Evidence |
PartialNo dedicated invoke tool; any BlueprintCallable is reachable only via execute_python_code. Evidence
|
Partialeditor.pie_call_function invokes UFunctions via ProcessEvent, limited to live PIE objects. Evidence
|
| Live PIE actor manipulation | Yesactor.* verbs resolve the PIE world first; property.set and object.call_function on PIE objects. Evidence |
Yesteleport_runtime_actor, set_runtime_visibility, set_object_property on live PIE actors. Evidence |
YesScene tools resolve the PIE world when PIE runs; find_actors, actor transform and property tools apply. Evidence
|
YesActor spawn, lookup and query target GEditor->PlayWorld while PIE runs. Evidence |
YesPIEActorService spawn/destroy/list actors in server or client PIE worlds by selector; no move of existing. Evidence
|
Yespie_get_object_properties, pie_call_function, pie_set_control_rotation, pie_inject_input_action, possess. Evidence |
| Engine class hierarchy / usage examplesAlso possible from the shell: grep over Engine/Source finds a class's declared parent and usage examples. The tools add a precomputed transitive subclass tree (and, for reflection-based ones, Blueprint and runtime-loaded classes) that grep only rebuilds by repeated searches. | Partialsearch_classes filters by parent; inspect_class returns inheritanceChain, properties, functions and interfaces; no usage examples. Evidence
|
Yesclass_hierarchy and find_example_usage over engine symbol index and sources. Evidence |
Partialobject.search_subclasses and list_properties give live hierarchy; no usage examples. Evidence
|
Partialinspect_class gives ancestor chain, flags, defaults; no subclass listing or usage examples. Evidence |
Partialdiscover_python_class returns base_classes and docstrings; no subclass or usage example search. Evidence |
Yessource.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. | Yeseditor.run_utility_blueprint and python.execute on a windowless editor from editor_start. Evidence |
Partialrun_utility_blueprint, run_python_file, YAML flows need a live editor; no commandlet runner found. Evidence |
NoNo commandlet or headless editor tool; only internal ModelContextProtocolToolHashMappingCommandlet. Evidence
|
NoBridge skips init under commandlets; Python only in a running editor; no editor utility ops. Evidence
|
NoModule skips all services under commandlets; only a skill tip about -run=pythonscript. Evidence |
Partialmonolith_query.exe runs index queries offline without editor; no headless editor script runner. Evidence |
| Frame-exact PIE pause and single-frame step | Yeseditor.pause freezes world and UI; editor.step_frame advances exactly one frame. Evidence |
NoSearched pause, step, SetPause, bDebugPauseExecution; only set_pie_time_scale and PIE start/stop/status. Evidence |
NoSearched Pause, SingleFrameAdvance, SetGamePaused; PIE tools only start, stop and query. Evidence
|
Yespause plus step_frame (up to 600 frames) using bDebugFrameStepExecution; set_fixed_delta_time. Evidence |
NoSearched SetPause, SetGamePaused, StepFrame, SingleFrame, bIsPaused; none found. Evidence
|
NoSearched SetPause, StepOneFrame, SetGamePaused; no PIE pause or single frame step. Evidence
|
| Memory report capture | Yesperformance.generate_memory_report runs memreport and returns the file path. Evidence |
Partialget_perf_stats reads FPlatformMemory stats; memreport only via execute_command. Evidence |
NoSearched MemReport, LLM, FPlatformMemory, memory stats; no memory report tool. Evidence
|
Yesgenerate_memory_report runs memreport and returns the newest .memreport file. Evidence |
NoSearched MemReport, LLM_, FPlatformMemory in Source; none found. Evidence
|
NoSearched memreport, MemReport; no memory report capture action. Evidence
|
| Project C++ reflection index linked to assets | PartialNo project C++ index tied to assets; engine-wide reflection API index plus live native class to asset queries. Evidence
|
PartialNo persisted index; live reflect_class plus search_call_sites finds Blueprint call sites. Evidence
|
NoNo indexed C++ reflection data; SemanticSearch index covers assets only, reflection is live per call. Evidence
|
NoSearched for a C++ reflection or source index linked to assets; none. Evidence
|
NoSearched for C++ reflection index tied to assets; journal only links optional GameIQ plugin snapshots. Evidence
|
Yescppreflect UHT reflection index joined with asset registry (cpp_asset_edges). Evidence |
| Test-run verdict with crash attribution (fails closed) | Yeseditor_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
|
Norun_automation_tests runs in the editor and flags abandoned tests; list_crashes is not tied to a run; no drain check. Evidence
|
NoAutomationTestToolset runs tests in the editor and reports counts; no crash matching; searched IsEnsure, CrashContext. Evidence
|
Norun_tests results go only to the Output Log; the drain marker appears only in CI script native-gates.ps1. Evidence
|
NoNo test runner of its own; searched IsEnsure, CrashContext, Test Queue Empty. Evidence
|
Norun_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. | YesConsole 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. |
YesConsole command (Yes): editor.execute_command runs a console command.
Execute Python (Yes): execute_python (gated behind a tool search ruling) and run_python_file. |
PartialConsole command (Partial): No console exec tool; reachable only by SlateInspector Type with Submit into the editor Cmd input box.
Execute Python (Partial): execute_tool_script runs sandboxed Python that only calls tools; imports limited to json, math, re etc.
|
YesConsole 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. |
PartialConsole 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. |
YesConsole 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. | YesWhat 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. |
YesWhat 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. |
PartialWhat the user has open (Yes): GetOpenAssets, GetSelectedActors, GetSelectedAssets, GetContentBrowserPath, get_current_level.
Dirty packages / world state read (Partial): asset.is_dirty checks one asset; no list of all dirty packages.
|
PartialWhat 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.
|
PartialWhat 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.
|
PartialWhat 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. | YesEditor 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.
|
PartialEditor 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. |
NoEditor start/stop/restart (No): HTTP server runs inside the editor process; no tool to launch, stop or restart the editor.
Windowless (offscreen) editor launch (No): Server lives inside an already running editor; no launch options, offscreen or otherwise.
|
PartialEditor 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. |
PartialEditor 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.
|
NoEditor 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. | YesAutomation 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. |
PartialAutomation 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. |
PartialAutomation test runner (Yes): DiscoverTests, ListTests, RunTests, RunTestsByFilter, GetTestStatus, GetTestResults, StopTests.
Process-isolated automation test groups (No): RunTests runs in the local editor worker; no process isolation or grouping by process.
|
PartialAutomation 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. |
PartialAutomation 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.
|
PartialAutomation 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. | YesUnreal 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. |
PartialUnreal 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. |
NoUnreal Insights trace / profiling (No): Searched Trace, Insights, utrace, FTraceAuxiliary, stat; no trace or profiling tools.
Trace export to CSV tables (No): No trace tools at all; searched Trace, Insights, CSV export.
|
PartialUnreal 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.
|
PartialUnreal 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. |
PartialUnreal 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. | YesDrive 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. |
PartialDrive 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. |
PartialDrive editor windows and dialogs by element (Yes): SlateInspectorToolset: widget tree Snapshot with refs, Click, Type, Drag, SelectOption, FillForm, Windows.
Editor window resize and full-window capture (Partial): CaptureEditorImage grabs all editor windows; Slate Windows lists, focuses, closes but cannot resize.
|
PartialDrive 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. |
PartialDrive 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.
|
NoDrive 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. | PartialFrame 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. |
YesFrame 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. |
NoFrame timing with bottleneck verdict (No): Searched stat unit, FrameTime, GAverageFPS, GPU time; no frame timing or bottleneck tool.
Hitch injection for testing (No): Searched Hitch across toolsets; no hitch injection tool.
|
PartialFrame 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.
|
YesFrame 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. |
PartialFrame 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Modal dialog detection | YesI/O thread probe reports EDITOR_BLOCKED_ON_MODAL with modal title and seconds blocked, via ping and calls. Evidence
|
YesPlugin publishes the active modal from the modal loop tick; server watches it and probes on demand. Evidence
|
NoNo modal detection; searched modal/dialog/MessageDialog. Tools only pre-save to avoid dialogs (scene.py:398). Evidence
|
YesDispatch checks GetActiveModalWindow and refuses with EDITOR_MODAL_ACTIVE; window list reports isModal. Evidence |
PartialNo modal detection; health file reports game thread stall seconds, which a blocking modal would raise. Evidence
|
PartialPassive watcher logs MODAL_OPEN/MODAL_CLOSE to the editor log; no MCP call reports modal state. Evidence
|
| Asset locking between agents | NoSearched source and wiki for asset/package lock, lease, claim between agents; none found. Evidence
|
Yesasset lock, unlock, list_locks with TTL; automatic locking of mutating calls is opt in via ue-mcp.yml. Evidence |
NoNo agent asset locks; only source control state queries can_edit/can_edit_asset. Searched lock/lease/claim. Evidence
|
PartialNo per-asset locks; optimistic global Package/AssetRegistry revision pins refuse with STALE_STATE. Evidence |
NoSearched lock/lease/another agent; none. BT and Blackboard edits only refuse while an asset editor is open. Evidence |
NoSearched lock/Lock in Source and proxy; only internal registry and DB mutexes, no per-asset agent locks. Evidence
|
| On-demand tool discovery (lean context) | YesSingle call tool; namespace and method docs fetched on demand or read from the on disk wiki. Evidence
|
YesDefault micro strategy advertises one tools gateway (search, describe, call), about 2.1k tokens. Evidence
|
YesbEnableToolSearch (default true) exposes only list_toolsets, describe_toolset, call_tool. Evidence
|
YesSingle 'unreal' tool with search, describe, execute operations over the capability catalog. Evidence |
PartialTool Search via Epic toolset; VibeUE adds discover_python_* tools and lazy skills via Epic AgentSkill. Evidence |
YesNamespace dispatch tools plus monolith_discover lists actions tersely; schema on demand. Evidence |
| Includes Epic 5.8 toolsets | NoSearched source and docs for Epic native MCP, ModelContextProtocol, AI toolset wrappers; none found. Evidence
|
YesWraps 824 Epic toolset tools in 52 toolsets as declared actions via epic_call_tool; UE 5.8 only. Evidence |
n/aThis product is Epic's native 5.8 MCP itself, so wrapping it does not apply. Evidence
|
NoSearched for Toolset, ModelContextProtocol plugin, Epic native MCP; only its own handlers and own HTTP server. |
YesRegisters into Epic's native MCP server and ToolsetRegistry; Epic toolsets served alongside on one endpoint. Evidence |
NoSearched Epic, ModelContext, native MCP, toolset registry; own HTTP MCP server only. Evidence |
| Read dialog text and buttons | PartialBlocked modal reports only its title; drive.observe reads editor window buttons but not while a modal blocks. Evidence
|
Yeslist_dialogs returns title, message, buttons and choices; modal safe on the bridge. Evidence
|
NoNo tool reads dialog text or buttons; searched dialog/modal/MessageDialog. Evidence
|
NoCalls are refused while a modal is open; window list gives title and isModal only, no button text. Evidence |
No |
PartialModal title and message text harvested into the log record; no button list, not readable via MCP. Evidence
|
| Dialog check on every call path | YesModal block fails every tools/call fast; suppression scope wraps every dispatched handler. Evidence
|
YesOne DialogGuard gates GuardedBridge calls, in-process tool dispatch and the HTTP flow routes. Evidence |
NoNo dialog gate on any call route; server dispatch has no modal check. Evidence
|
YesWebSocket and native HTTP requests both enter the subsystem queue and pass the same modal refusal. Evidence |
NoNo dialog system to gate calls; bridge RunAsync calls ExecuteTool directly with no gate. Evidence |
NoNo 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
|
YesWith several editors registered, untargeted mutating calls are refused until an editor is named. Evidence
|
NoNo cross-editor write coordination; searched lock/instance/multiple editor. Evidence
|
NoSearched for cross-editor write coordination; revision pins are per editor process only. |
NoNo cross editor write coordination; only per PID signal files and port clash logging. Evidence |
NoSearched multi-editor, instance, lock; no cross-editor write coordination. Evidence |
| Rejects browser-origin requests | YesRequests with a non loopback Origin header get HTTP 403; loopback page origins are allowed. Evidence
|
YesWebSocket upgrade with any Origin header is refused with 403. Evidence |
YesValidateOriginHeader rejects Origin not localhost, 127.0.0.1 or [::1] on POST, GET and DELETE. Evidence
|
YesWebSocket handshake tears down any request carrying an Origin header with code 4403. Evidence |
PartialVia Epic toolset: Epic MCP server rejects non-localhost Origin headers; VibeUE adds no check. Evidence
|
PartialCORS echoes only loopback origins; requests from other origins still execute, response unreadable. Evidence
|
| Protected engine roots | PartialOnly animation and skeleton create verbs refuse /Engine targets; other asset writes accept any mount. Evidence |
YesUE_MCP_PROTECTED_ENGINE_ROOTS deny list; server refuses a protected engine root. Evidence
|
NoNo /Engine write protection; searched /Engine path checks. Only script open() is limited to project dirs. Evidence
|
PartialPath gate allows /Engine; only some handlers refuse /Engine and /Script writes; scoped tokens limit prefixes. Evidence |
PartialBT, EQS, Customizable Object services refuse writes under /Engine/, /Script/, /Temp/; not global. Evidence |
NoSearched /Engine prefix checks; validator test states engine root is writable, no protected roots. Evidence |
| Undo transactions + history | YesHandlers 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 |
Yesundo, redo, get_undo_state, get_transaction_history, undo_redo_steps, begin/end_transaction. Evidence |
PartialLibrary tools run in FScopedTransaction; UndoTransaction helper exists; no undo or history tool. Evidence
|
PartialUndo and redo actions plus scoped editor transactions; no undo history listing. Evidence |
YesTransactionService: undo/redo, begin/end/cancel transaction, GetHistory, ResetBuffer. Evidence |
PartialFScopedTransaction used widely, material begin/end_transaction; no undo, redo or history action. Evidence
|
| Transport auth token (on by default) | YesBearer token required by default, auto generated 64 hex token file, bRequireAuthToken switch. Evidence
|
PartialEditor bridge has no auth (loopback only); bearer token only on the optional flow HTTP server, off by default. Evidence |
NoNo auth token; only Origin and Mcp-Session-Id checks. Searched Authorization/bearer/token. Evidence
|
YesbRequireCapabilityToken defaults true; token auto-generated at Saved/MCP/capability-token. Evidence |
NoNo auth token in VibeUE or Epic server; README says loopback only with no authentication. Evidence |
NoSearched token/auth/bearer in HTTP server and settings; server open on all interfaces. Evidence
|
| Scoped access tokens (read-only, paths, quota) | NoOne project wide token with on/off switch; searched settings for read only, path or quota scopes. Evidence
|
NoSearched read-only, quota, path scopes, token scopes; none. Only custom guard code could emulate. Evidence
|
NoNo scoped tokens; only global tool name block/allow lists in settings. Searched token/read only/quota. Evidence
|
YesFMcpScopedCapabilityToken carries scopes, path prefixes, projects and per-minute quotas. Evidence |
NoSearched token, auth, read-only mode, quota, allowlist; no scoped access tokens. Evidence |
NoNo auth at all; searched token, auth, quota. Evidence |
| Guards against Blueprint corruption on edit | Yescompile, set_default, reparent, modify_scs, compile_bpir refuse LIVE_INSTANCES_WOULD_BE_REINSTANCED unless allowReinstancing; BPIR rollback. Evidence
|
PartialInherited component writes go to child ICH, orphan node cleanup, validate action; no reinstancing guard. Evidence
|
Partialcompile_blueprint raises with node errors after compile; no reinstancing guard found. Evidence
|
PartialCompile resets the undo buffer when reinstanced instances would pin worlds and reports diagnostics; no refusal or rollback. Evidence |
PartialRefuses BP loads during PIE, guards BP class delete crash, PIE spawn rejects REINST/stale classes. Evidence |
Partialvalidate_blueprint action and targeted reinstance crash workarounds; no general integrity guard. Evidence
|
| Writes check the target world first | YesEvery mutating verb accepts expectWorld; mismatch returns WORLD_MISMATCH before the handler runs. Evidence |
PartialREQUIRE_EDITOR_WORLD null check on handlers; PIE refusal on some actions; no expected level param. Evidence
|
PartialSome scene writes (add, remove, merge actors) raise while PIE is active; no general precondition. Evidence
|
PartialGate refuses PIE-only calls in edit mode; SCS writes refuse during PIE; optional Level revision pin. Evidence |
PartialWorld mutating Python refused until editor world and World Partition are ready; several services refuse in PIE. Evidence |
PartialOnly 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 | YesOffscreen editors, tests and builds: 60% RAM cap (per process on Windows, whole tree on Linux), BelowNormal. Evidence
|
Nostart_editor and builds spawn with no memory cap or priority; only its status writer thread runs BelowNormal. Evidence
|
NoServer runs inside the editor and launches no processes; searched Job Object, systemd-run, priority class. Evidence
|
NoBuild and packaged-game launches spawn uncapped at normal priority; searched Job Object, systemd-run, nice, priority class. Evidence
|
NoNo memory cap or priority on any launch; repo launch scripts start processes plainly; searched Job Object, systemd-run, nice. Evidence
|
NoNo process launch; only its indexer threads run BelowNormal. Evidence
|
| Launched editors survive the agent's process-tree kill | YesEditor, test and build supervisors start via WMI Win32_Process.Create (breakaway fallback), setsid on Linux; result reports launchMechanism. Evidence
|
Partialstart_editor spawns detached plus unref; on Windows the editor stays a child of the server process, no breakaway or WMI launch. Evidence
|
NoServer runs inside an already running editor; no tool launches an editor. Evidence
|
NoNo editor cold start; restart_editor relaunches from inside the running editor via FUnrealEdMisc::RestartEditor. Evidence
|
NoNo launch tool; BuildAndLaunchGame.ps1 Start-Process is a repo script, not an MCP operation. Evidence
|
NoNo editor launch action; its proxy only survives editor restarts. Evidence
|
| Leaked Python callback tracking and cleanup | Yespython.callbacks lists and clears leaked Slate tick and shutdown callbacks; python.execute reports leakedCallbacks; EndPIE warns on survivors. Evidence
|
NoRegisters its own quit callback only; no tracking of script callbacks; searched register_slate_*_callback. Evidence
|
NoNo unrestricted Python and no callback tracking; searched register_slate_*_callback. Evidence
|
NoNo callback tracking; searched register_slate_*_callback and shutdown callbacks. Evidence
|
NoSkill doc only warns that a leaked slate callback needs an editor restart; no tracking or cleanup. Evidence
|
NoNo callback tracking; searched register_slate_*_callback and shutdown callbacks. Evidence
|
| Safe builds and editor launches when several agents share one machine | YesLease refuses a second build; machine-wide launch lock; stale builds flagged; low-RAM and editor-cap refusals. Evidence
|
NoUBT -WaitMutex queues a second build; start_editor checks only this project's editor; no stale or RAM check. Evidence
|
NoRuns inside one editor; no build or editor launch tool, so no build guard, launch lock or admission check. Evidence
|
Norun_ubt spawns UBT with no guard; no editor cold start or launch lock; no stale-build status or memory check. Evidence
|
NoNo build or launch tool; repo script BuildAndLaunchGame.ps1 kills every UnrealEditor on the machine first. Evidence
|
NoNo 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. | PartialDialog 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.
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.
Dialog system: pre-armed pattern answers (No): No caller-set answer patterns; only blanket suppression to engine defaults plus a fixed boot prompt disable.
|
YesDialog 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.
|
NoDialog system: policy (auto / defer / ask) (No): No dialog policy setting or tool; searched dialog/modal/unattended across MCP, registry and toolsets.
Dialog system: per-row checkbox answers (No): No dialog answering at all, so no per-row checkbox answers; searched dialog/checkbox.
Dialog system: human-only answers via in-client form (No): Elicitation capability struct is parsed but never used; no in-client human answer form.
Dialog system: pre-armed pattern answers (No): No pre-armed dialog answers; searched dialog/modal/auto answer patterns.
|
PartialDialog 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. |
NoDialog 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. |
PartialDialog 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. | PartialPre-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. |
YesPre-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. |
PartialPre-call guards / policy hooks (Partial): Static config block/allow lists for tool names and SetObjectProperties classes; no per-call hook API.
Guard scopes by declared effect (No): No declared effect metadata; searched readOnlyHint/destructiveHint/annotations in server and registry.
|
YesPre-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. |
PartialPre-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. |
NoPre-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. | YesSafe 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.
|
PartialSafe 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.
|
PartialSafe editor shutdown (dirty check) (No): No editor quit or restart tool; searched RequestExit/quit/shutdown/restart.
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.
Refuses save over external disk changes (No): No disk change check before save; searched external/modified on disk in save paths.
|
PartialSafe 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. |
PartialSafe 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. |
PartialSafe 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. | PartialDangerous 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. |
PartialDangerous 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.
|
PartialDangerous console/script input blocking (Yes): execute_tool_script sandbox: import allowlist, safe builtins, read-only open under project. No console tool.
Python escape hatch gated by tool search (No): No raw Python tool; execute_tool_script is an allowlisted sandbox, not gated by tool search.
|
PartialDangerous 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. |
PartialDangerous 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. |
NoDangerous 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. | NoPer-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.
|
PartialPer-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.
|
NoPer-action consent for destructive calls (No): No consent prompt for destructive tools; elicitation declared but unused. Searched confirm/elicit.
Approval for PIE with Blueprint errors (No): StartPIE only checks editor and running session; no Blueprint error check or approval step.
|
PartialPer-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. |
PartialPer-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. |
PartialPer-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. | PartialMulti-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.
|
YesMulti-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.
|
PartialMulti-editor targeting (Partial): One server per editor; port set via -ModelContextProtocolPort=N. No instance discovery or routing.
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.
|
PartialMulti-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.
|
PartialMulti-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. |
PartialMulti-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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Offline capability report | PartialWiki and registry.json on disk stay readable with editor off; proxy answers tools/list locally; none before first launch. Evidence
|
Yesproject(list_available_actions) says per action whether it runs without an editor (always/editor/unknown). Evidence
|
PartialHeadless commandlet writes tool and toolset names to JSON, meant for analytics hash decoding. Evidence
|
Partialsearch/describe and ue://capability/catalog answer from TS manifest without editor; no dedicated report op. Evidence
|
NoSearched capability/offline report; only a readiness signal file with version, map and MCP port. Evidence
|
PartialOffline monolith_query.exe lists offline-servable namespaces vs live-only ones in usage/error text only. Evidence
|
| Per-client MCP compatibility fixes | PartialCodex .well-known probe answered 404, Gemini httpUrl key, per-client config writers, args sent as a JSON string accepted; no clientInfo adaptation. Evidence
|
YesKeyed on clientInfo: Claude Code progress collapse note, elicitation relay for clients that truncate. Evidence
|
PartialWrites per-client config files for 5 clients; no runtime per-client behaviour; searched clientInfo usage. Evidence
|
PartialAdapts to declared client capabilities with fallback pointers; by design never keys on client name. Evidence |
PartialPer client guide file writer, Gemini array item types, capitalized param fallback; no protocol quirk layer. Evidence
|
YesParses stringified params (Claude Code), no dots in tool names, cached tool list for clients ignoring list_changed. Evidence |
| Progress notifications on long calls | YesEditor streams notifications/progress over SSE when a progressToken is sent; proxy relays frames. Evidence |
Partialnotifications/progress wired, but only editor start and session start report it; bridge calls send none. Evidence
|
YesWith a progressToken, tool calls stream notifications/progress heartbeats every 1s; counter only, no total. Evidence
|
YesprogressToken honored; bridge progress forwarded as notifications/progress on both transports. Evidence
|
PartialEpic MCP server sends heartbeat progress on any call with progressToken; VibeUE emits none itself. Evidence
|
NoSearched notifications/progress, progressToken in server and both proxies: none; long jobs use poll actions. Evidence
|
| Per-operation docs generated to disk | YesOne markdown page per namespace and per operation regenerated at editor startup, about 1500 pages. Evidence
|
PartialBuild script writes a single docs/tool-reference.md; no per-action files at runtime; describe_action on demand. Evidence
|
NoNo per-tool doc files; only disk writes are client configs and the hash mapping JSON; docs come via describe_toolset. Evidence
|
PartialOne generated repo doc table of all capabilities; no per-operation pages written at runtime. Evidence
|
NoNo generator; skills and Help pages are hand written markdown, GenerateAgentConfig copies one static guide. Evidence
|
PartialShipped curated Docs/API_REFERENCE.md, not generated per operation; live schema via describe_query action_schema. Evidence
|
| Oversized results spilled to a file | YesResults over a character threshold are written to a file and the response points to it. Evidence
|
PartialNo automatic spill; some actions take an opt-in outputPath (read_datatable, bulk_read_properties). Evidence
|
NoSearched truncat, too large, spill; read_file errors above 80 KB and suggests a script instead. Evidence
|
NoOversized results refused with RESULT_TOO_LARGE; only a few ops take an explicit outputPath. Evidence
|
PartialTerrain water features saves full JSON to file and returns a summary; Python runs logged to Saved for recovery. Evidence |
PartialNo automatic spill; a few actions take opt-in output_path to write results to disk. Evidence
|
| MCP resources, prompts and completions | NoOnly initialize, ping, tools/list, tools/call handled; searched resources/, prompts/, completion/: none. Evidence |
Noindex.ts registers tools only; searched for registerResource, registerPrompt, completion handlers, none found. Evidence |
Partialresources/list and read exist but no provider ships, so list is empty; no prompts or completion methods. Evidence
|
YesResources plus templates, six workflow prompts, completion/complete on stdio and native transports. Evidence |
NoNo AddResourceProvider, prompts or completions; skills are served as tools via Epic AgentSkillToolset. Evidence
|
NoOnly initialize, tools/list, tools/call, ping handled; searched resources/, prompts/, completion/complete: none. Evidence |
| Live scripting-API introspection | YesReflection class search and inspect, Blueprint callable API index/search, console variable search. Evidence |
YesLive UE reflection: reflect_class/struct/enum/instance, list_classes, editor(list_function_libraries). Evidence |
PartialUObject reflection tools (get_class, list_properties, search_subclasses); no Python API or function introspection. Evidence
|
Yesdescribe_reflected_api lists live UFunctions of a class from the installed build. Evidence
|
Yesdiscover_python_module, discover_python_class, discover_python_function, list_python_subsystems tools. Evidence |
Partialdescribe.schema walks live UProperty reflection; cppreflect UFUNCTION lists come from index; Python via run_python. Evidence |
| Did-you-mean suggestions for unknown names | YesUnknown method and wiki path misses return ranked Did you mean suggestions. Evidence |
YesUnknown actions refused with closest names; describe_action and reflect_class also list close matches. Evidence
|
PartialUnknown toolset in describe_toolset lists all toolset names; no fuzzy match; searched difflib, did you mean. Evidence
|
YesclosestMatches suggestions for unknown capability, tool and action, with nextCall. Evidence |
PartialDid you mean hints only for UMG slot property names; MetaSound fuzzy pin names; unknown tools get plain not found. Evidence |
YesTop 3 fuzzy suggestions for unknown namespaces and actions on dispatch errors, also offline CLI. Evidence |
| Read-only / destructive tool annotations | NoSearched readOnlyHint, destructiveHint, annotations; tool descriptor has none, bMutating is internal. Evidence |
PartialNo MCP readOnlyHint or destructiveHint set; per action read/mutate class only via project(describe_action). Evidence
|
Notools/list emits only name, description, inputSchema, outputSchema; searched readOnlyHint, destructiveHint. Evidence
|
PartialNo MCP readOnlyHint/destructiveHint; each capability declares effect read/write/destructive plus consent. Evidence
|
NoSearched readOnlyHint/destructiveHint/annotations; adapter sets only name, description, input schema. Evidence
|
Yestools/list emits readOnlyHint, destructiveHint, idempotentHint annotations per tool. Evidence |
| Batch many calls in one sandboxed script | Partialpython.execute runs a multi-step script with no sandbox; per-op batch verbs like actor.spawn_batch. Evidence
|
Partialflow(run) runs named YAML flows, not a sandbox; execute_tool_script via wrapped Epic toolset, UE 5.8 only. Evidence
|
Yesexecute_tool_script runs Python calling other tools, import allowlist, restricted open, undo on failure. Evidence
|
PartialNo sandboxed multi-call script; only unsandboxed execute_python (explicit consent) and per-domain batch ops. Evidence
|
Partialexecute_python_code batches calls in one script; only pattern guards (input, modal, while True), no sandbox. Evidence
|
PartialPer-domain batch_execute (blueprint, niagara, mesh, animation) in one transaction; no sandboxed script. Evidence |
| Tool-set selection (context modes, per-category toggles)Chooses which tools the client sees, from a single gateway tool to per-category switches. | PartialSelectable 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. |
YesSelectable 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. |
YesSelectable context modes (incl. single gateway) (Yes): bEnableToolSearch (default on) exposes only list_toolsets, describe_toolset, call_tool; off registers all tools.
Per-category enable/disable (Yes): Toolset and tool allow/block lists with substring or regex patterns; each toolset is also its own plugin.
|
PartialSelectable 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.
|
PartialSelectable 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.
|
PartialSelectable 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. | PartialResult 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. |
YesResult 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. |
PartialResult field selection (select/omit) (No): No select/omit param on results; searched fields/select/omit. Only object.get_properties takes a name list.
Cursor pagination on large reads (Partial): Cursor paging only on tools/list and resources/list, off by default (PaginationPageSize=0); tool reads unpaged.
|
PartialResult 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).
|
PartialResult 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.
|
YesResult 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Per-project engine selection | Yeseditor_start resolves the project's EngineAssociation to its engine root; PINWRIGHT_ENGINE_ROOT override. Evidence
|
YesselectEngine resolves per project: editor.path/buildToolPath config, EngineAssociation, registry, last launch. Evidence
|
n/aServer is compiled into the engine that runs the editor, so there is no separate engine to select. Evidence
|
PartialUBT lookup only: UE_ENGINE_PATH or .uproject EngineAssociation version against hardcoded roots. Evidence
|
PartialOnly the build/launch script resolves engine from .uproject EngineAssociation or -UnrealEnginePath. Evidence
|
n/aServer is embedded in whichever editor loads the plugin; it never launches an editor or picks an engine. Evidence |
| Layered config cascade (global to local) | PartialRelies on UE ini layering (project Editor.ini, per user per project settings); no global PinWright config file. Evidence
|
YesDeep merged stack: ~/.ue-mcp/config.yml, ue-mcp.yml, ue-mcp.{env}.yml, ue-mcp.local.yml, env vars. Evidence
|
PartialUses stock UE ini layering (EditorPerProjectUserSettings) plus a command line port override; no MCP cascade. Evidence
|
NoOne .env loaded, first hit wins (MCP_ENV_FILE, package root, cwd); env vars override; no merged layers. Evidence |
NoGlobal API key setting plus separate project Saved/Config/VibeUE.ini for disabled tools; no layering. Evidence
|
NoOne UDeveloperSettings in project Monolith ini plus MONOLITH_URL env; no global to local cascade of its own. Evidence
|
| Zero-config unique port per project | YesbAutoDerivePort defaults on: port derived from project path hash, published to Saved/PinWright/gateway-port. Evidence
|
YesSHA1 of project root mapped into 49152-65535 by server and C++ bridge; bound port published to port.json. Evidence |
NoFixed default port 8000 for every project; manual override via setting or -ModelContextProtocolPort. Evidence
|
NoDefault ports 8090,8091 for all projects; per project needs ListenPorts in project ini, read by server. Evidence |
NoUses Epic's default port 8000; override only via -ModelContextProtocolPort; code documents port fights. Evidence
|
NoFixed default port 9316, changed only by editing ServerPort setting; no per project port derivation found. Evidence |
| Machine-wide editor census with launch reason | Yeseditor_list lists every Unreal editor on the machine, any project or engine, with mode, map, log, port, launch reason and launching tool. Evidence
|
PartialEnumerates all editors internally, but tools report only the loaded project's (pid, command line); no launch reason. Evidence
|
NoNo process enumeration; searched Win32_Process, FProcEnumerator, EnumProcesses, /proc. Evidence
|
NoNo process enumeration or launch reason; searched Win32_Process, FProcEnumerator, EnumProcesses, /proc. Evidence
|
PartialPer-PID readiness files list this project's VibeUE editors with port and map; no machine-wide census or launch reason. Evidence
|
NoOnly 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. | NoRuntime project switch (No): Proxy is bound at launch to one project via --port-file/--uproject; no RPC or proxy tool switches project.
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.
|
YesRuntime 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.
|
NoRuntime project switch (No): Server runs inside one editor and serves only its project; searched for project switch/open tools, none.
Add/drop editors at runtime (No): No hub or proxy; one server per editor process, each added by hand to the client config.
|
NoRuntime 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.
|
NoRuntime 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.
|
NoRuntime 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Timed-out calls report an unknown outcome instead of retrying | PartialGeneric TIMEOUT has no outcome unknown flag and work commits; job tickets and idempotent verbs mitigate. Evidence
|
YesTimeout error carries outcome unknown plus operationId; late editor replies are reconciled in abandonedCalls. Evidence
|
NoNo server-side tool timeout or outcome-unknown status; searched timeout in MCP server and registry. Evidence
|
PartialTimeout sends cancel_request that drops queued work; error says timed out, no outcome unknown flag. Evidence
|
PartialPython runs only: run_id result persisted, recover lost result via vibeue.last_python_result() not rerun. Evidence
|
No30s proxy timeout is reported as 'Editor not running, try again'; outcome unknown not signalled. Evidence
|
| Out-of-process engine state probe | YesStdio proxy pings before each call and classifies alive, not_ready, unresponsive, modal, stale, not_running. Evidence
|
Yeseditor(get_engine_state) reads process table, editor log, plugin status.json writer thread, native windows. Evidence
|
NoOnly an in-editor HTTP endpoint; no external process probes engine state. Searched server and toolsets. Evidence
|
Partialue://health reads plugin session snapshot files from disk; bridge counters, last request, pid, no editor state. Evidence
|
YesBackground thread writes Saved/VibeUE/Signals health JSON every 5s with game thread stall seconds. Evidence |
PartialProxy polls plugin HTTP /health every 5s but uses it only as up/down; no process or loading-state probe. Evidence
|
| Asset registry health diagnostics | NoSearched wiki and Source for asset registry scan state or health verbs; IsLoadingAssets used only internally. Evidence
|
Yesasset diagnose_registry compares disk vs AssetRegistry and counts ghost entries. Evidence |
NoSearched IsLoadingAssets, WaitForCompletion, registry status; tools only query assets and tags. Evidence
|
Partialvalidate_assets, fixup_redirectors, ASSET_REGISTRY_SCANNING refusal; no registry health report. Evidence
|
NoSearched asset registry status, IsLoadingAssets, redirector and broken reference diagnostics; none. Evidence
|
Partialproject refresh_assets forces a registry rescan and lists missing files; no registry health or scan-state report. Evidence
|
| Client session survives editor restarts | YesStdio proxy owns the client session, follows gateway-port file; HTTP endpoint is stateless. Evidence
|
YesMCP server is a separate Node process; background reconnect loop and ensureConnected on each call. Evidence
|
PartialSessions are in memory; after restart server returns 404 and relies on client reinitialize per spec. Evidence
|
YesTS stdio server outlives editor and lazily reconnects on each call via ensureConnected. Evidence |
NoNo client proxy; clients hit Epic HTTP endpoint directly. Searched reconnect, session id; skill says restart client. Evidence |
YesStdio proxy stays up across editor restarts, polls health and sends tools/list_changed. Evidence
|
| Client cancellation drops queued editor requests | NoNo notifications/cancelled handling or disconnect cancel in transport or proxy; proxy only stops relaying. Evidence
|
NoSearched cancel, notifications/cancelled, AbortSignal in dispatch and bridge: none; only timeout abandons work. Evidence
|
Partialnotifications/cancelled drops the reply; only async action tools abort, toolset tools keep running. Evidence
|
YesMCP cancel forwards cancel_request; plugin removes queued requests, in-flight ones run to completion. Evidence
|
NoTool adapter ignores request id; searched cancel, notifications/cancelled, queue in bridge. Evidence
|
NoProxy stdin loop is synchronous; notifications/cancelled is forwarded and the server ignores it. Evidence
|
| Job registry (list, status, cancel) | Yessystem.job_list, job_status and job_cancel over wait:false tickets; cancel errors JOB_CANCEL_UNSUPPORTED when the verb cannot stop. Evidence
|
PartialPer-feature status only: get_standalone_status, get_trace_status, get_build_status, stop_standalone; no job ids or list. Evidence
|
PartialNo job registry; notifications/cancelled calls CancelAsync on an in-flight tool; test toolset has GetTestStatus and StopTests. Evidence
|
PartialMCP tasks list/get/cancel cover only read-only search and describe, which finish before the reply; cancel only sets a status. Evidence
|
PartialRunScenario returns an id polled by GetScenario and ended by CancelScenario; PIE scenarios only, no general job list. Evidence
|
PartialPer-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. | YesHung 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.
|
YesHung 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.
|
NoHung 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.
Editor-ready signal with port-conflict check (No): No ready signal or port check; bind failure is only an engine HttpListener log line.
|
PartialHung 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.
|
PartialHung 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.
|
PartialHung 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. | PartialPlugin/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.
|
YesPlugin/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.
|
PartialPlugin/server parity + stale build detection (Not applicable): Server runs inside the editor process, so no separate server build can drift from the plugin.
Protocol/ABI capability handshake (Partial): Standard MCP initialize negotiates protocol version and checks Mcp-Protocol-Version header; no ABI layer.
|
PartialPlugin/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.
|
PartialPlugin/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.
|
PartialPlugin/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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Credential + identifier scrubbing on outbound text | NoNo scrubbing of keys, tokens or paths in report drafts. Searched scrub, redact, sanitiz, mask, secret. Evidence
|
YesCredential scrub and privacy scrub of paths, project name and username run on feedback text before posting. Evidence
|
PartialAnalytics hash tool and toolset names with Blake3; no credential or free text scrubbing found. Evidence
|
YesSecret masking on receipts and envelopes; plugin redacts host paths and UserId/AccountId/LoginId keys. Evidence
|
NoNo outbound text scrubbing; only key-based [REDACTED] masking of run metadata in the local workflow journal. Evidence
|
NoNo outbound report text; searched scrub, redact, sanitiz, secret masking in Source, Scripts, Docs: none. Evidence
|
| No telemetry or outbound calls by default | YesNo HTTP client or telemetry code in Source; server binds loopback; proxy host hardcoded to 127.0.0.1. Evidence
|
PartialNo telemetry found, but startup queries registry.npmjs.org for updates by default; UE_MCP_DISABLE_UPDATE_CHECK=1 stops it. Evidence
|
NoToolCall and session events go to FEngineAnalytics by default; cvar ModelContextProtocol.EnableAnalytics=true. Evidence
|
YesNo HTTP client in src; /metrics is loopback and off without MCP_METRICS_PORT; Fab fetches only on Fab actions. Evidence
|
YesNo telemetry; HTTP requests only inside on demand tools (deep_research, terrain data, Fab). Evidence |
YesNo 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. | PartialAuto-filed tool-gap feedback (Partial): Internal RPC errors auto-append a report hint; support page drafts a prefilled issue. User submits, never auto filed.
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.
|
YesAuto-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.
|
NoAuto-filed tool-gap feedback (No): No gap reporting tool; searched feedback/report_issue/missing tool. Only usage analytics exist.
Deferred report review queue (No): Searched MCP, ToolsetRegistry, Toolsets for feedback, bug report, issue queue; none found.
Issue-to-PR automation (No): Searched for pull request, github, issue automation in all MCP and Toolsets sources; none found.
|
NoAuto-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.
|
NoAuto-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.
Issue-to-PR automation (No): No issue or PR automation; .github holds only FUNDING.yml, no gh or GitHub API calls in Source.
|
NoAuto-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.
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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Typed Project Settings edit with schema | PartialTyped checked edit for Renderer and Physics settings only; rejects unknown or non-config props; no schema list. Evidence
|
Partialepic_get_section_schema and epic_set_section_properties via wrapped Epic toolset, UE 5.8 only. Evidence
|
YesConfigSettingsToolset lists container/category/section, returns JSON Schema, sets values from JSON. Evidence
|
PartialValues parsed into typed UProperty via ImportText with INVALID_VALUE errors; schema is only section/key/value strings. Evidence
|
PartialOwn code only lists settings classes and property counts; typed get/set_setting via Epic toolset. Evidence
|
Partialset_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. | PartialResolve 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.
|
PartialResolve 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.
|
PartialResolve any INI key across layers (Partial): Effective value only for settings section properties plus SearchCVars; no raw keys, no per layer attribution.
Diff project INI vs engine defaults (No): Searched Toolsets, ToolsetRegistry, MCP for config diff; schema has no defaults; only ResetSectionToDefaults.
|
PartialResolve 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.
|
PartialResolve 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. |
YesResolve 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Full-text asset search | Partialasset.search does substring/wildcard name match over the Asset Registry; no FTS5 or full-text index found. Evidence |
Partialsearch_fts is a linear token-scored scan of the asset registry, not an SQLite FTS5 index. Evidence
|
PartialNo FTS index; find_assets does substring name, class and tag filtering over the Asset Registry. Evidence
|
Partialsearch_assets filters asset registry by class/path plus case-insensitive name substring; no FTS index. Evidence
|
PartialNo FTS5 or SQLite index in VibeUE; asset search only via Epic toolset AssetTools.find_assets. Evidence
|
Yesproject.search runs FTS5 queries over the SQLite asset index, with an asset_class filter. Evidence
|
| Find references | Yesasset.references gives dependencies and referencers; asset.dependencies; get_asset_graph BFS, classified deps. Evidence
|
Yesasset get_referencers and get_dependencies over the asset registry. Evidence
|
Yesget_referencers and get_dependencies tools query the Asset Registry. Evidence
|
PartialGateway exposes dependencies and struct-only usage search; generic get_asset_references is not in the catalog. Evidence
|
PartialVia Epic toolset AssetTools.get_referencers; own code only returns referencers from unattended delete. Evidence
|
Yesproject.find_references lists referencers and dependencies of an asset. Evidence
|
| Asset CRUD (move/rename/delete) | Yesasset.move, rename, delete, duplicate, bulk_rename, bulk_delete, fixup_redirectors with readback. Evidence |
Yesrename, bulk_rename, move, move_folder, delete, delete_batch, duplicate. Evidence
|
Yesmove (rename), duplicate, delete, create_folder tools for assets and folders. Evidence
|
Yesmove, rename, duplicate, delete, bulk_delete, bulk_rename; destructive ones require elevated consent. Evidence
|
YesOwn dialog-free DeleteAssetUnattended and bulk asset_move (rename); duplicate via Epic AssetTools. Evidence
|
PartialRename with fixup (batch_rename_assets) and delete_assets exist; renames are name only, no move to another folder. Evidence
|
| DataTable row CRUD | Yesdata_table.create, add_row, set_row, remove_row, list_rows, set_row_struct with save reporting. Evidence
|
Yesadd/set/update/get/remove/rename datatable row actions. Evidence
|
YesDataTable create, add_rows, remove_rows, rename_rows, get_rows, set_rows, get_schema. Evidence
|
Yesadd, update, get, list, delete, clear and bulk import of DataTable rows, plus create table and row struct. Evidence
|
PartialDataTableService was cut; row CRUD via Epic toolset DataTableTools. Evidence
|
YesBulk upsert, remove, rename, duplicate rows plus JSON/CSV export and import. Evidence
|
| Structured asset diff | Yesasset.dump diff=true writes per-aspect unified diffs of text sidecars against the baseline mirror. Evidence |
Partialdiff covers only Blueprint, Skeleton and SkeletalMesh; other asset classes report unsupported. Evidence
|
NoSearched diff in toolset tool definitions; only unrelated comments, no asset diff tool. Evidence
|
Partialcompare_structs diffs two user structs only; no general asset diff. Searched diff, compare_assets. Evidence
|
PartialType specific pair diffs only: DiffBlueprints, CompareMaterialGraphs, Niagara CompareSystems. Evidence
|
YesPer type structured diffs: compare_blueprints, niagara.diff_systems, compare_meshes, compare_behavior_trees. Evidence |
| Content hygiene audit + fix | PartialPer-domain audits (static meshes, level, Niagara orphans, BP orphans) plus redirector fixup; no project-wide sweep. Evidence |
Yesaudit_hygiene (unreferenced, broken refs, duplicates, naming, redirectors) plus bulk_fix_hygiene. Evidence
|
NoSearched DataValidation, validator, unused, redirector, fixup; no audit or fix tool found. Evidence
|
Partialvalidate, validate_assets, generate_report and fixup_redirectors; no unused or naming audit with auto fix. Evidence
|
PartialBulk cleanup_review is report only, never fixes; unused detection needs separate GameIQ plugin. Evidence |
PartialRead-only audits (orphans, naming, unused audio); fixes need separate rename or delete calls. Evidence
|
| Migrate assets to another project | PartialNo migrate operation (searched migrat, MigratePackages); reachable only via python.execute escape hatch. Evidence |
Yesasset migrate copies assets and dependencies into another project's Content dir, dryRun supported. Evidence |
NoSearched migrat in Toolsets, ToolsetRegistry, ModelContextProtocol; no migrate tool. Evidence
|
Nomigrate_assets only copies from allowlisted roots (templates, Fab, Megascans) into the current project. Evidence |
NoSearched Migrat in Source and Skills; no asset migration to another project. Evidence
|
NoSearched Migrate, MigratePackages and migrate actions; only index DB schema and UI settings hits. Evidence
|
| Bulk create-or-update of data assets in one transaction | PartialNo batch data-asset upsert op found; per-object property.set or python.execute only, not atomic. Evidence |
Yesbulk_upsert_data_assets validates all items on transient copies before writing up to 500 assets. Evidence |
Partialdata_asset.create plus object.set_properties; execute_tool_script batches calls but is not transactional. Evidence
|
Partialimport_data_table_rows validates all rows before mutating one DataTable; no bulk UDataAsset upsert. Evidence
|
NoSearched upsert and data asset bulk ops; DataAssetService cut, bulk plan has no data asset op. Evidence
|
Partialseed_data_asset creates and fills one asset with dry_run; no multi asset atomic upsert batch. Evidence
|
| CurveTable / StringTable authoring | PartialNo CurveTable or StringTable ops (searched UCurveTable, UStringTable); only via python.execute. Evidence |
YesCurveTable create/import/rows/keys and StringTable create/entries/CSV import actions. Evidence
|
YesCurveTable create, rows and keys editing; StringTable create, set_entry, remove_entry. Evidence
|
NoSearched stringtable, UStringTable, curvetable, UCurveTable: only widget text bindings reference string tables. Evidence
|
PartialNo own code; via Epic toolset CurveTableTools and StringTableTools. Evidence
|
YesCurve keys and rows, StringTable entries editable; no create action for these table assets found. Evidence
|
| User enum / struct authoring | Yesblueprint.create_enum, set_enum_entries, create_struct, add/remove_struct_field, set_struct_field_default. Evidence
|
Yescreate/edit user defined enum and struct, rename_struct_field. Evidence
|
NoSearched UserDefinedEnum, UserDefinedStruct, factories; only a name resolution helper, no authoring tools. Evidence
|
YesUserDefinedEnum and UserDefinedStruct create, member edit, rename, reorder, delete. Evidence
|
YesEnumStructService creates and edits user enums and structs (values, properties, types, defaults). Evidence |
Yescreate_user_defined_enum, create_user_defined_struct, plus add/remove/rename/retype struct fields. Evidence
|
| UV inspection and editing | YesDedicated UV edit ops plus static mesh round trip; inspection limited to channel counts and hasUVs. Evidence
|
Yesread_uv_channels, check_uvs, unwrap_uvs, transform_uvs, lightmap UVs, export_uv_layout. Evidence |
NoSearched uv, UVChannel, lightmap in toolsets; only an internal uv_channel_data copy, no UV tool. Evidence
|
PartialUV ops only on DynamicMesh actors, needs GeometryScripting plugin; no UV inspection op. Evidence |
YesUVMappingService: channel list/health, add/copy, unwrap, pack, transform, islands, layout image. Evidence
|
Partialget_mesh_uvs inspects always; compute_uvs needs GeometryScripting plugin and is compiled out of release builds. Evidence
|
| Asset export to files | PartialType-specific exports only: level.export T3D, actor.export, geometry.export_obj/stl, sequencer.export_fbx. Evidence |
Yesasset export via engine exporters (PNG, FBX, etc.) plus export_texture. Evidence
|
PartialOnly Sequencer FBX export of level sequence bindings; no generic asset export tool. Evidence
|
PartialExposed: export_level, export_struct, export_heightmap, actor export; export_asset handler not in catalog. Evidence |
PartialTexture, heightmap, weightmap and UV layout image export only; no generic mesh or FBX export. Evidence
|
Yesmesh.export_mesh writes static or skeletal mesh to FBX on disk. Evidence |
| Offline greppable text mirror of assets | Yesasset.dump_folder writes a text mirror (properties.json, bpir.txt, tree.xml, mgir.txt) meant for grep and git. Evidence |
Partialblueprint export_batch writes per Blueprint JSON/T3D to Saved; Blueprints only, one shot, no sync. Evidence
|
NoSearched for asset dump or text mirror tools; none, assets are read live via tools only. Evidence
|
NoNo on-disk text dump of assets found; searched mirror, dump, asset export to text cache. Evidence
|
NoNo on-disk text mirror; only per-call JSON exports like ExportMaterialGraph and ExportAnimationToJson. Evidence |
Partialproject.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 | NoNo asset op (rename, move, duplicate, delete, fixup) offers a dry run; preflight only refuses bad batches. Evidence
|
Partialbulk_fix_hygiene dryRun defaults true for naming and unreferenced fixes; bulk_rename has no dry run. Evidence
|
NoSearched dry_run, DryRun, validate_only, preview; no preview or dry run mode for bulk changes. Evidence
|
NoGateway refuses options.preview for all capabilities; only migrate_assets has dryRun, not a refactor. Evidence
|
YesRunBulkMaintenance defaults to dry run, path scoped, rollback per target, resumable report. Evidence |
PartialPer 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 | Yessource_control.revert reloads reverted packages, reports stale ones and refuses loaded maps; source_control.log returns per-file history. Evidence
|
PartialNo revert or history op; only via execute_python (gated) calling SourceControl.revert_and_reload_packages; history is not script exposed. Evidence
|
NoOnly can_edit_asset, is_checked_out and checkout on write; searched toolsets for revert and history: none; no Python escape hatch. Evidence
|
Partialsource_control has checkout, submit, enable, init, commit_all; revert only via execute_python calling SourceControl.revert_and_reload_packages; no history. Evidence
|
PartialNo revert or history op; only via execute_python_code calling SourceControl.revert_and_reload_packages; history is not script exposed. Evidence
|
PartialNo revert or history op; only via editor.run_python calling SourceControl.revert_and_reload_packages; git mining is churn stats only. Evidence
|
| Import and reimport (mesh, texture, anim)Imports source files, authors import pipelines, and detects changed source textures. | PartialImport 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. |
YesImport 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. |
PartialImport mesh / texture / anim (Yes): import_file tools for static mesh, skeletal mesh (with import_animations flag) and texture.
Import pipeline assets (No): Searched InterchangePipeline, pipeline asset tools; none, import_asset only takes factory and options.
Texture change detection (No): Searched reimport, source file change, texture tools; texture toolset has only import_file and get_size.
|
PartialImport 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.
|
PartialImport 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.
|
PartialImport 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. | PartialSource 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.
|
PartialSource 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.
|
PartialSource control (Perforce) integration (Partial): Generic SC state queries only (can_edit_asset, is_checked_out); no Perforce submit, revert or sync tools.
Provider-agnostic source control (incl. Git) (Partial): Only is_checked_out, can_edit_asset and silent checkout via engine SourceControl; no submit, revert, history.
Checkout-on-write guard (Partial): Auto checkout in write_file and plugin descriptor edits; config set refuses unchecked ini; not a global guard.
|
PartialSource 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.
|
PartialSource 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.
|
PartialSource 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.
|
| Fab / marketplace asset search and importSearches Fab or other marketplaces and imports assets. | NoFree marketplace asset search and import (No): Searched fab, marketplace, quixel, megascan in wiki and Source; no marketplace search or import.
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.
|
PartialFree 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.
|
NoFree marketplace asset search and import (No): Searched Fab, marketplace; only a MarketplaceURL field in plugin descriptor info.
Fab library import (No): Searched Fab across ModelContextProtocol, ToolsetRegistry and Toolsets; no Fab import tool.
Fab in-editor browser integration (No): Searched for fab across Toolsets, MCP and ToolsetRegistry; no Fab browser or import tools.
|
YesFree 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.
|
YesFree 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.
|
NoFree 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Place / delete / move actors | Yesactor.spawn, actor.delete, actor.set_transform, actor.nudge are dedicated ops. Evidence |
YesDedicated place_actor, delete_actor, move_actor, plus aim_actor_at; delete refuses ambiguous labels. Evidence
|
Yesadd_to_scene_from_class/asset, remove_from_scene, set_actor_transform; look_at too. Evidence
|
Yescontrol_actor spawn, delete, set_transform, duplicate actions. Evidence
|
PartialEditor spawn/destroy/move via Epic toolset (SceneTools, ActorTools); own PIEActorService spawns in PIE only. Evidence |
Yesmesh.spawn_actor, mesh.move_actor, mesh.delete_actors and mesh.duplicate_actor. Evidence |
| Actor details / bounds | Yesactor.describe returns identity, components, properties; actor.get_bounding_box returns bounds. Evidence |
Yesget_actor_details (optional UPROPERTY dump) and get_actor_bounds returning AABB origin and extent. Evidence
|
Yesget_actor_bounds, get_actor_transform, get_components, get_properties; find_actors filters by AABB. Evidence
|
Yesget_actor_bounds/get_bounding_box, inspect_object get_actor_details, get_transform. Evidence
|
YesActorService.GetAllProperties dumps all actor properties; CalculateActorView returns bounds center/extent. Evidence
|
Yesmesh.get_actor_info returns class, transform, components, bounds; also get_scene_bounds. Evidence
|
| Bulk batch spawn / translate | Yesactor.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 |
Yesplace_actors_batch, spawn_actors_batch (instances, components, along spline), spawn_grid, batch_translate. Evidence
|
PartialNo bulk op; execute_tool_script batches single spawn/transform calls in a sandboxed script. Evidence
|
Yesspawn_batch up to 500 items; set_transform accepts an actors array up to 500. Evidence
|
PartialNo batch actor spawn/translate op; only via execute_python_code or Epic ProgrammaticToolset scripts. Evidence |
YesBatch blockout spawn, batch BP spawn, batch_execute of 200 ops in one undo, align and randomize. Evidence
|
| Line trace / snap to floor | Yesspatial.raycast multiHit peeling, actor/class filters (filteredOut), faceIndex, renderGeometryHit; ground_actors snaps; verify_grounding provenance. Evidence
|
Yesline_trace, bulk_line_trace, snap_actor_to_floor, snap_instances_to_surface for HISM instances. Evidence
|
Yestrace_world returns hit distance; snap_to_ground flag on spawn only, no standalone snap. Evidence
|
PartialNo line trace or snap op; foliage paint has snapToSurface, placement check traces ground. Evidence |
PartialBatchLineTrace and BatchLineTraceGrid exist in LandscapeService; no snap-to-floor operation. Evidence
|
Yesquery_raycast, query_multi_raycast, snap_to_floor and snap_to_surface. Evidence |
| Level CRUD | Yeslevel.create, load, save, save_as, duplicate, rename, delete, list. Evidence |
Yeslevel create, load, save, list, get_current; no level delete action, asset deletion is separate. Evidence
|
Partialload_level, get_current_level; save/duplicate/delete via generic asset tools; no create new level. Evidence
|
Yesmanage_level create, load, save, save_as, duplicate, rename, delete, list, export, import. Evidence
|
PartialLoad/current level via Epic toolset SceneTools; new/save level only as documented Python recipes. Evidence |
Yescreate_empty_map, load_level, save_packages; delete through generic editor.delete_assets. Evidence |
| World settings / sublevels | PartialSublevels dedicated (level.add_sublevel, level.stream); world settings only via property.set or dump. Evidence
|
Yesget/set_world_settings (game mode, killZ, gravity) plus add/remove/list streaming sublevels and props. Evidence |
PartialNo world settings or sublevel tools; WorldSettings reachable only via raw set_properties. Evidence
|
Yesmanage_level set_world_settings, add_sublevel, stream; inspect get_world_settings. Evidence
|
PartialNo world settings or sublevel operation or doc; reachable only through execute_python_code. Evidence
|
PartialSublevel 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. | Yeslevel.build_lighting, lighting.build_lighting and level.build_all. Evidence |
Partialbuild_lighting only runs the BUILD LIGHTING console command and returns triggered; no completion or results. Evidence
|
NoSearched build_light, BuildLighting, LightingBuild, console exec in all toolsets; none found. Evidence
|
Yesbuild_environment.build_lighting and manage_level.build_lighting, plus lightmass config. Evidence |
PartialNo lighting build op; only via Python LevelEditorSubsystem.BuildLightMaps in the engine. Evidence
|
PartialNo build lighting action (searched BuildLighting, FEditorBuildUtils); only via editor.run_python. Evidence |
| Spline editing | Yesspline namespace: add/remove points, tangents, type, spline meshes; blueprint.scs.set_spline_points edits Blueprint templates. Evidence |
Yesget_spline_info and set_spline_points with typed points, tangents, closed loop, undo transaction. Evidence
|
PartialPCGToolset DrawSpline asks the user to draw a spline in the viewport; no point-level spline editing. Evidence
|
Yesedit_spline add/set point position, rotation, scale, tangents, type; remove_spline_point. Evidence |
PartialLandscape spline point/segment CRUD only; no SplineComponent editing API. Evidence
|
Partialplace_spline creates a spline actor with points and mesh segments; no edit of existing splines. Evidence |
| Instanced mesh (HISM) instance CRUD | PartialISM/HISM read and batch transform update; add/remove instances only for foliage actors. Evidence |
Yesadd_hismc_instances, get_instance_transforms, update_instance_transform, remove_instance. Evidence |
PartialNo instance tools; add_component an ISM then raw set_properties on its editable PerInstanceSMData array. Evidence
|
PartialOnly foliage instances: add, get, remove; no generic ISM/HISM component instance ops found. Evidence
|
PartialFoliage instance add, query and remove only; no generic ISM or HISM component instance CRUD. Evidence
|
Partialconvert_to_hism builds a HISM from actors; no add/remove/update of single instances. Evidence |
| Actor motion telemetry | Partialrecorder reads PIE series only after host C++ LogVariable calls; sequencer.measure_motion covers tracks. Evidence |
Yesread_actor_motion snapshots location, velocity, angular velocity, grounded; caller must loop to sample. Evidence |
NoSearched velocity, telemetry in toolsets; only PIE start/stop and transform reads exist. Evidence
|
NoSearched velocity, telemetry, sample; inspect.runtime_report gives one PIE snapshot, no sampling. Evidence |
NoSearched Source and Skills for velocity, telemetry, trajectory; scenario runner has asserts, no sampling. Evidence
|
YesPIE time series sampling of dotted member paths on an actor, with input provocations. Evidence
|
| Weather and time-of-day systems | PartialTime of day via environment.control.set_time_of_day (sun rotation); searched weather, rain, snow: no ops. Evidence |
PartialNo weather or time of day system; only directional light rotation as sun angle via set_light_properties. Evidence
|
PartialNo weather or time-of-day system; lighting skill documents sun pitch and sunset values only. Evidence
|
Yescreate_weather_system, configure_weather (rain, snow, lightning, wind), time of day system. Evidence |
NoSearched Source and Skills for TimeOfDay, SunPosition, weather; only a level template name found. Evidence
|
NoSearched TimeOfDay, weather, SkyAtmosphere, VolumetricCloud in Source; no matches in level code. Evidence
|
| Level-wide placement defect sweep | Yeslevel.audit sweeps all actors for bad scale, missing mesh, floating, underground, duplicates. Evidence |
PartialNo sweep action; reads MapCheck via editor get_message_log and pairwise test_component_overlap only. Evidence
|
NoSearched for floating, overlap, or placement validation sweeps; none. Only find_actors overlap filter. Evidence
|
Yescontrol_actor.audit_placement sweeps all actors for overlap, sunk, floating, tilted. Evidence |
NoSearched for floating, overlap, interpenetration, placement validation of level actors; none found. Evidence
|
PartialNo level-wide sweep; validate_building checks procedural buildings, validate_interactive_reach checks interactables. Evidence
|
| Gameplay volume authoring (trigger, kill-Z, nav) | Yesvolume.create_trigger_volume, create_kill_z_volume, create_nav_mesh_bounds_volume and more. Evidence |
Yesspawn_volume: trigger, blocking, pain, navmesh bounds, post process, audio, cull; killZ via set_world_settings. Evidence |
PartialNo volume tools; volume classes spawn via generic add_to_scene_from_class, no brush shaping. Evidence
|
Yescreate_volume: trigger, blocking, kill Z, pain, physics, nav mesh bounds, nav modifier and more. Evidence
|
PartialNo volume ops; skill notes volumes spawn via Python spawn_actor_from_class or Epic SceneTools. Evidence
|
Yesspawn_volume covers trigger, blocking, kill, pain, nav_modifier; nav bounds via ai namespace. Evidence
|
| Data layers, level instances, packed actors | Yeslevel.structure.create_data_layer, create_level_instance, create_packed_level_actor. Evidence |
PartialLevel instances via wrapped Epic toolset, UE 5.8 only; data layers read only; no packed level actors. Evidence
|
PartialLevel instances: create, edit, commit. No data layer or packed level actor tools. Evidence
|
Yescreate_data_layer, assign_actor_to_data_layer, create_level_instance, create_packed_level_actor. Evidence |
PartialNo data layer, level instance or packed actor ops; only engine subsystems via execute_python_code. Evidence |
Partialcreate_prefab makes LevelInstance or PackedLevelActor (opens Save As dialog); no data layer support. Evidence
|
| Merge actors into a single mesh | Yesperformance.merge_actors merges 2+ static mesh actors into one mesh, optional source replace. Evidence |
Partialepic_merge_actors via wrapped Epic toolset, UE 5.8 only; no native merge handler. Evidence
|
Yesmerge_actors merges StaticMeshActors into one mesh asset, optional source deletion. Evidence
|
Yessystem_control.merge_actors uses IMeshMergeUtilities MergeComponentsToStaticMesh. Evidence |
PartialNo merge op; only via Python calling engine StaticMeshEditorSubsystem.MergeStaticMeshActors. Evidence
|
Yesgenerate_proxy_mesh merges actors into one simplified proxy mesh via IMeshMergeUtilities. Evidence
|
| Gameplay-space analysis (sightlines, chokepoints, pacing) | NoSearched wiki and ops for sightline, line of sight, chokepoint, pacing; only guide prose, no op. Evidence |
NoSearched sightline, chokepoint, line of sight, pacing; only raw line_trace and nav_project_point exist. Evidence
|
NoSearched sightline, chokepoint, pacing, visibility analysis; none. Only single trace_world. Evidence
|
NoSearched sightline, chokepoint, line_of_sight, pacing in src and plugin; only unrelated hits. Evidence |
PartialMap blockout gates check road connectivity and POI spacing on generated plans; no sightline analysis. Evidence |
Yesanalyze_sightlines, analyze_choke_points, analyze_level_pacing_structure, analyze_pacing_curve. Evidence
|
| Blockout volumes with asset replacement | PartialBlocking volumes and geometry primitives exist; no op swaps blockout for final assets. Evidence |
Partialconvert_brushes_to_static_mesh turns BSP blockout into meshes; no replace blockout with chosen asset. Evidence
|
PartialPrimitiveTools add cube/sphere/cylinder/cone components; no blockout volume or asset replacement. Evidence
|
NoSearched blockout, greybox; primitives and blocking volumes exist but no blockout to asset swap. Evidence
|
PartialMaterializePoisAsActors spawns placeholder blockout actors; swapping for final assets is manual. Evidence |
Yessetup_blockout_volume, match_asset_to_blockout and atomic apply_replacement. Evidence
|
| Lighting writes report a scalability-cvar veto | YesSix 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
|
NoLight and fog writes never read r.ShadowQuality, r.VolumetricFog or related cvars back; searched cvar names and CVar in light handlers. Evidence
|
NoNo lighting tools; searched the gating cvar names in Toolsets, ModelContextProtocol and ToolsetRegistry. Evidence
|
NoWrites r.ShadowQuality, r.VolumetricFog and VSM cvars but never reads them back to warn that a light or fog setting is vetoed. Evidence
|
NoNo lighting ops; r.VolumetricFog appears only in an engine-settings skill example, scalability read is generic. Evidence
|
Noplace_light and set_light_properties return no cvar state; searched the gating cvar names. Evidence
|
| Read a map's actors without loading it | Yeslevel.describe_offline parses the .umap for class, world transform, label, tags; OFPA actors by package only. Evidence
|
Nolist_actor_descs reads WP descriptors of the open map only; query with levelPath opens the map first. Evidence
|
NoSearched for umap or package reads; actor queries run on the loaded level after load_level. Evidence
|
Noget_level_info on an unloaded map returns asset registry tags only, no actors; no umap parsing found. Evidence |
NoSearched for umap, package or actor descriptor reads; none. Python would need its own package parser. Evidence
|
NoLevel 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. | YesLighting 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. |
YesLighting 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. |
PartialLighting rig authoring (lights, sky, fog) (Partial): DefaultOutdoorLightingSkill gives sun/sky/fog/cloud rules; actors made with generic spawn and set_properties.
Post-process settings (Partial): No post-process tool; spawn PostProcessVolume and raw set_properties; lighting skill gives guidance.
|
YesLighting 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.
|
PartialLighting 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. |
PartialLighting 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. | PartialWorld 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. |
YesWorld 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. |
NoWorld Partition unloaded actor query (No): Searched WorldPartition, DataLayer, unloaded in toolsets; queries use loaded level actors only.
World Partition rename (No): Searched WorldPartition, world_partition in Toolsets, ToolsetRegistry, MCP source; only binary pdb hits.
|
PartialWorld 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.
|
PartialWorld Partition unloaded actor query (Partial): No own op; only via Python calling engine WorldPartitionBlueprintLibrary.GetActorDescs.
World Partition rename (No): Searched WorldPartition in Source and Skills; only landscape grid and WP save notes, no rename op.
|
NoWorld 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. | YesSet 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. |
YesSet 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.
|
YesSet UPROPERTY (dotted path) (Yes): set_properties takes a JSON object (nested JSON for structs), not a dotted path; reset_properties too.
Actor tags / folders / attach (Yes): add/remove/has/get tags, folder get/set/rename/delete, set_parent_component attaches across actors.
|
YesSet UPROPERTY (dotted path) (Yes): inspect.set_property takes propertyPath; nested path helper splits on dots.
Actor tags / folders / attach (Yes): add_tag/remove_tag/find_by_tag, attach/detach; outliner folder only as a spawn_batch field. |
PartialSet 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. |
PartialSet 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. | NoPer-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.
|
NoPer-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.
|
NoPer-region performance cost analysis (No): Searched perf, stat, draw call, cost tools in toolsets; none. Only SearchCVars.
Lighting coverage analysis and suggestions (No): No coverage analysis; lighting skill gives static lux and exposure rules, not scene analysis.
|
NoPer-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. |
NoPer-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.
|
YesPer-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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Attachment/socket-aware inspection | Yesactor.describe reports per component attachParent, attachSocket and relativeTransform. Evidence |
Yesnudge dryRun reports attach parent, socket, absolute flags, bounds; get_component_tree also. Evidence
|
Partialget_parent_component and get_components report hierarchy; attach socket name not exposed. Evidence
|
Yesinspect.get_component_details returns relative and world transform, attachParent and attachSocket. Evidence |
PartialNo own attach/socket query; Epic get_parent_component has no socket; GetAllProperties raw dump. Evidence
|
Partialget_actor_info omits attach parent; BP component tree lists attach socket, PIE anim query gives socket transforms. Evidence |
| Relative transform between actors | Partialmeasure_distance gives center/pivot distance, edge gap and per axis gap; no relative rotation or transform. Evidence |
Yeslevel(get_relative_transform) actor vs actor by path or label; returns rotator only, no quaternion. Evidence |
PartialNo dedicated tool; computable by composing get_actor_transform calls in execute_tool_script. Evidence
|
NoSearched actor to actor relative transform, GetRelativeTransform, relativeTo; only component to parent. Evidence
|
NoSearched GetRelativeTransform and relative transform in VibeUE and Epic actor/scene toolsets. Evidence
|
Partialget_spatial_relationships gives labels (on_top_of, left_of) and distance; measure_distance; no relative transform. Evidence
|
| Aim actor at target | Yesactor.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
|
Yeslevel(aim_actor_at) at point or actor with roll. Evidence |
Yesactor.look_at rotates an actor to face a world-space point. Evidence
|
NoSearched lookAt, aim, FindLookAtRotation, face target in TS and C++; none found. Evidence
|
PartialVia Epic toolset: ActorTools.look_at; VibeUE skill gives an atan2 Python recipe only. Evidence
|
NoSearched look_at, aim, orient, FindLookAtRotation actions; look-at math only used internally for cameras and decals. Evidence
|
| Viewport pixel hit-test | Yesspatial.raycast_screen deprojects a capture pixel to a world ray and first blocking hit. Evidence |
Yeseditor(hit_test_viewport_pixel) ray from live viewport projection; not for headless captures. Evidence |
PartialScreenCoordsToWorld traces normalized coords and returns hit location only, no actor or component. Evidence
|
NoSearched Deproject, HitProxy, screen to world, pixel pick, line_trace action; none found. Evidence
|
PartialVia Epic toolset: EditorAppToolset.ScreenCoordsToWorld; no Deproject or hit proxy in VibeUE. Evidence
|
NoSearched Deproject, ProjectWorldToScreen, HitProxy across Source; no pixel to world hit test. Evidence
|
| Temporary verification actors (never saved) | PartialNo transient actor spawn verb; effect.draw_debug_shape draws unsaved in-world markers, cleared by a verb. Evidence
|
Yesspawn/list/destroy_transient_actor: RF_Transient, tagged, destroy refuses real actors. Evidence |
NoSearched for transient/non-savable spawn options; spawn tools create normal level actors. Evidence
|
PartialNo transient actor spawn; draw_debug_shape draws timed unsaved markers, clear_debug_shapes flushes them. Evidence
|
PartialPIEActorService spawns RF_Transient actors into PIE worlds only, tracked by handle; none in editor world. Evidence |
Nohighlight_room spawns a normal StaticMeshActor in the level; searched RF_Transient and editor-only flags on actors. Evidence
|
| Component overlap / penetration test | Partialmeasure_overlap gives actor AABB penetration and separating axis, not per component geometry. Evidence |
Yeslevel(test_component_overlap) OBB or AABB bounds with penetration depth; bounds only, not mesh geometry. Evidence |
Partialfind_actors bounds plus collision_channels runs an AABB box overlap; no component penetration test. Evidence
|
PartialPlacement check reports actor AABB overlaps with penetration depth; not per component or collision shape. Evidence
|
PartialNo overlap op; skill documents sweep and line_trace_single Python recipes for collision checks. Evidence
|
Partialquery_overlap tests a box/sphere/capsule at a point; prop placement push-out; no component penetration test. Evidence
|
| Exact actor paths (duplicate labels refused) | YesDuplicate labels refused with AMBIGUOUS_ACTOR_NAME listing candidates; objectPath/actorPath accepted. Evidence
|
YesShared MCPResolveActor: actorPath wins; ambiguous label refused listing candidate paths. Evidence
|
YesActor arguments resolve by full object path (refPath); labels are never used as identifiers. Evidence
|
PartialAccepts label, name or path; first exact label match wins, only build_environment.delete refuses ambiguity. Evidence |
PartialOwn lookup takes first label match then substring match; Epic toolset takes actor object refs. Evidence
|
PartialAmbiguous labels refused with match list; internal FName accepted, but full object paths are not resolved. Evidence
|
| Footprint ground-contact verification | Yesverify_grounding samples footprint columns, reports coverage, contact points and max gap. Evidence |
Partialsnap_actor_to_floor is one center line trace from bounds top, no footprint check; corners need bulk_line_trace. Evidence
|
Partialsnap_to_ground uses one downward trace from bounds center; no footprint contact verification. Evidence
|
PartialOne center line trace flags sunk, floating, unsupported with suggestedZ; not a footprint test. Evidence |
PartialBatchLineTraceGrid gives downward trace grid over a region; no actor footprint check op. Evidence |
Partialsample_terrain_grid and analyze_building_site cover building footprints; actor snaps use one trace. Evidence
|
| Declarative placement assertions | Yesspatial.verify_placement expect{} runs grounded, on actor, noOverlapWith and within checks; returns pass plus per-check detail. Evidence
|
Partialtest_component_overlap covers the no-overlap check for one pair; no grounded, on or within assertion. Evidence
|
Partialfind_actors with bounds lists actors overlapping a box; no grounded, on or containment assertion. Evidence
|
PartialSpawn, transform and placement audit add fixed sunk, floating and overlap warnings; caller cannot state expectations. Evidence
|
NoNo placement check op; searched overlap, within, grounded, intersect in actor services. Evidence
|
Partialget_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. | PartialFrame-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. |
YesFrame-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.
|
PartialFrame-aware transforms (world/actor/parent) (Partial): set_actor_transform takes worldspace or parent-relative; no actor-local frame option.
Viewpoint-aware rotation (clockwise from X) (No): Searched actor/scene tools and skills; rotation is absolute FRotator only, no viewpoint convention.
Quaternion deltas (no Euler drift) (No): Transforms serialize rotation as FRotator Euler; no delta or quaternion tool found (grep quat).
|
PartialFrame-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.
|
PartialFrame-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.
|
PartialFrame-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. | PartialSpatial 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. |
YesSpatial 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.
|
PartialSpatial dry-run preview (No): Searched for dry_run/preview in toolsets; transform and spawn tools apply immediately.
Before/after transforms + rollback on edits (Partial): execute_tool_script undoes the transaction on failure; no before/after transform report.
|
PartialSpatial 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.
|
PartialSpatial 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.
|
PartialSpatial 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. | YesCollision-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. |
PartialCollision-aware free-spot search (No): Searched FindTeleportSpot, EncroachingBlocking, free spot, Sweep*, Overlap* queries in plugin and src; none.
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.
|
PartialCollision-aware free-spot search (No): Searched for free spot or placement search; only trace_world and bounds overlap queries exist.
Relational placement (on top of, against) (Partial): Only snap_to_ground on spawn and parent-relative placement; no on-top-of or against operations.
|
NoCollision-aware free-spot search (No): Searched free spot, sweep, FindTeleportSpot, empty space search; none found.
Relational placement (on top of, against) (No): No on top of or against placement op; only suggestedZ hint and foliage snapToSurface.
|
PartialCollision-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.
|
PartialCollision-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. | YesCaptures 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. |
PartialCaptures 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.
|
PartialCaptures with camera metadata + fixed settings (Partial): CaptureViewport returns camera pose and FOV, optional pose, hides gizmos; size follows the viewport.
Georeferenced ortho map tiles and markup (No): Searched toolsets for georef, ortho and map tile tools; none found.
|
PartialCaptures 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.
|
PartialCaptures 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.
|
PartialCaptures 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Collision / physics | Yesactor.set_collision, static_mesh.set_collision_complexity, geometry collision gen, physics.* ragdoll ops. Evidence |
Yesset_collision, set_collision_profile, set_simulate_physics, set_physics_properties, add_impulse. Evidence |
YesPhysics asset toolset, static mesh convex collision gen/remove, world line trace, channel overlap search. Evidence
|
Yescontrol_actor.set_actor_collision, setup_physics_simulation, geometry collision generation actions. Evidence
|
Yesset_collision_settings sets profile, enabled state, object type and channel responses on BP components. Evidence |
Yesmesh.set_collision_preset, set_mesh_collision, generate_collision, configure_physics_props, query_raycast. Evidence
|
| Navigation (rebuild/query) | Partialnavigation.rebuild_navigation and nav settings exist; no path, projection or reachability query op. Evidence
|
Yesrebuild_navigation, find_nav_path, project_to_nav, list_nav_invokers, spawn_nav_modifier, navmesh info. Evidence
|
NoSearched Toolsets for navmesh, NavigationSystem, pathfind; only content browser navigation hits; no console exec tool. Evidence
|
PartialRebuild navigation and navmesh info exist; searched FindPath, ProjectPoint, pathfind: no query action. Evidence
|
PartialNo nav service; searched NavMesh/RebuildNav/FindPath. Only via execute_python_code on NavigationSystemV1. Evidence
|
Yesai.rebuild_navigation, find_path, test_path, project_point_to_navigation, navmesh config actions. Evidence |
| Behavior Tree full read and authoring | Yesbehavior_tree.create/add_node/connect/attach_decorator/service plus decompile to BTIR text. Evidence |
Yesread_behavior_tree_graph plus add/move/remove_bt_node with recompile and node property writes. Evidence |
PartialAIModuleToolset reads BT nodes, children, decorators, subtrees; no node create or wiring tools. Evidence
|
Yesget_tree serializes BT; add_node, connect_nodes, remove_node, break_connections, set_node_properties. Evidence |
YesBehaviorTreeService: GetTree JSON, AddNode/Decorator/Service, BuildTree, Validate, Repair. Evidence |
Yesai BT actions: get_behavior_tree, get_bt_graph, add_bt_node, decorators/services, build_behavior_tree_from_spec. Evidence |
| Blackboard CRUD | PartialCreate, add key, set default, set synced, read via decompile; no remove or rename key op. Evidence
|
Yescreate_blackboard, add/remove_blackboard_key, read_blackboard, set_blackboard_parent. Evidence
|
PartialOnly get_blackboard from a BT; keys editable only via generic data_asset.create and object set_properties. Evidence
|
PartialCreate, add key, read, set default and sync flag; no key remove or rename handler found. Evidence |
YesBlackboardService: create, add/remove/rename keys, key references, parent, instance sync. Evidence
|
Yescreate/get/list/delete/duplicate blackboard, add/remove/rename bb keys, set_bb_parent. Evidence
|
| EQS | Yeseqs.create, add_generator, add_test, set_context_class, set_test_filter, set_test_scoring. Evidence |
Yescreate/read EQS query, add generator/test, remove, reorder, list types, run_eqs_query live. Evidence |
NoSearched Toolsets for EnvQuery and EQS; none. EnvQuery Options is a non editable UPROPERTY built by graph. Evidence
|
Yescreate_eqs_query, add generator, test, context, configure_test_scoring. Evidence |
YesEnvQueryService: create, options/tests CRUD, BuildQuery from JSON, validate, RunQuery against an actor. Evidence |
YesEQS query CRUD, generators, tests, scoring, spec build, plus runtime_run_eqs_query. Evidence
|
| StateTree | Yes8 ops author states, transitions, tasks, conditions, evaluators, bindings; read back via asset.dump; no compile or validate op. Evidence |
Yesstatetree category: states, tasks, conditions, transitions, bindings, evaluators, compile, validate. Evidence |
PartialStateTreeToolset is read only: states, tasks, conditions, transitions, evaluators; no authoring. Evidence
|
Yescreate_state_tree, add state, add transition, configure task. Evidence |
YesStateTreeService ~98 methods: states, tasks, conditions, transitions, bindings, compile. Evidence
|
YesStateTree create, states, tasks, transitions, bindings, compile, spec build; needs WITH_STATETREE. Evidence
|
| GAS (abilities / effects) | Yes27 gas.* ops: abilities, effects, modifiers, cues, attribute sets, exec calcs, costs, cooldowns. Evidence |
Yesgas category: ASC, attribute sets, abilities, effects, cues, live grant/apply/remove. Evidence
|
PartialGASToolsets inspect granted abilities, effects, attributes and author cues; no ability or effect authoring. Evidence
|
Yesmanage_gas creates and configures abilities, effects, attribute sets, cues, ASC. Evidence |
PartialNo GAS service; gas skill routes to Epic GASToolsets and BlueprintTools. via Epic toolset. Evidence
|
Yesgas namespace ~135 actions: abilities, effects, attribute sets, ASC, cues; needs GameplayAbilities plugin. Evidence
|
| Networking / replication | Yes22 networking.* ops: replicated vars, RepNotify, conditions, RPCs, relevance, dormancy, prediction. Evidence |
Yesnetworking category: replicates, property replication, dormancy, relevancy, frequency, priority. Evidence |
PartialOnly Blueprint variable replication get/set (None, Replicated, RepNotify). Evidence
|
Yesconfigure_replication, create_rpc_function, set_replicated_using, dormancy, relevancy actions. Evidence |
PartialPIE net mode settings, server/client world selectors, read var replication; no replication authoring op. Evidence
|
PartialReplicated 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 | Yesgame_framework.* configures GameMode rules, teams, rounds, spawn, spectating; class props via property.set. Evidence |
Yescreate_game_mode/game_state/player_controller/player_state/hud, set_world_game_mode. Evidence
|
PartialGeneric Blueprint create with any parent class plus set_properties; no GameMode specific tools. Evidence
|
Yescreate_framework_class (GameMode, PlayerController, etc) and configure_game_mode class setters. Evidence |
PartialNo GameMode ops (searched GameMode); BP create via Epic toolset, default mode via SetIniValue. Evidence
|
Partialauthor_map_settings sets map GameMode override and PlayerStarts; class defaults only via set_cdo_property. Evidence
|
| Enhanced Input asset CRUD | Yesinput.create_input_action, create_input_mapping_context, add_mapping, remove_mapping, get_input_info. Evidence |
Yescreate InputAction and IMC, add/remove/rebind mappings, modifiers, triggers, read back. Evidence
|
PartialNo Enhanced Input tools; InputAction and mapping context only via generic data_asset.create and set_properties. Evidence
|
Yescreate_input_action, create_input_mapping_context, add/remove mapping, triggers, modifiers. Evidence |
YesInputService: create actions and mapping contexts, key mappings, modifiers, triggers. Evidence
|
PartialIA/IMC read plus modifier/trigger edits; create only via scaffold_locomotion_input; no delete or add key map. Evidence
|
| Chooser tables | Yeschooser.create, add_column, add_row, set_cell, set_result, compile; needs Chooser plugin. Evidence |
Yeschooser category: create, describe, add_column, add/set/delete rows, remap object references. Evidence |
NoSearched Toolsets for Chooser and ChooserTable; none. ChooserTable is not a DataAsset, so no generic create. Evidence
|
NoSearched plugin and server source for Chooser; 0 hits. Evidence
|
NoSearched Chooser across Source, skills, docs and Epic Toolsets; no matches. Evidence
|
Yeschooser namespace: create table, columns, rows, cells, validate, inspect. Evidence
|
| Mass Entity / ZoneGraph | PartialMass entity config create/configure only; ai.add_mass_spawner is a stub; no ZoneGraph ops. Evidence
|
PartialMass entity config create, read, trait reorder/remove, validate; ZoneGraph is query only, no authoring. Evidence
|
PartialNo Mass or ZoneGraph tools; MassEntityConfigAsset is a DataAsset, so generic create plus set_properties only. Evidence
|
PartialMass entity config create and trait edits; add_mass_spawner is a stub that only dirties and saves the Blueprint; no ZoneGraph. Evidence
|
NoSearched MassEntity, Mass, ZoneGraph in VibeUE and Epic Toolsets; no matches. Evidence
|
YesMass entity config CRUD, traits, processors, stats; ZoneGraph list and lane queries (read only). Evidence
|
| Live Behavior Tree execution path | Yesai.get_runtime_state returns active BT node, root first node path and task status in PIE. Evidence |
Yesget_bt_runtime returns active node, ancestor chain, active aux nodes in PIE. Evidence |
NoBT tools read assets only; searched for BehaviorTreeComponent or active node queries, none. Evidence
|
NoOnly run/stop BT; searched GetActiveNode, BrainComponent, BehaviorTreeComponent: 0 hits. Evidence |
NoSearched BrainComponent, GetActiveNode, BTDebugger; BT service is asset only, refuses edits in PIE. Evidence
|
Yesai.runtime_get_bt_execution_path: active branch, current task, decorator states in PIE. Evidence
|
| Live input action value | Partialeditor.simulate_input injects raw key events into PIE; no input action value read or injection. Evidence
|
Yesget_action_value reads live value, triggerEvent and mapped keys per PIE player. Evidence |
NoSearched Toolsets for InputAction, EnhancedInput, action value; no tools found. Evidence
|
Partialsimulate_input injects an action value into PIE; no readback of current action value. Evidence
|
PartialInjectAction pushes a typed value into PIE for one tick; no readback of current action value. Evidence |
Partialeditor.pie_inject_input_action injects values; no action to read a live action value. Evidence
|
| Enhanced Input validation audit | NoSearched input.* and Source for IMC or action validation audit; only get_input_info asset readback. Evidence |
Yesvalidate_input audits unmapped actions, bad keys, duplicates, null triggers, missing swizzle. Evidence |
NoNo Enhanced Input tools of any kind in Toolsets. Evidence
|
NoSearched Input domain for validate, audit, unmapped, conflict; only per asset get_input_info. Evidence |
NoSearched validate/audit/unused/orphan in InputService and enhanced-input skill; only existence checks. Evidence
|
Yesinput.validate_input_mappings reports missing actions, invalid keys, duplicate key warnings. Evidence
|
| GAS cue coverage / attribute audit | No |
Yesvalidate_cue_coverage and audit_attributes (clamping, replication, OnRep, Max pairs). Evidence
|
YesFindCueTagsWithoutNotifies audits cue coverage; FindAttributeSetClasses and ListAttributes list attributes. Evidence
|
NoSearched GAS domain for cue coverage or attribute audit; only cue authoring actions. Evidence
|
PartialEpic GameplayCueToolset FindCueTagsWithoutNotifies; nothing in VibeUE. via Epic toolset. Evidence
|
Yesgas.validate_cue_coverage finds unhandled and orphan cues; validate_attribute_set audits sets. Evidence
|
| SaveGame slot inspection | NoSearched USaveGame, LoadGameFromSlot, DoesSaveGameExist in Source; none, only CPF_SaveGame flag handling. Evidence
|
Yesreflection inspect_save_game loads a slot read only and returns SaveGame properties. Evidence |
NoSearched Toolsets for SaveGame and save slot; no tools found. Evidence
|
NoSearched USaveGame, SaveGame, LoadGameFromSlot, DoesSaveGameExist: 0 hits. Evidence
|
PartialOnly C++ SaveGame scaffolding (ui.scaffold_save_game); slot reads only via run_python. Evidence
|
|
| Collision profile resolution | Partialset_view_mode collision report gives per actor channel response; BodyInstance readable; no profile resolver. Evidence |
Yesresolve_collision_profile gives per channel responses; get_component_collision per component. Evidence |
Noget_collision_channels lists object channels only; searched CollisionProfile, no profile lookup found. Evidence
|
PartialComponent details return profile name; collision settings exportable as raw config text. Evidence |
PartialProfile can be set, not resolved to channel responses; reads only via execute_python_code. Evidence
|
PartialNo profile resolver; set_collision_preset only checks name exists; raw ini via config.resolve_setting. Evidence
|
| Player-mappable input settings | NoSearched PlayerMappable, UEnhancedInputUserSettings, MappableKey in Source and wiki; none. Evidence |
Yesset_player_mappable_settings authors PlayerMappableKeySettings on InputAction; no runtime user remap. Evidence |
PartialNo mappable key tools; InputAction PlayerMappableKeySettings editable only via generic set_properties. Evidence
|
NoSearched EnhancedInputUserSettings and PlayerMappable: 0 hits. Evidence
|
NoSearched PlayerMappable, Mappable, EnhancedInputUserSettings; ConfigureAction lacks mappable settings. Evidence
|
Partialget_input_action reports player mappable flags; ui.scaffold_input_remapping emits setup guidance only. Evidence
|
| Physics asset bodies and constraints authoring | Yesskeleton.create_physics_asset, configure_physics_body, add_physics_constraint, configure_constraint_limits. Evidence |
PartialOwn read only (get_physics_asset_info); bodies/shapes/constraints via wrapped Epic toolset, UE 5.8 only. Evidence |
YesPhysicsAssetToolset creates asset, adds bodies, sets sphere/capsule/box, mass, constraints and limits. Evidence
|
Yesedit_physics_asset: create asset, add/configure bodies, add constraints, set limits. Evidence |
PartialSkeletonService only reports physics asset path; bodies and constraints via Epic PhysicsToolsets. Evidence
|
PartialRead 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. | Partialgameplay_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
|
PartialOwn create_gameplay_tag; rename, remove, find referencers via wrapped Epic toolset, UE 5.8 only. Evidence
|
YesGameplayTagsToolset AddTag, RemoveTag, RenameTag (updates references), FindReferencersByTag. Evidence
|
Noadd_tag_to_asset needs pre-registered tags; no tag registry add, rename or remove. Evidence
|
PartialVibeUE has bulk add_tags only; add/remove/rename and FindReferencersByTag via Epic toolset. Evidence
|
Yesgas add_gameplay_tags, rename_tag across assets (dry_run), remove_gameplay_tags with reference check. Evidence
|
| Gameplay tag query builder | Yesgameplay_tags.build_query builds FGameplayTagQuery from JSON tree and can write it to an asset. Evidence |
NoSearched TagQuery, tag_query in src, plugin, docs, skills; only internal StateTree use; epic query is WorldCondition. Evidence
|
NoSearched for TagQuery; WorldConditions toolset only describes world condition queries. Evidence
|
NoSearched FGameplayTagQuery and GameplayTagQuery: 0 hits. Evidence
|
PartialNo query builder (searched TagQuery); request_tag_container builds tag values for Python calls. Evidence
|
NoSearched FGameplayTagQuery and tag_query actions; only internal use and a UI text param. Evidence
|
| AI archetype scaffold library | NoSearched ai.*, behavior_tree.* and wiki for archetype or template scaffolds; none. Evidence |
NoSearched archetype, patrol, enemy AI templates in docs, src, skills; only per-asset BT/EQS ops. Evidence
|
NoNo AI archetype or AI template scaffolding tools found. Evidence
|
NoSearched AI domain for archetype, template, preset, patrol; only create_ai_controller. Evidence |
NoSearched archetype, template, scaffold, preset in AI skills and services; none. Evidence |
Yes21 AI scaffolds: boss, companion, turret, stealth, flying, horror stalker, patrol, etc. Evidence
|
| Static replication audit (RPCs, OnRep) | Partialnetworking.get_networking_info lists RPCs, reliability, validation, OnRep per Blueprint; no project wide audit. Evidence |
PartialNo actor RPC/OnRep audit; reflection lists RPC flags, audit_attributes checks OnRep on GAS sets only. Evidence |
PartialPer variable replication query on Blueprints only; no RPC or OnRep audit across project. Evidence
|
Partialget_networking_info reports actor net settings; no RPC or OnRep enumeration. Evidence |
PartialGetVariableInfo reports per variable Replicated or RepNotify; no RPC listing or project audit. Evidence |
Yesnetwork.list_rpc_functions, list_onrep_handlers, audit_unbalanced_onreps from UHT reflection index. Evidence
|
| Third-party state-machine / combo graph authoring | NoSearched Source and wiki for third party state machine or combo graph plugins; none. Evidence
|
NoSearched LogicDriver, ComboGraph, SMStateMachine, FlowGraph in src, plugin, docs, skills. Evidence
|
NoNo toolsets for third party state machine or combo graph plugins. Evidence
|
NoSearched LogicDriver, SMInstance, ComboGraph: 0 hits; configure_combo_system is native. Evidence |
NoNo third party graph plugins; searched combo, state machine. Only engine AnimBP and montage sections. Evidence |
Yeslogicdriver (66 actions) and combograph (13 actions); need Logic Driver Pro and ComboGraph plugins. Evidence
|
| Game Feature plugin activation control | Partialgame_features.list reads Game Feature plugin states; activation calls exist only in test fixtures. Evidence
|
PartialActivate/deactivate/state of Game Features via wrapped Epic toolset, UE 5.8 only. Evidence
|
YesGameFeaturesToolset lists plugins, reads state, requests activate and deactivate. Evidence
|
NoSearched GameFeaturesSubsystem and GameFeatureData: 0 hits. Evidence
|
PartialNo VibeUE code (searched GameFeature); Epic GameFeaturesToolset activate/deactivate. via Epic toolset. Evidence
|
PartialNo dedicated action; searched UGameFeaturesSubsystem; only via run_console_command or run_python. Evidence
|
| Chaos Vehicle setup | Yesvehicle.* wheel assets, wheel setups, suspension on Chaos wheeled vehicles; needs ChaosVehicles plugin. Evidence |
NoSearched ChaosVehicle, WheeledVehicle, VehicleMovement in src, plugin, docs, skills. Evidence
|
NoSearched Toolsets for ChaosVehicle and WheeledVehicle; no tools found. Evidence
|
Partialconfigure_vehicle tunes a placed actor's Chaos movement (engine RPM, torque, gears, mass); no wheel assets; wheel radius/width/friction writes miss. Evidence
|
NoSearched ChaosVehicle, Vehicle; only the ECC_Vehicle collision channel. Evidence |
PartialSearched ChaosVehicle, WheeledVehicle: none; only generic blueprint.add_component and set_cdo_property. Evidence |
| PIE network emulation (latency, packet loss) | Yeseditor.play networkEmulation {enabled, target, profile} applies to one session, off by default, never saved; editor.pie_status reads it back. Evidence
|
Partialconfigure_pie has no emulation fields; only via execute_command running NetEmulation.PktLag or NetEmulation.PktLoss. Evidence
|
PartialStartPIE has no net options; emulation only via ConfigSettings SetSectionProperties on PlayIn NetworkEmulationSettings, saved to user prefs. Evidence
|
Partialplay has no emulation; only via set_preferences on LevelEditorPlaySettings NetworkEmulationSettings, or console NetEmulation.PktLag. Evidence
|
PartialSetPIESettings has no emulation fields; only via execute_python_code calling SystemLibrary.execute_console_command with NetEmulation.PktLag. Evidence
|
Partialstart_pie has no net options; only via editor.run_console_command running NetEmulation.PktLag or NetEmulation.PktLoss. Evidence
|
| Live AI path-following status | Yesai.get_runtime_state pathFollowing: status, valid and partial path, reached goal, request id to tell a blocked pawn from an abort loop. Evidence
|
PartialNo path-following op; only via execute_python calling AAIController GetMoveStatus and HasPartialPath. Evidence
|
NoNo runtime AI move status tool; AI toolset reads assets only, and there is no Python escape hatch. Evidence
|
PartialNo path-following action; only via execute_python calling AAIController GetMoveStatus and HasPartialPath. Evidence
|
PartialNo path-following op; only via execute_python_code calling AAIController GetMoveStatus and HasPartialPath. Evidence
|
PartialNo 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. | YesMulti-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. |
YesMulti-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. |
PartialMulti-client PIE (Partial): StartPIE has no client count, but it uses editor PlayIn settings; PlayNumberOfClients settable via ConfigSettings.
PIE configuration (net mode, clients) (Partial): StartPIE has no net options; net mode and clients settable via ConfigSettings Editor/LevelEditor/PlayIn.
|
PartialMulti-client PIE (Partial): play has no client count or net mode; only generic set_preferences reflection on LevelEditorPlaySettings.
PIE configuration (net mode, clients) (Partial): No net mode or client count on play; only via generic set_preferences on LevelEditorPlaySettings. |
YesMulti-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.
|
PartialMulti-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. | YesSmart 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. |
YesSmart 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.
|
PartialSmart Objects (Partial): No SmartObject tools; SmartObjectDefinition is a DataAsset, so generic data_asset.create plus set_properties.
AI perception authoring (Partial): No perception tools; add AIPerceptionComponent via actor.add_component, SensesConfig via set_properties.
|
YesSmart Objects (Yes): Smart Object definition, slots, slot behavior and component actions.
AI perception authoring (Yes): setup_perception: perception component, sight, hearing, damage configs, team. |
NoSmart Objects (No): Searched SmartObject across Source, skills, docs and Epic Toolsets; no matches.
AI perception authoring (No): Searched AIPerception, Perception, sense config in VibeUE and Epic Toolsets; no matches.
|
YesSmart 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. | PartialGAS 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. |
YesGAS 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.
|
PartialGAS live attribute get/set (Partial): GetAttributeValues reads base and current values; no attribute set tool.
GAS ability activation trace (No): Only an is-active flag per granted ability; no activation trace or event log tool.
GAS state snapshot + diff (Partial): Snapshot via attribute values, active effects, abilities and tags per actor; no diff tool.
|
PartialGAS 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.
GAS state snapshot + diff (No): No runtime ASC snapshot or diff; get_gas_info reports asset class data only.
|
PartialGAS 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.
|
YesGAS 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. | PartialGenre 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.
|
NoGenre 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.
|
NoGenre scaffolding (weapons, inventory, interactables) (No): No weapon, inventory or interactable scaffolding tools in any toolset.
Online sessions, split-screen and voice setup (No): Searched Toolsets for OnlineSubsystem, session, split screen, voice; no tools found.
|
YesGenre 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. |
NoGenre 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.
|
PartialGenre 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. | PartialLive 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.
|
YesLive 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.
|
NoLive blackboard write (notifying) (No): No runtime blackboard component read or write tools found in AIModuleToolset.
Live StateTree events/transitions (No): StateTreeToolset reads editor data only; no runtime event send or transition tools.
|
PartialLive 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. |
PartialLive 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. |
PartialLive 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| 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. | YesProject 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 |
Partialpie-studio plugin only: CPU throttle suppressed during sessions; core does it only for automation tests. Evidence
|
NoNo CPU throttle handling; searched throttle, UseLessCPU, foreground; no console exec tool exists either. Evidence
|
Yesrestore_editor_window with unthrottle clears bThrottleCPUWhenNotForeground; set_preferences can too. Evidence |
YesPerformanceService.set_background_throttling toggles bThrottleCPUWhenNotForeground for session. Evidence
|
NoNo background CPU throttle override; searched UseLessCPU, IdleWhenNotForeground, ThrottleCPU. Evidence
|
| PIE session error capture | Partialeditor.play lists blueprintsWithErrors at start; runtime errors only if code logs journal events. Evidence |
PartialCore get_message_log reads the PIE Message Log and get_log reads output; no per-session capture. Evidence
|
PartialLogsToolset.GetLogEntries filters session log by category and regex; not scoped to a PIE session. Evidence
|
Partialread_log filters log history by verbosity incl. PIE warnings; no PIE-session-scoped error capture. Evidence |
PartialScenario report stores log delta since start; errors only via assert_log not_contains. Evidence
|
YesPIE smoke counts post marker log hits; defaults include Blueprint Runtime Error and Accessed None. Evidence
|
| Gameplay telemetry recorded from game code | YesFJournalRecorder LogVariable/LogEvent and PW_JOURNAL_LOG; editor-only module, host code must call it. Evidence
|
NoSearched telemetry, journal in src/tools and bridge; only read_actor_motion one-shot polled snapshots. Evidence
|
NoNo gameplay telemetry journal API; only log file reading via LogsToolset. Evidence
|
NoNo gameplay telemetry journal; telemetry files are server metrics, Insights is profiling. Searched journal. Evidence
|
NoWorkflow journal logs agent runs, notes and artifacts, not gameplay telemetry from game code. Evidence |
NoNo runtime macro or subsystem for gameplay code to journal events; searched telemetry, journal in Source. Evidence
|
| Query recorded sessions (state, min and max values, events) | Yesrecorder.get_state, summarize_change (extrema), get_series, find_events, list_segments, query. Evidence |
Partialpie-studio plugin only: pie_record_read/pie_observe_read return raw artifacts; no extrema or event query. Evidence
|
NoNo recorded sessions to query; searched for session, record, journal tools. Evidence
|
NoNo query over recorded sessions; demo replays can be played or seeked but not queried for state. Evidence |
Noget_scenario and list_runs return step reports only; no state, extrema or event query. Evidence
|
Partialpoll_pie_smoke returns per var min/max/last and samples for in-memory sessions; no event query. Evidence
|
| Network replay (demo) recording in PIE | Yeseditor.start_recording and stop_recording run a GameInstance demo replay recording in the PIE world. Evidence |
NoSearched DemoNetDriver, demorec, ReplaySubsystem, StartRecordingReplay in src and bridge; none found. Evidence
|
NoNo demo recording tool and no console command tool to run demorec; searched demorec, replay. Evidence
|
Yesmanage_sequence start/stop_demo_recording via UReplaySubsystem in PIE; plus play, seek, killcam. Evidence |
PartialNo demo recording API; demorec reachable only via scenario console_command escape hatch. Evidence
|
NoNo demo recording; searched DemoNetDriver, demorec, ReplaySubsystem, StartRecordingReplay. Evidence
|
| Record Event Dispatcher broadcasts on a live object | Yesblueprint.record_dispatcher binds a recorder job: params per broadcast, count and timeout bounds, pauseOnFire. Evidence
|
NoAuthors dispatchers and fires widget delegates; nothing records broadcasts; Python needs custom code. Evidence
|
NoBlueprint toolset only lists and authors dispatchers; no runtime binding or broadcast recording. Evidence
|
NoNo dispatcher listener or event watch tool; execute_python would need hand-written binding and recording. Evidence
|
NoScenario runner injects input and asserts logs; no delegate recording; Python needs custom code. Evidence
|
Noget_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. | NoInput 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).
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.
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. |
PartialInput 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.
|
NoInput recording (per-frame, 60 Hz) (No): No input recording tool; searched Toolsets/MCP/ToolsetRegistry for record, PlayerInput, EnhancedInput.
Replay through Enhanced Input (No): No replay tool; only SlateInspector.PressKey sends one key tap via Slate. Searched replay, EnhancedInput.
Per-frame drift report (JSON) (No): No replay feature, so no drift report; searched for replay, drift across toolsets.
Multi-client record / replay (No): No record/replay; StartPIE options have no client count and force in-process single viewport PIE.
Take Recorder lockstep (No): No Take Recorder tool; searched TakeRecorder and take_recorder in all toolsets and MCP plugin.
Monitor mode (manual vs ref) (No): No monitor or reference comparison mode; searched toolsets for monitor, reference run, replay.
Offline diff (no PIE) (No): No recordings exist to diff; searched for replay, recording, diff tools.
Determinism contract documented (No): No determinism documentation; no record/replay feature exists in the toolsets.
|
PartialInput 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.
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.
Offline diff (no PIE) (No): No offline recording diff; no input recording format exists to diff.
Determinism contract documented (No): No determinism contract for play replay; only a fixed_delta_time option; searched determinis in docs. |
NoInput recording (per-frame, 60 Hz) (No): No input recorder; searched record/replay/tape/InputRecord in Source, Skills, docs.
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.
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.
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.
|
PartialInput recording (per-frame, 60 Hz) (No): No input capture; searched record_input, InputRecord, recording, input_tape in Source, Docs, Skills, wiki.
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.
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.
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. | PartialTracked 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.
|
PartialTracked 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.
|
PartialTracked reflection paths (Partial): Only via execute_tool_script polling object.get_properties with time.sleep; wall clock, not per frame.
Tracked actor sampling (Partial): Only via execute_tool_script looping get_actor_transform on PIE actors; wall clock polling, no sampler.
|
NoTracked reflection paths (No): No tracked property paths during play; pie_report and get_property are one-shot reads.
Tracked actor sampling (No): No per-frame actor sampling; pie_report returns a one-shot actor list and player state. |
NoTracked 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.
|
PartialTracked 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. | PartialDeclarative play scenarios (No): No scenario file or batch play script verb; drive and editor verbs are called one at a time.
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.
|
PartialDeclarative 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.
|
NoDeclarative play scenarios (No): No scenario format; StartPIE only takes simulate flag, play mode, spawn transform and warmup seconds.
Timed input tape injection (No): No timed tape; SlateInspector PressKey only sends one instant key tap. Searched InjectInput, input_tape.
Temporal assertions over play data (No): No assertion tooling over play data; searched toolsets for assert, temporal, timeline checks.
|
PartialDeclarative 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.
|
PartialDeclarative 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.
|
PartialDeclarative 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Landscape CRUD | Yeslandscape.create, edit, sculpt, get_heights, set_material; deletion goes through the generic actor delete. Evidence
|
Yescreate, get_info, set_material, layers, proxies; delete goes through generic level(delete_actors). Evidence |
NoNo landscape create/edit/delete tool; grep for landscape in all toolsets found only a PCG node name. Evidence
|
Yescreate_landscape, sculpt, modify_heightmap, set material; build_environment delete removes landscapes by name. Evidence
|
YesLandscapeService create, list, info, resize, delete, save and property setters. Evidence
|
PartialNo landscape actions (no ALandscape use outside indexer); only reachable via editor.run_python. Evidence
|
| PCG graph CRUD | Yespcg.create_graph, add_node, remove_node, connect_pins, set_node_property, inspect, decompile, pcgir. Evidence |
Yescreate_graph, add/remove/connect nodes, set_node_settings, JSON import/export of whole graphs. Evidence
|
YesPCGToolset has CreateGraph, AddNode, UpdateNode, RemoveNode, Connect/DisconnectNodePins, GetGraphStructure. Evidence
|
PartialCreate graph, subgraph, add nodes, connect pins, set settings; no node delete, disconnect or graph read action. Evidence
|
PartialNo VibeUE PCG service (no PCG symbols in Source); via Epic toolset PCGToolset or Python per pcg skill. Evidence |
PartialNo PCG actions or PCG module use; only via editor.run_python with the PCG plugin enabled. Evidence
|
| Runtime Virtual Texture authoring | PartialNo RVT verb or handler; RVT assets and volumes only via generic python.execute, actor.spawn and property.set. Evidence
|
Yescreate_rvt, read_rvt, add_rvt_volume, sampler/output nodes, assign_rvt_to_landscape. Evidence
|
NoSearched VirtualTexture, RVT in all toolsets and MCP plugin; no tool and no generic asset create by class. Evidence
|
NoSearched RuntimeVirtualTexture, runtime_virtual, rvt in src and plugins: no hits; only texture VT streaming config. Evidence
|
YesRVT asset create, RVT volume create, assign RVT to landscape. Evidence
|
PartialNo RVT authoring action; only reads MFI RVT params; authoring only via editor.run_python. Evidence
|
| Real-world GPS terrain | NoSearched wiki and source for GPS, latitude, longitude, SRTM, GeoTIFF, Cesium: only image georeference, no terrain. Evidence
|
Partialplan_real_world sizes tile from lat/lon bounds, geo projection both ways; no DEM download, user supplies file. Evidence
|
NoNo GPS, geo, elevation data or real world terrain tool found in any toolset. Evidence
|
NoSearched gps, geotiff, srtm, mapbox, dem, elevation; elevation and latitude only used for sun and weather. Evidence |
Yesterrain_data tool makes heightmaps from lng/lat via hosted vibeue.com; needs free VibeUE API key. Evidence
|
NoSearched Source and Docs for GPS, latitude, geotiff, elevation data: no real world terrain import. Evidence
|
| Terrain analysis (slope/flat areas) | PartialNo slope or flat-area finder; get_heights region min/max/mean, audit_shape, pcg.add_slope_filter node. Evidence |
Yesanalyze_terrain returns height/slope histograms and largestFlatArea; slope map and slope at point. Evidence
|
PartialNo slope tool; single point trace_world, or a user built PCG graph on Get Landscape Data read back as JSON. Evidence
|
NoSearched slope, flatness, flat_area, analyze_terrain; slope only a PCG filter node and AI nav settings. Evidence |
YesAnalyzeTerrain, slope at location, slope map, normals, FindFlatAreas. Evidence
|
Partialsample_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 | Yesspatial.ground_instances seats each ISM/HISM instance on its own footprint and re-measures. Evidence |
Yessnap_instances_to_surface projects ISM/HISM instances onto geometry, dry run default, keeps rotation/scale. Evidence |
Partialsnap_to_ground is per actor only; per instance seating only via PCG Projection/Surface Sampler graphs. Evidence
|
Partialpaint_foliage snapToSurface traces each point to ground and can align to normal; foliage only, not generic ISM. Evidence |
PartialFoliage instances traced to ground and normal aligned at placement; no reseat op for existing ISM instances. Evidence
|
Partialsnap_to_floor and snap_to_surface seat whole actors; no per instance seating inside ISM or HISM. Evidence
|
| Water body authoring (river, lake, ocean) | Yeswater.spawn_water_body River/Lake/Ocean/Custom; river width and depth set per spline point in UWaterSplineMetadata; material verbs. Evidence
|
Partialedits existing water bodies and zones and reads state; no create action, spawn via generic actor spawn. Evidence
|
PartialNo water tool; generic add_to_scene_from_class can spawn WaterBodyLake/River/Ocean if Water plugin enabled. Evidence
|
Yescreate_water_body_river, lake, ocean, custom plus wave config; needs the UE Water plugin enabled. Evidence |
PartialNo WaterBody service; real world river/lake/ocean splines as data, WaterBody spawn only via Python. Evidence
|
PartialNo water actions; only via editor.run_python with the Water plugin enabled. Evidence
|
| PCG generation with spawned-output readback | Yespcg.generate async job reports instanceCount, spawnedActorCount, instancesByMesh, pointCount. Evidence |
Partialown execute reports seed only; node output readback via wrapped Epic toolset, UE 5.8 only. Evidence
|
YesExecuteGraphInstance returns execution messages; GetNodeDataView returns per node output points as JSON. Evidence
|
Partialexecute_pcg_graph schedules GenerateLocal and returns only a taskId; no poll or spawned output readback. Evidence |
PartialOnly via Epic toolset PCGToolset or Python; pcg skill counts ISM instances on the PCG volume. Evidence
|
PartialNo PCG generate or output readback action; only via editor.run_python with PCG plugin. Evidence
|
| Procedural map blockout from landscape | NoSearched blockout, level-building pages and landscape verbs; blockout is guide text, no generator from landscape. Evidence
|
Nosearched blockout, generate_level/map, layout; only BSP to static mesh conversion exists. Evidence
|
NoNo landscape based blockout tool; PCG skills cover biomes, shape grammar, mesh partition, not terrain. Evidence
|
NoSearched blockout, greybox, map layout actions; only hit is an editor camera file, nothing derives blockout. Evidence
|
YesMapBlockoutService runs roads, POIs, fields, foliage, railway pipeline from a landscape and materializes. Evidence
|
NoBlockout tools work from blockout volumes, not landscape; searched blockout actions for landscape input. Evidence
|
| Landscape shape audit (stair-stepping) | Yeslandscape.audit_shape measures axisFraction and stepFraction per region; pass:false on grid-locked or stepped terrain, unmeasurable region fails. Evidence |
NoNo shape audit; GPS terrain import only warns up front that vertical precision over 10 cm will terrace gentle slopes. Evidence
|
NoNo landscape tools; searched stair-step and landscape audit terms. Evidence
|
NoNo terrain shape audit; searched stair-step and landscape audit terms. Evidence
|
NoNo shape audit; blocky-terrace wording is a comment on its resampler. Evidence
|
NoNo terrain shape audit; searched stair-step and landscape audit terms. Evidence
|
| Foliage stored vs drawn instance verification | Yesget_instances, add_instances, paint report ledgerMatchesRendered, orphans, builtInstanceCount, clusterTreeUpToDate, expectedDrawnInstances. Evidence
|
NoFoliage listing returns the HISM GetInstanceCount only; no ledger, built-tree or density-cull comparison. Evidence
|
NoNo foliage tools; searched built-instance and density-scale APIs. Evidence
|
NoFoliage queries read ledger instances only; searched NumBuiltInstances, IsTreeFullyBuilt, density cvars. Evidence
|
NoGetInstanceCount returns the foliage ledger count only; nothing compares it with the drawn component. Evidence
|
NoNo foliage actions; searched built-instance and density-scale APIs. Evidence
|
| Landscape layer-paint impact report | YesLayer paint reports otherLayerTexelsLost, each layer's measured blend method and zero-sampled layers; refuses on orphaned layer weight. Evidence
|
Nopaint_layer reports the painted layer's changed vertices only; other layers are read back by hand with get_layer_weight_region. Evidence
|
NoNo landscape paint tools; searched SetAlphaData, LandscapeLayerInfo, paint_landscape. Evidence
|
Nopaint_landscape_layer returns layer name and strength only; no other-layer census or orphan guard. Evidence
|
NoNo impact report; GetWeightsInRegion reads one layer's raw weights for manual comparison. Evidence
|
NoNo landscape layer paint; searched SetAlphaData, LandscapeLayerInfo, PaintLayer. Evidence
|
| Landscape grass authoring and grass-cache refresh | Yescreate_grass_type reports effective density after grass.densityScale; flush_grass rebuilds one grass type's consumers and keeps grass maps. Evidence
|
PartialGrass type via generic create_asset_by_class and set_property, grass node via add_expression; refresh only via execute_command grass.FlushCache. Evidence
|
NoNo grass tools and no Python or console escape hatch; data_asset.create accepts DataAsset subclasses only. Evidence
|
Partialcreate_landscape_grass_type makes a one-variety grass type; no refresh op, only console_command grass.FlushCache. Evidence
|
PartialCreateGrassOutput wires grass types into a landscape material; grass type asset and grass.FlushCache only via Python. Evidence
|
PartialNo grass op; only via editor.run_python with LandscapeGrassTypeFactory and editor.run_console_command grass.FlushCache. Evidence
|
| Heightmap and weightmap read, write, importImports and exports heightmaps and edits height or layer-weight regions. | PartialHeightmap 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.
|
YesHeightmap 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. |
PartialHeightmap import/export (No): Searched heightmap, landscape import/export in Python and C++ toolsets; nothing found.
Height/weight region read-write (Partial): No write tool. Read only via PCG Get Landscape Data sampling and GetNodeDataView JSON readback.
|
PartialHeightmap 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.
|
YesHeightmap import/export (Yes): ImportHeightmap, ExportHeightmap, ResizeHeightmap plus weightmap import and export.
Height/weight region read-write (Yes): Get/SetHeightInRegion and Get/SetWeightsInRegion arrays.
|
PartialHeightmap 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. | PartialErosion 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.
|
YesErosion 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.
|
NoErosion simulation (No): Searched erosion, landscape and terrain terms in all toolsets; nothing found.
Procedural terrain feature stamps (No): No terrain stamp or landscape sculpt tool; searched landscape, heightmap, terrain in all toolsets.
|
NoErosion simulation (No): Searched erosion and erode across src and plugins; no hits.
Procedural terrain feature stamps (No): Searched stamp; sculpt has raise, lower, flatten; modify_heightmap set, add, subtract, smooth; no stamps. |
YesErosion simulation (Yes): ApplyErosion operation on landscape heights. Procedural terrain feature stamps (Yes): CreateMountain, Valley, Ridge, Plateau, Crater, Terraces, BlendTerrainFeatures.
|
NoErosion simulation (No): Searched Source and Docs for erosion and hydraulic: no erosion simulation.
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. | YesFoliage 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. |
YesFoliage 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.
|
PartialFoliage scatter (Partial): Only via authored PCG graphs (Surface Sampler plus Static Mesh Spawner); no foliage tool or foliage actor API.
Seeded reproducible scatter layout (Partial): PCG output is seed deterministic, but the toolset strips Seed from node schemas; raw set_properties needed.
|
YesFoliage 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. |
YesFoliage 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.
|
PartialFoliage 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Mesh ops (UV, simplify, remesh, boolean) | Yesgeometry.* verbs: unwrap_uv, simplify_mesh, remesh_uniform, booleans; extrude, inset, bevel, shell, bridge, bend, twist, taper, noise. Evidence
|
YesOwn GeometryScript actions: apply_mesh_simplify, apply_mesh_remesh, mesh_boolean, unwrap_uvs, transform_uvs. Evidence
|
PartialOnly triangle reduction via generate_lods; no UV, remesh or boolean tools found in any toolset. Evidence
|
Yesmanage_geometry has UV (auto/unwrap/pack), simplify, voxel and uniform remesh, and boolean ops via GeometryScript. Evidence
|
PartialDedicated UV ops only (unwrap, pack, lightmap UVs, transform); no simplify, remesh or boolean found. Evidence
|
Partialboolean, simplify, remesh, compute_uvs exist but need GeometryScripting plugin; release zip DLLs omit them. Evidence
|
| Collision generation | Yesgeometry.generate_collision (box, convex, decomposition, auto), generate_complex_collision, simplify_collision. Evidence
|
Yesgenerate_mesh_collision: boxes, spheres, capsules, convex hulls, swept hulls, level sets; also clear op. Evidence |
Yesgenerate_convex_collisions (convex decomposition) and remove_collisions; no simple box/sphere/capsule tool. Evidence
|
Yesgenerate_collision, generate_complex_collision and simplify_collision actions in manage_geometry. Evidence
|
PartialNo own static mesh collision tool; Epic PhysicsToolsets CreateFromMesh (not enabled by default) or Python. Evidence
|
Yesset_mesh_collision always registered (simple shapes, complex); auto convex and generate_collision need GeometryScripting. Evidence
|
| Fracture / Dataflow graphs | PartialNo fracture op; only via python.execute calling engine UDataflowEditorBlueprintLibrary (fracture nodes need GeometryCollectionPlugin). Evidence
|
Partialapply_mesh_fracture only plane cuts into separate StaticMeshes, no GeometryCollection; Dataflow via Epic toolset, 5.8 only. Evidence
|
YesDataflowAgent toolset: create graph, add/connect nodes, variables, GeometryCollection assets, templates. Evidence
|
PartialNo fracture op (destructible only adds a tag); only via execute_python calling engine UDataflowEditorBlueprintLibrary (needs GeometryCollectionPlugin). Evidence
|
PartialNo own fracture code; Dataflow via Epic DataflowAgent (not enabled) or execute_python calling engine UDataflowEditorBlueprintLibrary. Evidence
|
Partialcreate_fragments plane slicing only; Dataflow graphs only via editor.run_python calling engine UDataflowEditorBlueprintLibrary. Evidence
|
| Batch static-mesh geometry defect audit | Yesaudit_static_meshes flags inverted, open, non-manifold, degenerate, z-fighting and (opt-in) self-intersecting. Evidence
|
Partialmeasure_mesh_geometry: manifold, holes, signedVolume, isClosed but no inverted verdict; check_uvs; one asset per call, no batch. Evidence
|
NoNo batch defect audit; only per mesh get_triangle_count, get_vertex_count, get_bounds queries. Evidence
|
NoNo batch mesh defect audit; get_mesh_info is per mesh, repair ops modify; audit_placement checks actor placement only. Evidence
|
PartialPer mesh UV health only (lightmap overlaps, texel density); no batch geometry defect scan. Evidence
|
Yesbatch_validate: SQL prefilter on mesh catalog then deep load; flags collision, LODs, degenerate geo, pivot. Evidence
|
| Static mesh LOD generation and Nanite toggle | Yesasset.generate_lods, geometry.set_lod_settings; asset.nanite_rebuild_mesh toggles Nanite per mesh. Evidence
|
PartialOwn set_nanite_settings toggles Nanite; LOD generation only epic_generate_lods via wrapped Epic toolset, UE 5.8 only. Evidence
|
Yesgenerate_lods, remove_lods, get/set_lod_thresholds, is_nanite_enabled, set_nanite_enabled. Evidence
|
Yesgenerate_lods on static mesh or actor, LOD screen sizes, and Nanite enable/disable on existing static mesh. Evidence
|
PartialNo own LOD or Nanite tool; Epic StaticMeshTools only reads LOD counts; possible via execute_python_code. Evidence
|
Partialauto_generate_lods writes LODs (GeometryScripting); set_lod_screen_sizes; Nanite only read, no toggle. Evidence
|
| Customizable (Mutable) character graph authoring | NoNo Mutable op; python.execute reaches only engine NewCustomizableObject and compile, no graph node or pin API. Evidence
|
Yescreate_customizable_object and compile_customizable_object; nodes via generic add_graph_node, connect_graph_pins. Evidence
|
NoSearched Toolsets for Customizable and Mutable; no Mutable toolset or tools found. Evidence
|
NoMutable only planned in Roadmap 36.3; execute_python reaches only engine NewCustomizableObject and compile, no graph API. Evidence
|
YesCustomizableObjectService creates CO assets, adds and wires nodes, compiles; needs Mutable plugin. Evidence
|
NoNo 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 | Yescreate_from_skeletal_mesh loads bones and weights for any geometry.* op; convert_to_skeletal_mesh writes back, refusing unskinned verts. Evidence
|
Partialunwrap_uvs round-trips a SkeletalMesh via GeometryScript (UVs only); other edits only via execute_python calling CopyMeshToSkeletalMesh. Evidence
|
Noskeletal_mesh tools cover import, counts, bones, materials and sockets; no geometry edit tool and no unrestricted Python. Evidence
|
Partialskin_mesh_to_skeleton writes a mesh as a new skinned SkeletalMesh; no geometry op loads a skeletal mesh except via execute_python. Evidence
|
PartialNo skinned-mesh geometry op; only via execute_python_code calling GeometryScript CopyMeshTo/FromSkeletalMesh (GeometryScripting plugin). Evidence
|
PartialNo skinned-mesh geometry op; only via editor.run_python calling GeometryScript CopyMeshTo/FromSkeletalMesh. Evidence
|
| Mesh geometry as text or buffers (OBJ/STL, vertex arrays) | Yesexport_obj/export_stl return text inline; import_obj/import_stl take text; append_buffers bulk-writes vertices and triangles. Evidence
|
Partialget_mesh_geometry reads positions, UVs, normals, triangles as JSON; OBJ only as whole-file asset import; no buffer write. Evidence
|
Partialstatic_mesh import_file imports an OBJ from disk; no mesh export, vertex read or buffer write. Evidence
|
Partialappend_triangle adds one triangle per call; get_mesh_info returns counts only; no text or bulk buffer I/O. Evidence
|
PartialNo mesh text or buffer op; only via execute_python_code calling AssetExportTask (OBJ exporter) or GeometryScript buffer functions. Evidence
|
Partialmesh.get_vertex_data reads positions and normals, 5000 per call; no text export or buffer write. Evidence
|
| Skinned-mesh separation audit across animation frames | Yesgeometry.audit_skeletal_animation_floating poses the mesh in an animation's frames and reports islands that separate from the body. Evidence
|
NoSearched floating, disconnected component, interpenetration, per-frame separation; no skinned-mesh animation audit. Evidence
|
NoNo mesh audit tools; floating hits are editor window and UI layout text only. Evidence
|
NoOnly actor placement interpenetration checks; no skinned-mesh separation audit over animation frames. Evidence
|
NoSearched floating, disconnected component, interpenetration, per-frame separation; no mesh audit. Evidence
|
Noanalyze_skeletal_mesh is a static bind-pose quality check; no per-frame separation audit. Evidence
|
| Vertex colour painting and ambient-occlusion bake | Yesset_vertex_color paints vertices; bake_ambient_occlusion ray-casts AO into chosen vertex-colour channels. Evidence
|
PartialNo vertex colour or AO op; only via execute_python calling GeometryScript SetMeshPerVertexColors and BakeVertex (GeometryScripting plugin). Evidence
|
NoNo vertex colour or AO tools; searched vertex_color, VertexColor, AmbientOcclusion over Toolsets; no unrestricted Python. Evidence
|
Partialset_vertex_color sets one vertex or all on a DynamicMeshActor; AO bake only via execute_python calling GeometryScript BakeVertex. Evidence
|
PartialNo vertex colour or AO op; only via execute_python_code calling GeometryScript SetMeshPerVertexColors and BakeVertex (GeometryScripting). Evidence
|
PartialReads 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) | Yesstatic_mesh.bake_transform bakes rotation, translation and uniform scale into all LODs, hi-res source, simple collision and sockets. Evidence |
Partialrecenter_pivot translates LOD0 only, to the bounds center; no rotation, scale or other LODs. Evidence
|
Nostatic_mesh toolset covers LODs, materials and Nanite; no transform bake. Evidence
|
Notranslate_mesh edits a DynamicMeshActor in the level, not a static mesh asset; no asset transform bake. Evidence
|
NoNo mesh transform op; Python would need a per-LOD GeometryScript loop, as no engine API bakes a transform into all LODs. Evidence
|
Nocenter_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. | YesParametric 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. |
PartialParametric 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.
|
PartialParametric blockout primitives (stairs, arches) (Partial): add_cube, add_sphere, add_cylinder, add_cone components only; no stairs or arches.
Spline-driven sweep, loft and revolve (No): No sweep, loft or revolve; grep found only PCG DrawSpline and PCG Spawn Spline Mesh node names.
|
YesParametric 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.
|
NoParametric 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.
|
PartialParametric 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Widget Blueprint CRUD | Yescreate_widget_blueprint, add, set, describe, remove_widget, rename, reparent, duplicate. Evidence |
Yescreate, read_tree, add_widget, remove_widget, move_widget, set_property, set_style, list, bulk_set_properties. Evidence |
YesUMGToolSet: CreateWidgetBlueprint, AddWidget, GetWidgets, Move/Remove/RenameWidget, CompileWidgetBlueprint. Evidence
|
Yescreate_widget_blueprint, add panel/content widgets, rename, reparent, remove_widget, get_widget_info. Evidence
|
PartialWidgetService edits tree and properties; asset create only via Python factory script. Evidence
|
Yesui.create_widget_blueprint, add_widget, remove_widget, rename_widget, move_widget, get_widget_tree, set_widget_property. Evidence
|
| UMG animation CRUD | YesCreate/delete animations, add tracks and keyframes, JSON export/import of animation tracks. Evidence |
Yescreate/delete/get animation, add/remove track, add/remove key and event key, bind animation events. Evidence |
NoNo WidgetAnimation tools in UMGToolSet; sequencer.py tools accept only LevelSequence. Evidence
|
Yescreate_widget_animation, add_animation_track, add_animation_keyframe, delete_animation; set_animation_loop and _speed store nothing. Evidence
|
YesList, create, remove animations, add tracks and keyframes. Evidence
|
Yesui.create_animation, add_animation_keyframe, list_animations, get_animation_details, remove_animation. Evidence
|
| MVVM bindings | NoSearched Source, Content, wiki-src and wiki for mvvm/viewmodel; only Niagara view model hits. Evidence
|
PartialNo MVVM action; only via gated execute_python calling the BlueprintCallable MVVMEditorSubsystem. Evidence
|
YesMVVMToolset: CreateViewModel, AddViewModelToWidget, CreateViewBinding; separate plugin, not in AllToolsets. Evidence
|
NoSearched MVVM and ViewModel in plugin and src; hits only in Niagara view models, no UMG MVVM. Evidence
|
YesList/add/remove ViewModels and ViewModel bindings with binding modes. Evidence
|
NoSearched MVVM and ViewModel across Source; only Niagara editor ViewModel includes, no MVVM binding actions. Evidence
|
| Audio PCM decode | PartialSoundWave PCM decode ships but feeds only analysis, granular and export checks; no verb returns decoded samples. Evidence
|
Yesextract_pcm decodes a SoundWave to 16 bit interleaved PCM returned as base64. Evidence |
NoNo decode tool; MCP can wrap a USoundWave return as audio content but no shipped tool returns one. Evidence
|
NoSearched RawPCMData, GetImportedSoundWaveData, RawData.Lock; get_audio_info returns duration, rate, channels. Evidence
|
NoSearched for PCM, RawPCMData, decode; SoundWave info returns duration, rate, channels only. Evidence
|
NoSearched RawPCM, DecodeCompressed, ImportedSoundWave, GetPCM; get_sound_wave_info returns metadata only. Evidence
|
| Extract widget subtree | Partialexport_xml/describe take widgetName for subtree export, widget.duplicate copies subtrees; no extract to new WBP op. Evidence |
Yesextract_subtree lifts a designer subtree into a new WBP via the UMG clipboard serializer, dryRun default. Evidence |
PartialGetWidgetDescription reads a subtree from StartWidget as text; no extract into a new widget asset. Evidence
|
NoSearched extract_widget and subtree ops; get_widget_info lists the whole tree flat, no subtree extraction. Evidence |
NoSearched for subtree extract or convert to user widget: not found; only reparent and remove. Evidence
|
NoSearched subtree/extract actions; dump_ui_spec takes whole WBP only, no extract to new WBP. Evidence
|
| Widget tree as markup (export/import) | Yeswidget.export_xml and widget.import_xml round trip the tree as XML markup. Evidence |
PartialExport only: read_tree JSON, epic_get_widget_description text dump (UE 5.8); no markup import found. Evidence |
PartialGetWidgetDescription exports an indented text dump with props; no import from markup. Evidence
|
Partialget_widget_info exports tree as JSON (class, parent, slot, text); no markup import or round trip. Evidence
|
PartialGetWidgetSnapshot exports tree, slots, properties as structs; no markup format or import. Evidence
|
Yesui.dump_ui_spec exports JSON UISpec; ui.build_ui_from_spec rebuilds or patches the WBP from it. Evidence
|
| Widget preview capture without PIE | Yeswidget.screenshot_designer captures the Designer preview to PNG without PIE; showOnly, hide and visibility overrides auto-revert. Evidence |
PartialNo widget renderer; capture_screenshot target=window of an open designer, or epic_screenshot (UE 5.8 only). Evidence |
PartialCaptureAssetImage renders an asset thumbnail; Slate Screenshot of an open designer tab. Evidence
|
Partialpreview_widget only opens the Widget Blueprint Editor; image needs a full_editor_window screenshot. Evidence |
YesCapturePreview renders the WBP offscreen with FWidgetRenderer to a PNG. Evidence
|
Yeseditor.capture_scene_preview with asset_type widget renders a WBP via FWidgetRenderer. Evidence
|
| Widget tree refactors (wrap, change class) | Yeswidget.wrap wraps in a new panel; widget.replace_class swaps class keeping children and slot. Evidence |
PartialNative wrap_root only; wrap any and change class via wrapped Epic toolset, UE 5.8 only. Evidence
|
YesWrapWidgets and ReplaceWidgetWithTemplate (change class, keeps bindings), ReplaceWidgetWithChild. Evidence
|
Partialreparent_widget moves a widget to another panel; no wrap or change widget class op. Evidence |
PartialReparentWidget moves a widget to another panel; no wrap or change class op. Evidence
|
PartialClass change only for Button/TextBlock/Border to CommonUI and reparent_widget_root; no generic wrap. Evidence
|
| Wait-for and assert on live UI | Yesdrive.wait_for and drive.expect assert conditions against the live UI surface. Evidence |
Partialepic_wait_for checks text present or gone once, no blocking wait; via wrapped Epic toolset, UE 5.8 only. Evidence |
PartialSlate Inspector WaitFor checks text present or gone once and returns immediately; no blocking wait, caller polls. Evidence
|
NoSearched catalog and handlers for wait, assert, expect, poll UI actions; none. Evidence
|
PartialPIE scenarios offer fixed waits and generic Python or log asserts; no widget specific wait. Evidence |
NoSearched ui and editor action lists for wait or assert on live widgets; PIE smoke samples anim vars only. Evidence
|
| MetaSound / SoundCue graph as text | Yesdecompile_metasound emits MSIR text; decompile_sound_cue emits SCIR text; decompile only, no text import yet. Evidence
|
PartialJSON readback (metasound_read_document, cue_get_graph) and JSON spec authoring; no text IR. Evidence
|
NoNo sound graph text export; grep SoundCue/MetaSound across Toolsets found nothing. Evidence
|
Noget_audio_info returns SoundCue node count and root name only; no MetaSound or cue graph dump. Evidence |
PartialStructured node and connection lists for both graph types; no text format or import. Evidence
|
PartialJSON readback (get_metasound_graph, get_sound_cue_graph) and build_*_from_spec JSON authoring; no text IR. Evidence
|
| Level acoustics and sound propagation analysis | NoSearched wiki for acoustic, propagation, occlusion analysis; only reverb volume creation exists. Evidence
|
NoSearched acoustics, propagation, reverb analysis; only AudioVolume placement exists, no analysis. Evidence |
NoNo acoustics or propagation analysis; searched Toolsets for sound, audio, occlusion. Evidence
|
NoOnly creates audio and reverb volumes; no acoustics or propagation analysis found. Evidence
|
NoSearched for acoustics, occlusion, reverb volume, propagation: not found. Evidence
|
Yesmesh.analyze_room_acoustics RT60 and mesh.analyze_sound_propagation occlusion plus navmesh paths. Evidence
|
| UMG property bindings (create and validate) | Yeswidget.bind writes the Bindings entry, checks it with IsBindingValid and generates the handler graph; multicast events refused. Evidence
|
Partiallist_bindings and clear_binding only; no action creates a designer property binding. Evidence
|
NoNo property binding tool; BindToEventProperty binds multicast events only; Bindings are read only for reference tracing. Evidence
|
Nocreate_property_binding returns NOT_SUPPORTED and writes nothing; Bindings is not script-exposed, so no Python route. Evidence
|
NoBindEvent binds multicast events only; no designer property binding (MVVM bindings are a separate row). Evidence
|
Partialui.get_widget_bindings reads designer bindings; no create or validation. Evidence
|
| Widget animations as data (export and import) | Yesexport_ and import_animations_json round trip float, color, byte, vector, text, 2D transform, material tracks; event tracks export only. Evidence
|
Partialget_animation reads every track and key value; writes are per key (add_animation_key), no document import. Evidence
|
NoNo widget animation tools; UMGToolSet reads animations only for variable reference tracing. Evidence
|
Noget_animation_info returns name, duration and track count; per-key writes only, no export or import. Evidence
|
NoListAnimations returns name, duration, track count; AddKeyframe writes one key; no export or import. Evidence
|
Partialcreate_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 | YesReal input, occlusion refusal and settle on web; drive.type writes via DOM; CEF host cannot start HTML5 drags. Evidence
|
PartialNo web UI op; only via execute_python (gated) calling WebBrowser.execute_javascript on a live widget; no DOM readback. Evidence
|
NoSearched toolsets, MCP and registry for WebBrowser, CEF, ExecuteJavascript: none; no Python or console escape hatch. Evidence
|
PartialNo web UI op; only via execute_python calling WebBrowser.execute_javascript; its own JS bridge drives only the Fab browser. Evidence
|
PartialNo web UI op; only via execute_python_code calling WebBrowser.execute_javascript on a live widget; no DOM readback. Evidence
|
PartialNo web UI op; only via editor.run_python calling WebBrowser.execute_javascript on a live widget; no DOM readback. Evidence
|
| Checked UI actions (occluded target refused, settle, before/after diff) | Yesdrive.* refuse occluded (TARGET_OCCLUDED) or stale (TARGET_CHANGED) targets, settle per frame without sleeps, and return a before and after diff. Evidence
|
Noinvoke_runtime_function broadcasts the widget delegate with no hit test, settle or diff; searched settle, appeared, ui diff, occlusion. Evidence
|
NoSlate Inspector Click, Hover, Type and Drag return a bool; an unresolved ref fails, but no occlusion check, settle or diff. Evidence
|
PartialMouse click names the widget under the point and any mouse captor; no refusal, settle or diff. Evidence
|
NoNo live UI click op; searched settle, appeared, ui diff, occlusion in Source and Content: only unrelated hits. Evidence
|
NoOnly 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 | Partialinput_state: captor, capture, lock mode, X grabs; os_input and os_gesture: real mouse on X11, Windows untested. Evidence
|
NoOnly the keyboard focus path; searched mouse capture and lock mode, cursor captor and OS input APIs: none. Evidence
|
NoSnapshot flags keyboard focus; clicks are Slate events after SetCursorPos; no captor or capture mode readout, no OS input. Evidence
|
PartialMouse click result names the widget holding mouse capture; no capture or lock mode readout, no OS input injection. Evidence
|
NoSearched capture and lock mode, cursor captor and OS input APIs; only PostMessageW WM_CLOSE to end a standalone game. Evidence
|
NoOnly 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. | YesSoundCue 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.
|
YesSoundCue 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. |
NoSoundCue graph authoring (No): No SoundCue tools; grep soundcue across Toolsets, ToolsetRegistry, MCP sources found none.
MetaSound graph authoring (No): No MetaSound tools; grep metasound across Toolsets and MCP sources found nothing.
|
YesSoundCue 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.
|
YesSoundCue 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. |
YesSoundCue 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. | YesSound 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.
|
YesSound 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. |
PartialSound routing read (Partial): No routing tool; only generic ObjectTools get_properties on a sound asset (class, submix sends).
Submix / class / mix authoring (Partial): No submix/class/mix tools; only raw set_properties on existing assets, no create tool for these types.
|
PartialSound 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.
|
PartialSound 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.
|
YesSound 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. | YesProcedural 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.
|
NoProcedural 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. |
NoProcedural sound effect synthesis (No): No sound synthesis tools; searched Toolsets for sound, audio, synth.
Procedural adaptive music stems (No): No music or stem generation tools; searched Toolsets for sound, audio, music.
Offline MetaSound render to PCM (No): No MetaSound render tool; grep MetaSound across Toolsets found nothing.
SoundWave from raw PCM samples (No): No PCM to SoundWave tool; import_asset needs a file on disk and write_file writes text only.
|
NoProcedural 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.
|
PartialProcedural 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.
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.
|
PartialProcedural 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.
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. | YesObjective 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. |
PartialObjective 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. |
NoObjective audio measurement (loudness, spectrum) (No): No loudness or spectrum analysis; searched Toolsets and MCP sources for audio tools.
Reference vs candidate sound comparison (No): No sound comparison tool; searched Toolsets and MCP sources for audio tools.
Sound decomposition and recipe fitting (No): No sound decomposition or fitting tool; searched Toolsets for sound and audio.
Folder-wide audio defect audit (No): No audio audit tool; searched Toolsets for sound and audio.
|
NoObjective 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. |
NoObjective audio measurement (loudness, spectrum) (No): Searched for Loudness, LUFS, Spectrum, FFT: no audio analysis code.
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.
|
PartialObjective audio measurement (loudness, spectrum) (No): Searched loudness, LUFS, spectrum, FFT, RMS; loudness hits are AI noise event params only.
Reference vs candidate sound comparison (No): No sound comparison action found in registered audio.* action list.
Sound decomposition and recipe fitting (No): No sound decomposition or recipe fitting action in registered audio.* action list.
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. | PartialSpawn / 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.
|
PartialSpawn / 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.
|
PartialSpawn / inspect widget in PIE (Partial): StartPIE plus Slate Inspector Snapshot of visible windows; no tool to spawn a UMG widget in PIE.
Runtime widget interaction + delegates (Partial): Slate Inspector Click/Type/Hover/Drag drive any Slate UI incl PIE viewport; no UMG delegate firing.
Live widget delegate bindings (No): No live delegate listing; Slate Inspector has no delegate API, UMG BindToEventProperty is design time.
All live widget instances, per client (Partial): Snapshot walks all visible Slate windows; no UUserWidget instance list or per client grouping.
|
PartialSpawn / 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. |
PartialSpawn / 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.
|
PartialSpawn / 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. | PartialUI 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.
|
YesUI 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. |
PartialUI focus/navigation audit (Partial): Snapshot marks the keyboard focused widget; no navigation rule audit tool.
UI accessibility audit (Partial): Snapshot is an accessibility style tree using GetAccessibleText; no audit or rule checks.
CommonUI wiring audit (No): No CommonUI tools; grep CommonUI/CommonActivatable across Toolsets and MCP found nothing.
|
NoUI 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.
CommonUI wiring audit (No): Searched CommonUI, CommonActivatableWidget, CommonButton in plugin and src; no hits.
|
NoUI focus/navigation audit (No): Searched for focus, navigation rules, SetFocus in widget code: no UI audit found.
UI accessibility audit (No): Searched for accessibility in widget code: no UI accessibility audit.
CommonUI wiring audit (No): Searched for CommonUI and CommonActivatableWidget: no hits.
|
YesUI 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. | PartialRuntime 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. |
YesRuntime 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. |
PartialRuntime widget layout diagnostics (Partial): Snapshot lists per widget pos/size and disabled flags; hidden widgets skipped, no diagnostics.
BindWidget contract report (Partial): GetWidgets adds placeholders for unbound BindWidget props; CompileWidgetBlueprint reports BindWidget errors.
|
NoRuntime 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.
|
NoRuntime 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. |
PartialRuntime widget layout diagnostics (No): Searched CachedGeometry, TickSpaceGeometry, SlatePrepass, DesiredSize; no runtime layout action.
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. | YesDesign-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. |
NoDesign-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.
|
NoDesign-time widget geometry resolution (No): UMGToolSet has no geometry or layout solve; searched Geometry/DesiredSize/Layout in UMGToolSet.
Numbered-mark UI screenshot for targeting (No): Screenshot returns a plain image; refs only in text Snapshot, no numbered overlay drawing found.
|
NoDesign-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. |
NoDesign-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. |
NoDesign-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. | YesPlay 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. |
YesPlay 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. |
PartialPlay sound / ambient (Partial): No play sound tool; generic add_to_scene_from_asset can place a sound asset as an ambient actor.
Attenuation, spatialization, occlusion, concurrency authoring (Partial): No attenuation or concurrency tools; only raw set_properties on existing assets or components.
|
YesPlay 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.
|
PartialPlay sound / ambient (Partial): No play or ambient sound op in VibeUE; only via Python GameplayStatics or spawning actors.
Attenuation, spatialization, occlusion, concurrency authoring (Partial): Assigns attenuation and concurrency assets to cues, adds attenuation node; no asset authoring.
|
PartialPlay 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Idempotent operations (safe retry) | Partialcreate_* verbs update an existing same class asset in place so reruns are idempotent; subset of verbs. Evidence
|
YesNatural key plus onConflict skip|update|error convention (49 handler files); demo steps and execute_command exempt. Evidence
|
PartialNo general idempotency layer; a few Blueprint tools are documented as idempotent (add function graph, add event). Evidence
|
PartialGateway idempotencyKey replay ledger (TS and native) keyed per capability; not per handler state checks. Evidence |
PartialIdempotency in selected handlers (BT EnsureGraph, EnvQuery, Fab import) and bulk resume skip; no contract. Evidence |
PartialidempotentHint MCP annotation on a few actions; skip_existing/upsert params on some; no general guarantee. Evidence
|
| Domain knowledge / skills | YesEmbedded wiki (about 1,500 generated pages, 10 workflow guides) served by call(); no skill packs. Evidence
|
Yes6 SKILL.md guides installed to .claude/skills by init (Claude Code only); plugins add per-category knowledge md. Evidence
|
YesAbout 21 AgentSkills: 4 Editor, 7 Niagara, 8 PCG assets, Dataflow and ChaosCloth C++ skills. Evidence
|
Partial5 static knowledge topics via ue://knowledge resource plus 6 MCP workflow prompts; no skill files. Evidence
|
Yes39 markdown skill packs (90 docs) plus native UPerformanceTriageSkill, served via Epic AgentSkill. Evidence
|
Yes18 Claude skill files in Skills/ plus monolith.guide action serving MONOLITH_GUIDE.md sections. Evidence
|
| Custom code tasks in workflows | PartialNo workflow tasks; python.execute runs arbitrary scripts, which docs use as rebuildable build scripts. Evidence |
Yesclass_path to a project .ts/.js class extending UeMcpTask; can call other tasks and wrap built-ins. Evidence
|
PartialRestricted Python via execute_tool_script glues tool calls, but it is not a workflow task. Evidence
|
NoNo workflow code tasks; standalone system_control execute_python action exists outside any workflow. Evidence |
PartialScenario python_assert and python_assert_number evaluate a Python expression as a step. Evidence |
Partialeditor.run_python runs arbitrary Python as a standalone action; no workflow tasks. Evidence |
| Skill docs checked against live tools | PartialNo skills; wiki regenerates from live handler registry and a test lints overlays against served slugs. Evidence |
YescheckSkills flags category(action=...) refs absent from the action surface; CLI plugin check-skills. Evidence
|
NoListSkills/GetSkills/CreateSkill do no check of skill text against registered tools. Evidence
|
Partialprompts/get refuses a prompt whose capability id is missing from the registry; tests assert it too; no skills. Evidence |
Nocheck_skills_consistency.py checks dispatcher routes vs packs on disk, not vs live API. Evidence |
Nolint_agent_tools.py checks .claude/agents tool allowlists, not skills against the live registry. Evidence
|
| Skill install/list/get via tools | Partialcall() lists namespaces and call(path) returns any page; nothing to install, no skill packs. Evidence |
PartialOwn skills install only via CLI init/deploy; list/get/create via wrapped Epic toolset, UE 5.8 only. Evidence
|
YesAICallable ListSkills, GetSkills, CreateSkill and UpdateSkill in the AgentSkill toolset. Evidence
|
NoNo skill tools; prompts are listed via MCP prompts/list and prompts/get, no install. Evidence
|
PartialList/get via Epic AgentSkillToolset ListSkills/GetSkills (via Epic toolset); no install tool. Evidence
|
Partialmonolith.guide section skills_map lists skills and paths; install is manual copy to ~/.claude/skills. Evidence
|
| Built-in reference workflows | Partial10 task workflow guide pages (level building, profiling, flythrough...); documentation, not executable. Evidence |
YesShips niagara_fire, beacon, texture_bomb, neon_shrine and neon_shrine_cleanup flows. Evidence
|
NoNo workflow files ship; skills are instruction text only, e.g. default_outdoor_lighting. Evidence
|
Partial6 versioned workflow prompts (inspect-fix, asset-import, level-build...) are guidance only, not executable. Evidence
|
NoNo runnable workflow files shipped; skill workflows.md files are prose recipes. Evidence |
Partialmonolith.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. | PartialYAML 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.
|
YesYAML 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.
|
PartialYAML flow engine (No): No workflow engine or YAML; searched workflow/yaml. Only execute_tool_script batches tools in a Python 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.
Nested workflows (No): No workflow composition; searched workflow/include/subflow. Scripts are single inline run() functions.
Step output references (Partial): Only through execute_tool_script, where tool results are Python values passed between calls.
Runtime workflow parameters (No): execute_tool_script takes only the script text; no parameter binding or stored workflows found.
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.
Expected-failure steps (Partial): No expected failure step type; tool errors raise RuntimeError that a script can catch.
Workflow lifecycle hooks (No): No workflow lifecycle hooks; searched hook/on_start/on_finish/workflow.
Conditional steps (Partial): Only as Python if statements inside execute_tool_script; no declarative condition field.
Workflow dry-run / execution plan (No): No dry run or execution plan; searched dry_run/dryrun/validate_only/plan across MCP and Toolsets.
Skip steps at call time (No): No step skipping; there are no named workflow steps to skip.
Shell command steps (No): No shell steps; searched subprocess/CreateProc/ExecProcess. Sandbox allows only json, math, datetime, copy, re, time.
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.
HTTP API to run workflows (No): HTTP endpoint serves only MCP JSON-RPC; no workflow run API found.
|
NoYAML 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. |
PartialYAML 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. |
PartialYAML 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.
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.
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. | PartialPer-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.
|
PartialPer-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.
|
PartialPer-step rollback / git snapshot (No): No git snapshot or per-step rollback; searched git/rollback/snapshot. Tool library calls only open an undo transaction.
Partial-write rollback of failing step (Partial): Blueprint DSL rolls back graph edits on failure; the transactional script runner is defined but unused.
|
PartialPer-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. |
PartialPer-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.
|
PartialPer-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 | PartialSeven proxy-local tools run with no editor (start, restart, build, build status, tests, test status, editor_list); every call() needs an editor. Evidence
|
PartialOnly filesystem reads work offline: INI parsing, C++ headers, asset dir listing, check_install. Evidence
|
NoTools run in the editor process; only commandlet is ToolHashMapping for analytics, not a tool server. Evidence
|
PartialOnly get_project_settings runs without editor, and only when no capability token is configured. Evidence
|
NoAll tools run in the editor process; skips services under commandlets. Searched for offline/commandlet mode. Evidence
|
Yesmonolith_query.exe and monolith_offline.py serve source, project and reflection queries read-only offline. Evidence |
| Network MCP transport (HTTP/SSE) | YesStreamable HTTP at /mcp with SSE progress streams when the client accepts text/event-stream. Evidence
|
NoSearched src for SSE and Streamable HTTP; MCP is stdio only. Loopback HTTP exposes only flow routes. Evidence
|
YesStreamable HTTP: POST/GET/DELETE on /mcp, SSE event stream responses, default port 8000. Evidence
|
YesNative Streamable HTTP with SSE at http://localhost:3000/mcp inside the plugin. Evidence |
PartialVia Epic toolset: tools ride Epic's HTTP endpoint 127.0.0.1:8000/mcp; VibeUE has no own transport. Evidence
|
YesIn-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 | NoBind is hardcoded to loopback and docs forbid LAN exposure; bearer token auth exists but only for local use. Evidence
|
NoBridge binds 127.0.0.1 with no auth; flow HTTP has a token but rejects non localhost Host headers. Evidence |
NoBinds localhost by default; LAN needs engine ini BindAddress and then has no auth, only Origin check. Evidence
|
YesNon-loopback bind refused unless bRequireCapabilityToken is on; token on by default. Evidence
|
NoREADME states endpoint is loopback only with no authentication; no auth code found in Source. Evidence
|
NoBinds all interfaces with no auth; only a CORS origin check; docs tell users to firewall port 9316. Evidence |
Extensibility (plugin system)
23 / 26| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Aggregate external MCP servers as tools | Nomcp_proxy.py only bridges stdio to its own editor; no aggregation of other MCP servers. Evidence |
NoSearched for MCP client SDK imports, StdioClientTransport, mcpServers; only client config writing, no proxying. Evidence |
YesMCPClientToolset proxies external MCP servers (SSE, Streamable HTTP, OAuth) as toolsets. Evidence
|
NoSearched src for MCP client SDK imports (sdk/client) and proxying. The server does not aggregate other servers. Evidence
|
PartialVia Epic toolset: engine MCPClientToolset is the outbound MCP client; VibeUE has none of its own. Evidence
|
NoProxy 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++. | PartialInject 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.
|
YesInject 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. |
PartialInject actions into built-in categories (No): Toolset name is class plus module qualifier and duplicates are rejected, so built-in toolsets cannot gain tools.
Provide new top-level categories (Yes): Any UE plugin registers a new UToolsetDefinition (C++ or Python); each shows as its own toolset.
Ship native C++ handlers (versioned ABI) (Yes): C++ UToolsetDefinition static AICallable UFUNCTIONs; GetToolsetVersion string; ABI is the engine module ABI.
Declarative native handlers (no glue code) (Yes): Static UFUNCTION(meta=(AICallable)) is exposed with schema from reflection, no dispatch glue.
Typed task SDK for plugin actions (Yes): Python @tool_call requires type annotations and builds JSON schema; C++ uses UFUNCTION reflection.
Sibling C++ plugin pattern (Yes): Toolsets ship as separate plugins that register UToolsetDefinition classes; AICallable UFUNCTIONs become tools.
|
PartialInject 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.
Sibling C++ plugin pattern (Partial): Exported subsystem has public RegisterHandler, but no documented sibling plugin path; gateway catalog is fixed.
|
PartialInject 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.
|
PartialInject 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. | Partialplugin 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.
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.
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.
Plugin update command (No): No extension update command. Searched scripts and Source.
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.
|
Partialplugin 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.
|
Partialplugin install CLI (No): No MCP plugin install CLI; toolsets are UE plugins added by hand; PluginToolset only enables existing ones.
Public plugin registry / catalog (No): No toolset registry or catalog service found; searched for registry URL, catalog, marketplace code.
Install a plugin by registry slug (No): No install by slug; searched ToolsetRegistry, ModelContextProtocol and PluginToolset for install/download.
Plugin publish CLI (No): No publish command found in MCP, ToolsetRegistry or Toolsets sources.
Plugin scaffold generator (Partial): PluginToolset CreatePlugin scaffolds a generic UE plugin from templates; no toolset specific template.
Plugin semver pin in project config (Partial): Engine .uproject plugin reference can pin an exact integer Version, enforced by PluginManager; no semver range.
Plugin uninstall with clean removal (No): No uninstall; PluginToolset SetPluginEnabled can disable a plugin, files stay.
Plugin update command (No): No update command; searched PluginToolset and ToolsetRegistry for update/upgrade of plugins.
Runtime introspection (list / describe) (Yes): list_toolsets and describe_toolset meta tools return toolset catalog and per tool JSON schemas.
Per-project plugin sets (multi-editor) (Yes): Each editor runs its own server; toolset plugins enabled per .uproject plus per-project allow/block lists.
|
Noplugin 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.
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.
Plugin semver pin in project config (No): No project config that pins plugin versions.
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. |
Partialplugin install CLI (No): No MCP plugin install command; searched install/plugin/npm CLI in Source, scripts, *.ps1, README.
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.
|
Partialplugin 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.
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. | NoKnowledge 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 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.
|
YesKnowledge 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.
|
YesKnowledge files merged into AI docs (Partial): Plugins ship UAgentSkill text read on demand via ListSkills/GetSkills; server Instructions field is never set.
Plugins ship agent skills (namespaced) (Yes): UAgentSkill subclasses in any plugin (C++ or Python @agent_skill) are listed by full class path.
Plugins ship workflows (flows) (No): No workflow or flow concept found in ToolsetRegistry or ModelContextProtocol headers.
Plugins ship call guards (No): No plugin supplied pre-call hooks; searched for pre-execute, guard, approval; only config block lists.
|
NoKnowledge 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.
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. |
PartialKnowledge 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. |
NoKnowledge 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. | PartialUE-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.
|
YesUE-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.
|
PartialUE-side dependency check (.uplugin) (Yes): Toolsets are UE plugins; .uplugin Plugins dependencies such as ToolsetRegistry are enforced by the engine.
Server-version gate for plugins (Partial): Only the engine's generic .uplugin EngineVersion check; no toolset registry or MCP server version gate.
Degraded plugin loading, warnings to agent (No): Failed toolset registration or reload is written to the editor log only, not reported to the agent.
|
NoUE-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.
Degraded plugin loading, warnings to agent (No): No plugin loading. Invalid handler-aliases.json entries are skipped with an editor log warning only. |
NoUE-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.
|
PartialUE-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. | PartialProject 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. |
PartialProject 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.
|
PartialProject tools in Python/C++ with hot reload (Yes): toolset_registry.reload_module re-registers Python toolsets; C++ via LiveCodingToolset 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.
|
PartialProject 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. |
PartialProject 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.
|
PartialProject 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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Sequencer FBX animation import/export | Yessequencer.import_fbx and sequencer.export_fbx wrap the engine Level Sequence FBX importer and exporter. Evidence |
PartialOnly epic_export_fbx, epic_import_fbx and rig FBX actions; via wrapped Epic toolset, UE 5.8 only. Evidence
|
Yesexport_fbx and import_fbx on level sequences, plus export_fbx_from_rig and import_fbx_to_rig. Evidence
|
PartialNo Sequencer FBX import/export; FBX only in asset import. Reachable via execute_python only. Evidence
|
PartialNo VibeUE code; via Epic toolset export_fbx/import_fbx and Control Rig FBX import/export. Evidence
|
PartialNo Sequencer FBX import/export action (searched ExportLevelSequenceFBX, SequencerFBX). Only via run_python. Evidence
|
| Component bindings and actor rebinding | Yesadd_actor/add_actors take componentName for nested component bindings; sequencer.repoint_actor rebinds actors. Evidence
|
PartialNative only creates actor possessable bindings; rebind_component and replace_binding via wrapped Epic. Evidence
|
Yesrebind_component, replace_binding_with_actors, fix_actor_references, custom bindings. Evidence
|
PartialChild component bindings only made internally for material and particle tracks; no actor rebind op. Evidence
|
PartialNo VibeUE code; via Epic toolset rebind_component, replace_binding_with_actors, get_child_possessables. Evidence
|
Partiallevel_sequence.list_bindings reads possessable/spawnable bindings; no rebind action, run_python needed. Evidence
|
| Camera rig rail/crane and shot tracks | Yesadd_camera_rig_rail, add_camera_rig_crane, add_camera_track (camera cut) and get_camera_cut_track. Evidence
|
PartialNative CameraCut track and section only; no rail, crane or shot track support found. Evidence
|
Partialcreate_camera and camera cut binding exist; shot tracks only via generic add_track_to_sequence; no rail/crane tool. Evidence
|
Yesconfigure_camera_rig_rail/crane spawn rig and set position, pitch, yaw, arm; add_shot_track exists. Evidence
|
PartialNo rail/crane or shot op; Epic toolset has create_camera and generic add_track_to_sequence; else Python. Evidence
|
PartialNo rail/crane rig, camera cut or shot track actions (searched CameraRigRail, ShotTrack). run_python only. Evidence
|
| Movie Render Queue rendering | Yesmrq namespace creates, lists and runs MRQ jobs, authors presets; run_jobs returns a ticket and output facts. Evidence
|
Partialrender_sequence_frames writes PNGs via SceneCapture2D, not Movie Render Queue; no MRQ actions found. Evidence
|
NoSearched MovieRender and MoviePipeline in all toolsets and the MCP plugin; none found. The script sandbox does not expose the unreal Python module. Evidence
|
Yescreate_render_job, queue_render, start_render, passes, burn-ins, AA and output settings via MRQ. Evidence |
PartialNo MRQ op in VibeUE or Epic toolsets; only via execute_python_code escape hatch. Evidence
|
PartialNo Movie Render Queue action (searched MoviePipeline, MovieRenderQueue). Only via editor.run_python. Evidence
|
| Movie Render Queue output verification (decoded frames, bitrate) | Yesmrq.run_jobs decodes sample frames, flags blank, crushed or flat ones, fails uniform output, checks bits per pixel; create_job adds preflight. Evidence
|
NoNo MRQ; render_sequence_frames writes SceneCapture PNGs with timings only, no frame content or bitrate checks. Evidence
|
NoNo MRQ tools, so no output checks; searched MovieRender and MoviePipeline. Evidence
|
PartialMRQ render reports output files (executor data or file deltas) and render passes; no frame decode, content or bitrate check. Evidence
|
NoNo MRQ op; frame checks would be agent-written analysis over execute_python_code output. Evidence
|
NoNo MRQ op; frame checks would be agent-written analysis over editor.run_python output. Evidence
|
| Control Rig keying and baking to AnimSequenceKeys Control Rig in Sequencer, bakes spaces, and bakes performances to animation assets. | YesControl 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.
|
PartialControl 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.
|
YesControl Rig keying and space baking (Yes): Typed Control Rig set/get, key_controls_at_frames, set_space, bake_space with key reduction.
Bake Sequencer performance to AnimSequence (Yes): export_anim_sequence wraps SequencerTools.export_anim_sequence; link_anim_sequence keeps it synced.
|
PartialControl 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.
|
PartialControl Rig keying and space baking (Partial): No VibeUE code; via Epic toolset AnimationAssistantToolset key_controls and bake_space (experimental plugin).
Bake Sequencer performance to AnimSequence (Partial): No VibeUE code; via Epic toolset import_export.export_anim_sequence in AnimationAssistantToolset.
|
PartialControl 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. | YesSequencer (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.
|
YesSequencer (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.
|
YesSequencer (Yes): AnimationAssistantToolset: sequencer tools for create, playback, bindings, keyframing, camera.
Deterministic frame scrub and transform read (Yes): set_playhead_frame plus get_actor_transform_at_frame returns world location and rotation at a frame.
|
PartialSequencer (Yes): manage_sequence: create, tracks, bindings, keyframes, play, Movie Render Queue, Take Recorder.
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.
|
PartialSequencer (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.
|
PartialSequencer (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| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| Diagnostic view modes for captures | YesviewMode param on capture verbs renders one capture and restores both viewport mode slots on exit. Evidence
|
Partialset_view_mode is a separate persistent call with rollback; captures take no view mode, no auto restore. Evidence
|
NoNo view mode tool or param; CaptureViewport only hides and restores gizmo and selection show flags. Evidence
|
Partialset_view_mode is a separate global viewport op; screenshot takes no view mode and restores nothing. Evidence
|
Partialset_view_mode exists as a separate call; captures take no view mode and nothing restores it afterward. Evidence
|
Partialcapture_with_overlay sets 5 show flags on a transient capture of one static mesh; nothing to restore. Evidence |
| Screenshots with measured overlays | Yesrender.capture_annotated paints axes, Z=0 grid, actor AABBs with size labels; image.annotate adds world marks. Evidence |
PartialGrid and actor label/position overlay only via wrapped Epic toolset, UE 5.8 only; native run_stat overlays. Evidence
|
YesCaptureViewport annotations draw a world grid with meter coordinates and actor labels with position data. Evidence
|
NoScreenshot returns PNG plus camera pose and size; no drawn overlays. Searched overlay, annotate, DrawLine. Evidence
|
PartialVia Epic toolset: CaptureViewport annotations overlay a world grid and actor labels; VibeUE adds none. Evidence |
NoSearched annotate, ruler, DrawText, FCanvas on images; overlays are show flags or spawned boxes only. Evidence
|
| Per-capture preview lighting rig with measured restore | YespreviewScene on asset captures sets key aim, intensity, colour, sky and floor for one capture, then restores the rig and measures the restore. Evidence |
Norender_preview and capture_scene_png take no lighting input; searched AssetViewerSettings, key light, light direction. Evidence
|
NoCaptureAssetImage renders a default thumbnail with no lighting parameter; searched AssetViewerSettings and light params. Evidence
|
Nogenerate_thumbnail has no lighting input; lighting actions light the level, not a capture. Evidence
|
NoCaptureScene takes pose, size and exposure only; searched AssetViewerSettings and light params. Evidence
|
Nocapture_scene_preview takes camera, seek time and size, no lighting; searched AssetViewerSettings and light params. Evidence
|
| Capture readiness and contamination report | YesCaptures refuse CAPTURE_NOT_READY and MATERIAL_FALLBACK, warm up until frames settle, and report engine warning text burned into the frame. Evidence
|
Partialcapture_scene_png force-streams textures (fullyLoadTextures) before capture; compile state and contamination are not reported. Evidence
|
PartialCaptureAssetImage waits for compile and streaming (10 s timeout); CaptureViewport hides gizmos and selection; nothing is reported. Evidence
|
NoScreenshot only flushes rendering commands; searched shader compile, fallback material and on-screen message checks on capture paths. Evidence
|
NoCaptureScene only flushes rendering commands; searched shader compile, fallback material and on-screen message checks. Evidence
|
PartialNiagara 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 | Yestexture.get_pixel_stats: per-channel mean/min/max, grayscale flag and content hash for any mip, sub-rectangle or tile grid. Evidence |
NoNo pixel read; compare_textures checks size, format and source id equality only. Evidence
|
NoTexture toolset has only import_file and get_size. Evidence
|
NoTexture info returns size, format, mips and compression; source pixels are read only by pixel-editing ops. Evidence
|
NoSearched texture source mip reads and channel stats; only viewport and render-target ReadPixels for captures. Evidence
|
Partialeditor.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. | YesIsolated 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. |
PartialIsolated 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.
|
PartialIsolated asset capture without level spawn (Yes): CaptureAssetImage renders an asset thumbnail via ThumbnailTools with no level spawn; levels rejected.
Multi-angle shot sets (orbit, ortho sides) (Partial): CaptureViewport takes one optional perspective pose per call; no orbit or ortho set, loop it yourself.
|
PartialIsolated 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.
|
PartialIsolated 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.
|
PartialIsolated 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. | YesImage 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. |
PartialImage 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.
|
PartialImage A/B diff with measured statistics (No): Searched for image diff, compare, pixel diff, SSIM, PSNR, histogram; no image comparison tool found.
Animation frame captures with pose-change proof (Partial): Viewport screenshot plus Sequencer playhead set allows frame captures; no pose change check.
|
NoImage A/B diff with measured statistics (No): Searched image diff, compare, pixelmatch, SSIM, visual regression in plugin and TS; nothing found.
Animation frame captures with pose-change proof (No): Searched animation frame capture and pose diff; none found. |
PartialImage A/B diff with measured statistics (No): Searched image diff, compare image or screenshot, pixel diff, ssim; no image comparison operation found.
Animation frame captures with pose-change proof (Partial): Renders PNG pose captures per time or frame count; no pose change comparison or proof.
|
PartialImage 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. | YesZ-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. |
NoZ-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.
|
PartialZ-fighting detection with culprit actors (No): Searched toolsets, MCP and registry for z-fight, coplanar, overlap render checks; no such tool exists.
Blank or out-of-frame capture detection (Partial): No blank image check; GetVisibleActors frustum test and WorldPosToScreenCoords allow manual in-frame checks.
Camera path motion-quality gate (No): Searched toolsets and MCP plugin for jerk, smoothness, motion quality and camera path checks; none.
|
NoZ-fighting detection with culprit actors (No): Searched plugin and TS source for z-fight, coplanar, overlapping faces; no detection operation found.
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.
|
NoZ-fighting detection with culprit actors (No): Searched z-fight, coplanar, depth fight in Source and Content; no detection or culprit actor reporting.
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.
|
PartialZ-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.
|
Also possible without an MCP server
26 / 26These 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.
| Feature | PinWright | ue-mcp | Epic UE 5.8 MCP | ChiR24 Unreal_mcp | VibeUE | Monolith |
|---|---|---|---|---|---|---|
| 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. | YesHeadless 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.
|
YesHeadless 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. |
NoHeadless build command (No): No headless build command; searched UnrealBuildTool/Build.bat/RunUAT; only CompileLiveCoding in running editor.
Headless UBT build (No): No UBT invocation; only Live Coding compile from inside the running editor.
|
YesHeadless 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. |
PartialHeadless 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.
|
NoHeadless 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. | Partialeditor_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 |
Yesbuild_project returns compiler output; get_log, search_log over 4096 line ring, get_message_log. Evidence |
YesGetLogEntries filters session log by category and regex; Live Coding returns UBT diagnostics. Evidence
|
Yesread_log filters by text, category, severity; can read the UBT build log and the previous run's log. Evidence |
PartialGetEnvironment reports last build status; Analyse scans trace; log search via Epic toolset LogsToolset. Evidence
|
Yesget_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. | NoSearched GenerateProjectFiles and ProjectFiles; no op. editor_build builds the editor target only. Evidence
|
Yesproject.generate_project_files launches GenerateProjectFiles script or UBT; needs live editor. Evidence
|
NoSearched GenerateProjectFiles, UnrealBuildTool; no project file generation tool. Evidence
|
NoSearched GenerateProjectFiles, generate_project_files, projectfiles; no op. Evidence
|
NoSearched GenerateProjectFiles in Source, scripts and docs; no matches. Evidence
|
NoNo 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. | PartialNo header lint or source symbol check; reflection lookups only confirm live UCLASS/UFUNCTION symbols. Evidence
|
Yesverify_symbols, lint_cpp_header, suggest_build_deps against a regex engine symbol index. Evidence |
NoSearched symbol, header, lint, include; no C++ symbol verification or header lint tool. Evidence
|
NoSearched symbol verify, header lint, header; no C++ source analysis ops. Evidence
|
NoSearched for symbol verification, header lint, include checks; none found. Evidence
|
Yessource.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. | Partiallaunch_standalone starts 1 to 8 -game processes; standalone_status: exit code, log tail; trace via extraArgs. Evidence
|
Yeslaunch_standalone with -trace/-tracefile, get_standalone_status, stop_standalone. Evidence |
NoStartPIE downgrades NewProcess and other out of process play modes to in viewport; no game launch. Evidence
|
Partiallaunch_build runs packaged Win64 game offscreen with log tail and map list; no trace capture. Evidence |
YesStartStandalone launches separate game process with Insights trace; Stop and status verify PID and file. Evidence
|
NoNo 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. | NoSearched SetEnabled, enable_plugin, uplugin; only game_features.list reads plugin state. Evidence |
Yesenable_plugin, disable_plugin edit .uproject; list_available_plugins. Evidence |
YesPluginToolset SetPluginEnabled, IsEnabled, ListEnabledPlugins, ListDiscoveredPlugins. Evidence
|
Yesenable_plugin, disable_plugin, list_plugins via IProjectManager::SetPluginEnabled. Evidence |
PartialVibeUE only lists enabled plugins in GetEnvironment; toggle via Epic toolset PluginToolset. Evidence
|
NoOnly 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). | NoSearched plugin creation and .uplugin edit ops; none found. Evidence
|
Partialepic_create_plugin, epic_update_plugin_descriptor via wrapped Epic toolset, UE 5.8 only. Evidence |
YesCreatePlugin from templates, GetPluginDescriptor, UpdatePluginDescriptor, Add/RemovePluginDependency. Evidence
|
NoSearched create_plugin, IPluginWizard, PluginUtils, descriptor writes; only enable/disable/list. Evidence
|
PartialNo VibeUE plugin authoring; via Epic toolset PluginToolset CreatePlugin, UpdatePluginDescriptor. Evidence
|
NoSearched 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. | NoRead/write project C++ (No): No file read/write namespace; searched wiki and Source for file/cpp/source ops.
Create C++ class (No): Searched GameProjectUtils, AddCodeToProject, create_cpp; no C++ class creation op.
|
YesRead/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. |
NoRead/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.
Create C++ class (No): Searched GameProjectUtils, NewClassDialog, AddCodeToProject; no C++ class creation tool.
|
PartialRead/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.
|
PartialRead/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.
|
PartialRead/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. | NoEngine source FTS search (No): Searched for engine source search or FTS ops in wiki and Source; none found.
Engine call graphs (No): Searched for call graph or callgraph ops in wiki and Source; none found.
|
PartialEngine 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). |
NoEngine source FTS search (No): No engine source search; SemanticSearchToolset searches indexed Content Browser assets only.
Engine call graphs (No): Searched for call graph, caller or callee tools across toolsets; none found.
|
NoEngine source FTS search (No): Searched FTS, full text, ripgrep, sqlite, engine source; no engine source search.
Engine call graphs (No): Searched call graph, callgraph, callers, callees; not found.
|
NoEngine 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.
|
YesEngine 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. | PartialSaved/Crashes is scanned only inside test run verdicts; no RPC lists crash reports. Evidence
|
Yeseditor list_crashes, get_crash_info, check_for_crashes backed by C++ handlers. Evidence |
NoSearched crash in MCP, ToolsetRegistry, Toolsets; LogsToolset reads only the current log. Evidence
|
Partialread_log source=previous reads earlier run logs; previous-session snapshot; no Saved/Crashes listing. Evidence
|
NoSearched CrashReportClient, Saved/Crashes, crash report in Source, Python, skills; only launch script kill. Evidence
|
Partialeditor 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. | PartialRead 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.
|
YesRead 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.
|
PartialRead INI (Partial): Settings section values via GetSectionPropertyValues; raw project Config .ini text only via sandbox script open().
Write INI (Partial): SetSectionProperties writes settings section properties to Default*.ini; no raw section/key write.
|
YesRead 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.
|
YesRead 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.
|
PartialRead 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. | Yeslocalization.gather and localization.compile run GatherText configs as tracked commandlet jobs. Evidence |
NoSearched GatherText, localization commandlet, localization target in src, plugin, docs; no action. Evidence
|
NoSearched locali, GatherText, gather; only StringTable editing, no gather or compile tool. Evidence
|
NoSearched GatherText, localiz, culture: only widget set_localization_key and bind_localized_text. Evidence |
NoSearched Localiz, GatherText, LocalizationCommandlet; only an FText type label. Evidence |
NoLocalization 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.
Architecture and install
1 / 26Yes
No C++ project needed on Windows: the prebuilt Win64 zip and Fab ship binaries. Linux needs a source build of the plugin.
EvidenceYes
Blueprint-only projects work, but a C++ toolchain (Visual Studio or Xcode) must compile the plugin.
EvidenceYes
Engine plugin with prebuilt editor DLLs; enabling it in a Blueprint project needs no C++ build.
EvidencePartial
A source install needs a project with a code target; a self-built package works in Blueprint-only projects.
EvidenceYes
C++ editor plugin, but BuildPlugin.bat builds it via UAT BuildPlugin without project Source.
EvidenceYes
Per-engine release zip ships precompiled DLLs, so Blueprint-only projects open without rebuilding.
EvidenceYes
Per engine version Win64 zips on GitHub Releases plus Fab listing; no Linux or Mac prebuilt.
EvidenceNo
No. Plugin ships as source only (plugin/ue_mcp_bridge has Source, no Binaries); compiled on first launch.
EvidenceYes
Precompiled Win64 editor binaries ship with the engine for MCP, ToolsetRegistry and toolset plugins.
EvidenceNo
No shipped binaries; release archives strip Binaries. Users can build their own via package-plugin script.
EvidencePartial
Repo ships no Binaries (MakePlugin.ps1 excludes them); prebuilt only through the Fab listing.
EvidenceYes
Release zips Monolith-vX-UE5.7.zip and -UE5.8.zip carry Win64 binaries plus proxy and query exes.
Evidence5.3 to 5.8
UE 5.3 to 5.8.
Evidence5.4 to 5.8
5.4 to 5.8 on Windows; 5.6+ on Linux and macOS; epic category needs 5.8+.
Evidence5.8
UE 5.8 only; plugin is part of the 5.8 engine tree, not a separate versioned install.
Evidence5.0 to 5.8
UE 5.0 to 5.8 per README badge, uplugin description and README note.
Evidence5.8+
5.8+ only (EngineVersion 5.8.0; depends on Epic 5.8 MCP and ToolsetRegistry).
Evidence5.7, 5.8
UE 5.7 and 5.8, one source tree, separate precompiled zip per engine.
EvidenceWindows, plus Linux from source
Windows (Win64) and Linux; no Mac. Prebuilt binaries are Windows only, Linux builds from source.
EvidenceWindows, Mac, Linux
Windows, macOS, Linux (Linux and macOS only from UE 5.6); bridge uses raw sockets for all three.
EvidenceWindows, Mac, Linux
Win/Mac/Linux editor: no PlatformAllowList in any .uplugin; Linux build intermediates present.
EvidenceWindows, Mac, Linux
Win64, Mac, Linux in module PlatformAllowList.
EvidenceWindows, Mac, Linux
Win64, Linux, Mac (module WhitelistPlatforms; .ps1 and .sh build scripts).
EvidenceWindows, 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.
EvidenceYes
No API key or account; only a local bearer token auto generated in Saved/PinWright/gateway-token.
EvidenceYes
No API key needed. Optional GitHub OAuth only for feedback(submit); ANTHROPIC_API_KEY only for a dev script.
EvidenceYes
No key needed; grep for Authorization, Bearer, api key, token in server source found nothing.
EvidenceYes
No external API key; auth uses a locally auto-generated capability token.
EvidencePartial
No key for most tools; a free vibeue.com API key is required for the terrain_data tools.
EvidenceYes
No API key or token; grep for bearer, api key, auth token in Source, Tools, MCP, Scripts found none.
EvidenceMIT
MIT.
EvidenceMIT
MIT.
EvidenceUE EULA
Unreal Engine EULA (source available, not OSS); plugins marked NoRedist.
EvidenceMIT
MIT for server and plugin.
EvidenceMIT
MIT, Copyright 2025 Kevin Buckley / Buckley Builds LLC.
EvidenceMIT
MIT.
Evidence1,305
1,305 operations in 67 public namespaces, all behind one MCP tool named call.
Evidence1,136 plus 830 wrappers
1,136 own actions plus 830 epic_ wrappers on UE 5.8. The README gives 1,103, an earlier count.
Evidenceabout 870
About 870: ~597 Python @toolset_registry.tool_call plus 273 C++ AICallable UFUNCTIONs, tests excluded.
Evidence389
389 capabilities across 23 internal parent tools behind one unreal gateway tool.
Evidence1,027
1,027 AICallable service methods in 37 headers plus 8 REGISTER_VIBEUE_TOOL tools; Epic toolsets extra.
Evidenceabout 1,400
About 1,400+ actions across 26 namespaces behind about 30 dispatch tools; live count via monolith_discover.
EvidenceYes
Setup screen one click writes project config for Claude Code, Codex, Cursor, Gemini CLI, VS Code.
EvidenceYes
init detects and writes configs for Claude Code, Claude Desktop, Cursor, Codex.
EvidenceYes
Console command writes URL configs for Claude Code, Cursor, VS Code, Gemini CLI, Codex; run manually.
EvidenceNo
Searched src and scripts for mcpServers, claude_desktop_config, .mcp.json writers; README has manual JSON.
EvidencePartial
Via Epic toolset: .mcp.json from ModelContextProtocol.GenerateClientConfig; VibeUE writes only the agent guide.
EvidenceNo
User writes .mcp.json by hand; grep for .mcp.json and mcpServers found only usage comments, no writer.
EvidenceYes
Server is in process C++; optional stdio proxy runs on UE bundled Python stdlib; direct HTTP needs nothing.
EvidenceNo
Requires Node.js (README says 18+, package.json engines >=20) plus PythonScriptPlugin in editor.
EvidenceYes
C++ HTTP server in editor; Python tools use the engine's bundled PythonScriptPlugin, no Node needed.
EvidenceYes
Plugin embeds MCP Streamable HTTP server; no Node.js or npm needed for that path.
EvidenceYes
Runs inside the editor; Python is the engine's embedded PythonScriptPlugin, no Node or external Python.
EvidenceYes
Native monolith_proxy.exe or direct streamableHttp config; only the Mac/Linux proxy script needs Python.
EvidenceFab, zip or source
Fab via Epic Launcher, prebuilt Win64 zip from GitHub Releases, or git clone and build; then Setup screen.
Evidencenpx 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.
EvidenceShips in engine
Ships in engine; enable ModelContextProtocol plus Toolsets plugins, then StartServer command or bAutoStartServer.
Evidencenpx and plugin copy
npx unreal-engine-mcp-server plus manual copy of plugin into Plugins/; or plugin only via native HTTP.
EvidenceSource build or Fab
git clone into Plugins then BuildPlugin.bat or BuildAndLaunchGame script; Fab listing also offered.
EvidenceSource or zip
git clone or release zip into Plugins/Monolith, then hand-write .mcp.json pointing at monolith_proxy.exe.
EvidencePartial
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.
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.
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.
Auto-updater (Not applicable): Ships as engine plugins inside UE 5.8; updates arrive with engine releases, no separate updater.
Upgrade notice in tool responses (No): Searched newer version, update available, upgrade, outdated in MCP, registry and toolsets; nothing found.
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.
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.
Upgrade notice in tool responses (No): Searched update available, newer/latest version, upgrade; no version check or notice in responses.
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.