Files
unreal-engine-mcp-system-pl…/FUTURE_MCP_TOOLS.md
Bonchellon eba71c4ca8 Unified, portable Unreal Engine MCP system plugin
Merge of the two project copies into one self-contained plugin (the superset:
variable_op + variables.py, full pcg_op runtime/declarative/preset ops, the
CreateWidgetFloatAnimation widget tool, and full Voxel graph authoring).

Made fully project- and machine-agnostic — no hardcoded paths:
- New src/projectPaths.js auto-detects the host .uproject (walk-up), project
  name, Editor build target, log file, and engine install (EngineAssociation
  via launcher manifest/registry, else installed-engine scan). All overridable
  via UE_* env vars.
- Rewired buildOrchestrator/insights/launcher/insightsExporter/server.js and the
  Python workers (cpp_scaffold, live_coding, apply_graph, console) off the old
  C:/Github/ihy, IHY*, E:/UE_Versions and UE_5.7 literals onto the resolver.
- Voxel made optional: Build.cs auto-detects the Voxel plugin (env
  UE_MCP_WITH_VOXEL override) and the C++ compiles to stubs under WITH_MCP_VOXEL,
  so the module builds in projects without Voxel; .uplugin marks Voxel optional.
- De-branded the agent-gateway and docs; scrubbed a leaked API key; excluded
  node_modules/Binaries/Intermediate/__pycache__/secrets from the repo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:07:24 +03:00

174 lines
6.8 KiB
Markdown

# UEBlueprintMCP — TODO / Future Tool Coverage
Domains still missing from the MCP surface. Ordered by likely value.
## High value (likely soon)
### pcg_op — mesh-entry & volume helpers (gap found building a PCG graph)
- `set_mesh_entries{asset_path, node, entries:[{mesh, weight?}]}` — populate a
PCGStaticMeshSpawner's weighted selector. Today this needs raw py: the
`mesh_selector_parameters` instance is READ-ONLY (can't reassign), so you must
mutate it in place — `msp.set_editor_property("mesh_entries", [...])` where each
entry is a `PCGMeshSelectorWeightedEntry` and the mesh goes on
`entry.descriptor.static_mesh` (struct is value-copy → set descriptor back).
- `set_node_property` struct coercion already handles Vector vs Rotator (3-num
list, Vector tried then Rotator(roll,pitch,yaw)) — extend to Vector2D/Color/
Transform as needed.
- `spawn_pcg_volume{graph, location, scale, name?}` + `generate{actor}` — wrap
PCGVolume spawn + `PCGComponent.set_graph` + `generate(True)`. Note: partitioned
worlds route instances to PCGPartitionActors async; count there, not on the volume.
### Sequencer / Cinematics
- create_level_sequence{path}
- add_binding{seq, actor_name}, remove_binding{seq, guid}
- add_track{seq, binding_guid, track_class} (Transform, Float, Visibility, ...)
- add_key{seq, track, time, value}
- set_playback_range{seq, start, end}
- bake_to_anim_sequence{seq, binding}
- spawn_camera_actor{location, rotation, fov?}
- export_video / export_image_sequence (MovieRenderQueue)
### GAS — Gameplay Ability System
- create_gameplay_ability_bp{path, parent?}
- create_attribute_set_bp{path}
- create_gameplay_effect_bp{path}
- add_gameplay_tag{tag}, remove_gameplay_tag{tag}, list_gameplay_tags{prefix?}
- gameplay_cue_create{path}
### Data-driven assets
- create_gameplay_tags_table{path}
- data_table_add_row{path, row_name, fields}
- data_table_set_cell{path, row, column, value}
- data_table_read{path, row?}
- curve_table_create / add_curve
- data_asset_set_property{path, property, value}
- enum_add_value, struct_add_field
### Physics / Chaos
- create_physics_asset{path, skeletal_mesh}
- create_physical_material{path, friction?, restitution?, density?}
- physics_constraint_set{component, properties}
- chaos_destruction_field_spawn
### Landscape / Foliage / World Partition
- landscape_create{section_size, components_per_section, ...}
- landscape_apply_material{path}
- landscape_paint_layer{layer_name, brush_op:'add|remove', position, radius}
- foliage_add_type{static_mesh, density?, ...}
- foliage_paint{location, radius}
- world_partition_set_loading_range{actor, range}
- hlod_build{level_path}
### Lighting
- build_lighting{quality:'preview|medium|high|production'}
- set_lumen{enabled, software_raytracing?, hardware_raytracing?}
- set_vsm{enabled, resolution?}
- light_set_property{actor_name, property, value}
### PIE (Play-In-Editor) control
- pie_play{mode:'selected|standalone|spawn_player', num_players?}
- pie_stop{}
- pie_pause / pie_resume
- pie_eject
- pie_screenshot{path}
- pie_console_command_in_session{command}
- pie_get_log{tail?, errors_only?}
### Editor / Project settings
- ini_get{config:'Engine|Game|Editor|Input', section, key}
- ini_set{config, section, key, value}
- plugin_enable{name} / plugin_disable{name} / plugin_list{}
- platform_target_settings{platform, key, value}
### Source Control (Perforce/Git/Plastic)
- sc_status{paths}
- sc_checkout{paths}
- sc_revert{paths}
- sc_submit{paths, description}
- sc_get_user_settings
### Cook / Package / Build
- cook_project{platform, maps?, options?}
- package_project{platform, build_config:'Development|Shipping', output_dir}
- build_lighting_then_save{level}
- check_cook_errors{platform}
## Medium value
### Niagara — extending the existing niagara_op
- set_module_input (currently stubbed) — write parameters into a module
- promote_to_user_parameter
- niagara_simulation_cache_record / play
### UMG — extending widget_op
- bind_property{widget, property, function_path}
- create_animation{widget, name, duration}
- add_animation_track{...}
- compile_and_preview
### Materials — extending material_op
- material_function_create
- material_layer_create / material_layer_blend_create
- substrate_topology helpers (if Substrate enabled)
- material_parameter_collection_create
### Localization
- loc_target_create / loc_gather / loc_compile
- text_add_to_target{namespace, key, source}
### Replication / Networking helpers
- bp_set_replication{bp_path, replicates?, replicates_movement?}
- bp_variable_set_replication{bp_path, name, replication:'None|Replicated|RepNotify'}
### Online subsystem / OSS / EOS
- launch_dedicated_pie_server
- set_steam_appid / set_eos_credentials
### Editor utility / Pipeline
- editor_utility_widget_run{path}
- editor_utility_blueprint_run{path, function}
- exec_python_file{path}
- exec_python_inline{code} — gated, dev-only
### Test / Automation
- automation_run{tests:'filter'}
- gauntlet_run{config}
- unit_test_blueprint{bp_path}
## Low priority / nice-to-have
- Composure (in-camera VFX)
- USD import/export
- Datasmith
- Pixel Streaming setup
- nDisplay
- VR/AR specific (OpenXR session, head tracking)
- Web Browser widget
- Movie Render Queue presets
- AI behavior debugging (LogVisualizer)
- Replay / DemoNetDriver
## Architecture improvements
- **Common helpers module** (`_common.py`) for `_tee`, `_load`, `_split_pkg`, `_vec`, `_rot` — every module currently duplicates these.
- **Versioned envelope** — include schema_version in every result for client compatibility.
- **Streaming results** — for long-running ops (cook, lighting build), stream progress via a separate channel instead of one blocking call.
- **Auto-discovery of ops** — generate the JSON schemas in server.js from python module introspection, so adding an op in python automatically exposes it.
- **Per-op permissions** — read-only vs mutating tag in schema so a client policy can block destructive ops.
- **Undo grouping** — wrap each entrypoint in `unreal.ScopedEditorTransaction` so every mutation is one undo step.
## BUG: apply_graph `spawn_actor` kind hard-crashes the editor (2026-06-22)
`apply_graph` node kind `spawn_actor``UMCPGraphLibrary::SpawnSpawnActorFromClassNode()`
(`MCPGraphLibrary.cpp:716`) calls `PlaceNode<UK2Node_SpawnActorFromClass>`, whose blind
`AllocateDefaultPins()` trips `check(Result)` in `EdGraphNode.h:586` and **takes the whole
editor down** (assertion → StaticShutdownAfterError). Reproduced 3x.
Workaround used: spawn from C++ instead (`UWorld::SpawnActor`) exposed via a
`UBlueprintFunctionLibrary`, or build the deferred-spawn pair manually with `call_function`
nodes (`GameplayStatics.BeginDeferredActorSpawnFromClass` + `FinishSpawningActor`).
Proper fix: construct `UK2Node_SpawnActorFromClass` via `FGraphNodeCreator<>` /
set the Class pin before `AllocateDefaultPins`, or guard the assert. Until fixed, **do not
use the `spawn_actor` kind**.