Back to Discover

Unreal-MCP

connector

aadeshrao123

Control the Unreal Engine 5 editor from any MCP client: Blueprints, materials, Niagara.

View on GitHub
0 starsSynced Aug 6, 2026

Install to Claude Code

/plugin marketplace add aadeshrao123/Unreal-MCP

README

UnrealMCP — AI Bridge for Unreal Engine 5

Control the Unreal Engine 5 editor from Claude Code, Cursor, Windsurf, or any MCP client. Build materials, wire Blueprint graphs, author Niagara systems, spawn actors, edit data tables and profile performance, all by asking for it. 288 commands across 15 categories, no leaving your terminal.

License: MIT UE 5.3+ MCP Pro version

This is the community edition

It is stable and feature complete for what it covers. It is not abandoned, and it is not in active development either: new subsystem work now goes into CodeFizz Editor Agent, the maintained commercial build. Everything here keeps working, issues still get read, and the MIT licence is permanent.

If you want Control Rig, PCG, Sequencer, Mutable, Procedural Vegetation, audio and MetaSounds, Behavior Trees and EQS, or packaged binaries for UE 5.6 / 5.7 / 5.8, that lives in Pro.


Community edition vs Pro

Community (this repo)CodeFizz Editor Agent (Pro)
Commands288900+
Categories1528
Engine supportBuild it yourself5.6, 5.7, 5.8
Blueprints, Materials, Niagara, StateTreeYesYes, and deeper
Control Rig, PCG, SequencerNoYes
Mutable, Procedural VegetationNoYes
Audio, MetaSounds, Sound CuesNoYes
Behavior Trees, EQSNoYes
Insights profilingBasicFull trace analysis
InstallClone, build, configureOne command, no compiler needed
UpdatesCommunity paceShipped continuously
SupportGitHub issuesPriority, private Discord

See the full command list → · Docs · 3 day free trial

Already on UE 5.8? Epic now ships a first-party MCP server in 5.8 (Experimental, localhost only). It is worth trying before you buy anything. This repo and Pro both also cover 5.6 and 5.7, which Epic's does not.


Two ways to use this repo

CLIMCP Server
Installnpm install -g unrealclipip install unrealmcp
DependenciesNone (single binary)Python 3.10+
Works withClaude Code (via Bash)Claude Code, Cursor, Windsurf, VS Code, Gemini CLI, Rider, Zed, Amazon Q
ProtocolDirect TCPMCP over stdio

Both talk to the same C++ plugin inside the editor. Use whichever fits your workflow, or both.


Quick Start

Option A: CLI (Recommended for Claude Code)

# 1. Install
npm install -g unrealcli

# 2. Go to any UE5 project and install the plugin
cd YourProject/
ue-cli init

# 3. Open the editor, then verify
ue-cli health_check

That's it. No Python, no config files, no MCP setup.

Option B: MCP Server (For Cursor, Windsurf, etc.)

# 1. Clone the plugin into your project
git clone https://github.com/aadeshrao123/Unreal-MCP.git Plugins/UnrealMCP

# 2. Install the Python MCP server
pip install unrealmcp

# 3. Add to your AI tool's config (see MCP Setup section below)

How It Works

                    ┌──────────────────────────────────────────┐
                    │         Unreal Engine 5 Editor            │
                    │                                          │
                    │   C++ Plugin (UnrealMCPBridge)           │
                    │   TCP server on localhost:55557           │
                    │   288 commands: materials, blueprints,   │
                    │   niagara, statetree, actors, data       │
                    │   tables, profiling, and more            │
                    └──────────────┬───────────────────────────┘
                                   │ TCP/JSON
                    ┌──────────────┴───────────────────────────┐
                    │                                          │
          ┌─────────┴─────────┐              ┌─────────┴──────────┐
          │   CLI (ue-cli)    │              │  MCP Server        │
          │   Go binary       │              │  Python (unrealmcp)│
          │   Direct TCP      │              │  stdio → TCP       │
          │                   │              │                    │
          │  Claude Code      │              │  Cursor, Windsurf, │
          │  (via Bash tool)  │              │  VS Code, Rider... │
          └───────────────────┘              └────────────────────┘

The C++ plugin runs inside the editor and exposes 288 commands over TCP. The CLI and MCP server are two different front doors to the same plugin.


CLI Reference

Installation

# From npm (recommended)
npm install -g unrealcli

# Or download binary directly from GitHub Releases
# https://github.com/aadeshrao123/Unreal-MCP/releases

Platforms: Windows (x64), macOS (Intel + Apple Silicon), Linux (x64 + ARM64)

Setup

# Navigate to your UE5 project
cd MyProject/

# Install the C++ plugin (one-time)
ue-cli init
# → Creates Plugins/UnrealMCP/ with C++ source
# → Patches .uproject to enable the plugin
# → Open editor to compile, then you're ready

# Verify everything works
ue-cli doctor

Usage

# Every command follows this pattern:
ue-cli <command> [--flag value]

# Examples:
ue-cli health_check
ue-cli find_assets --class-type material --path /Game
ue-cli spawn_actor --name MyCube --type StaticMeshActor --location "[0,0,100]"
ue-cli get_data_table_rows --data-table-path /Game/Data/DT_Items
ue-cli save_all

# For complex params, use --json:
ue-cli build_material_graph --json '{"material_path":"/Game/M_Test","nodes":[...],"connections":[...]}'

# Or pipe from stdin:
echo '{"material_path":"/Game/M_Test","nodes":[...]}' | ue-cli build_material_graph --json -

Help & Discovery

# See all commands grouped by category
ue-cli --help

# See flags for a specific command
ue-cli find_assets --help

# Dump all commands with descriptions, flags, and examples (for AI assistants)
ue-cli list_commands

Global Flags

FlagDescription
--port <int>TCP port override (default: auto-discover from port file)
--timeout <int>Timeout in seconds (default: 30, large ops: 300)
--json <string>Full params as JSON string (use - for stdin)
--versionPrint version

Key Commands

Assets

ue-cli find_assets --class-type material --path /Game/Materials
ue-cli list_assets --path /Game --class-filter blueprint
ue-cli get_asset_properties --asset-path /Game/Materials/M_Base
ue-cli import_asset --source-file "C:/Art/texture.png" --destination-path /Game/Textures
ue-cli save_asset --asset-path /Game/Materials/M_Base
ue-cli save_all

Blueprints

ue-cli create_blueprint --name BP_MyActor --parent-class Actor
ue-cli add_component_to_blueprint --blueprint-path /Game/BP_MyActor --component-class StaticMeshComponent
ue-cli add_event_node --blueprint-name BP_MyActor --event-name BeginPlay
ue-cli compile_blueprint --blueprint-name BP_MyActor
ue-cli read_blueprint_content --blueprint-path /Game/BP_MyActor

Materials

ue-cli create_material --name M_Red --path /Game/Materials
ue-cli build_material_graph --material-path /Game/Materials/M_Red \
  --nodes '[{"type":"Constant3Vector","pos_x":-400,"properties":{"Constant":"(R=1,G=0,B=0)"}}]' \
  --connections '[{"from_node":0,"to_node":"material","to_pin":"BaseColor"}]'
ue-cli create_material_instance --parent-path /Game/Materials/M_Base --name MI_Red

Data Tables

ue-cli get_data_table_schema --data-table-path /Game/Data/DT_Items
ue-cli get_data_table_rows --data-table-path /Game/Data/DT_Items
ue-cli add_data_table_row --data-table-path /Game/Data/DT_Items --row-name CopperOre \
  --data '{"DisplayName":"Copper Ore","StackSize":100}'
ue-cli update_data_table_row --data-table-path /Game/Data/DT_Items --row-name CopperOre \
  --data '{"StackSize":200}'

Actors & Level

ue-cli get_actors_in_level
ue-cli spawn_actor --name MyCube --type StaticMeshActor --location "[0,0,100]"
ue-cli spawn_blueprint_actor --blueprint-path /Game/BP_MyActor --location "[500,0,0]"
ue-cli find_actors_by_name --pattern "Light"
ue-cli get_world_info
ue-cli take_screenshot

Performance Profiling

# Record → Stop → Analyze
ue-cli performance_start_trace --channels "cpu,gpu,frame"
# ... play the game ...
ue-cli performance_stop_trace
ue-cli performance_analyze_insight --query diagnose
ue-cli performance_analyze_insight --query flame --count 20
ue-cli performance_analyze_insight --query search --filter "ConveyorProcessor"

Enhanced Input

ue-cli create_input_action --asset-path /Game/Input/IA_Jump --value-type Boolean
ue-cli create_input_mapping_context --asset-path /Game/Input/IMC_Default
ue-cli add_key_mapping --context-path /Game/Input/IMC_Default --action-path /Game/Input/IA_Jump --key SpaceBar

Niagara VFX

# Create a system from an emitter template, then tweak it
ue-cli create_niagara_system --asset-path /Game/VFX/NS_Sparks \
  --template "/Niagara/DefaultAssets/FX_Sparks.FX_Sparks"
ue-cli get_niagara_system_info --asset-path /Game/VFX/NS_Sparks
ue-cli set_niagara_module_input --asset-path /Game/VFX/NS_Sparks \
  --emitter-name Sparks --stack SpawnStack \
  --module-name "Spawn Rate" --input-name SpawnRate --value 250
ue-cli compile_niagara_system --asset-path /Game/VFX/NS_Sparks

# Spawn it in the level
ue-cli spawn_niagara_effect --asset-path /Game/VFX/NS_Sparks --location "[0,0,200]"

StateTree

# Create a StateTree, add a state with a task, compile
ue-cli create_statetree --asset-path /Game/AI/ST_Enemy
ue-cli add_statetree_state --asset-path /Game/AI/ST_Enemy --state-name Patrol
ue-cli add_statetree_task --asset-path /Game/AI/ST_Enemy \
  --state-name Patrol --task-type "MassEnemyNestPatrolTask"
ue-cli add_statetree_transition --asset-path /Game/AI/ST_Enemy \
  --from-state Patrol --trigger OnEvent --event-tag "Enemy.SeePlayer"
ue-cli compile_statetree --asset-path /Game/AI/ST_Enemy

Mass Config Traits (Surgical Editing)

# Modify a single trait property without touching the rest of the trait array
ue-cli get_mass_config_traits --asset-path /Game/Mass/Enemy_Config
ue-cli set_mass_config_trait_property --asset-path /Game/Mass/Enemy_Config \
  --trait-class MassMovementTrait --property-name MaxSpeed --property-value 600

Widgets (UMG)

ue-cli get_widget_tree --widget-blueprint-path /Game/UI/WBP_HUD
ue-cli add_widget --widget-blueprint-path /Game/UI/WBP_HUD --widget-class TextBlock \
  --parent-widget-name RootCanvas --widget-name TitleText \
  --widget-properties '{"Text":"Hello World"}'

Diagnostics

# Check entire setup
ue-cli doctor

# Output:
#   [ok] Project            MyProject/MyProject.uproject
#   [ok] Plugin directory   Plugins/UnrealMCP/ exists
#   [ok] Plugin source      Source/UnrealMCPBridge/ exists
#   [ok] UProject entry     UnrealMCP plugin listed and enabled
#   [ok] Port file          port 55557
#   [ok] TCP connection     Connected to 127.0.0.1:55557
#   [ok] Health check       Bridge is responsive
#   All checks passed. ue-cli is ready to use.

MCP Server Setup

For AI tools that use the Model Context Protocol (Cursor, Windsurf, VS Code, etc.).

Requirements

  • Unreal Engine 5.7 (tested on 5.7, may work on earlier 5.x versions)
  • Python 3.10+
  • UE5 Plugins (enabled automatically by the .uplugin):
    • PythonScriptPlugin
    • EditorScriptingUtilities
    • EnhancedInput

Install

pip install unrealmcp

Setup Script (Alternative to Manual Config)

The setup script installs the unrealmcp pip package and creates the MCP config for your AI tool automatically.

Windows:

cd Plugins\UnrealMCP
install.bat

macOS / Linux:

cd Plugins/UnrealMCP
bash install.sh

The script asks where to create the MCP config:

ScopeWhat it doesWhen to use
ProjectCreates config next to your .uprojectOnly want UnrealMCP in this project
GlobalCreates config in your user folderWant UnrealMCP in all projects

Configure Your AI Tool

Claude Code.mcp.json (project root)
{
  "mcpServers": {
    "unreal": {
      "type": "stdio",
      "command": "unrealmcp"
    }
  }
}
Cursor.cursor/mcp.json
{
  "mcpServers": {
    "unreal": {
      "command": "unrealmcp"
    }
  }
}
VS Code / Copilot.vscode/mcp.json
{
  "servers": {
    "unreal": {
      "command": "unrealmcp"
    }
  }
}
Windsurf~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "unreal": {
      "command": "unrealmcp"
    }
  }
}
Gemini CLI.gemini/settings.json
{
  "mcpServers": {
    "unreal": {
      "command": "unrealmcp"
    }
  }
}
JetBrains / Rider.junie/mcp/mcp.json
{
  "servers": [
    {
      "name": "unreal",
      "command": "unrealmcp"
    }
  ]
}
Zed~/.config/zed/settings.json
{
  "context_servers": {
    "unreal": {
      "source": "custom",
      "command": { "path": "unrealmcp" }
    }
  }
}
Amazon Q.amazonq/mcp.json
{
  "mcpServers": {
    "unreal": {
      "command": "unrealmcp"
    }
  }
}

All 288 Commands

CategoryCountHighlights
Core2health_check, execute_python
Asset Management16find/list/import/duplicate/rename/delete/save
Blueprints22create, compile, variables, functions, graph nodes
Materials35create, build_material_graph, material functions, Substrate
Data Tables8full CRUD on rows + schema introspection
Data Assets12data assets + surgical Mass Config trait editing
Actors & Level19spawn, transform, properties, screenshot
Enhanced Input21actions, mapping contexts, triggers, modifiers
Widgets — UMG11widget tree, add/move/rename, slot props
Niagara VFX96systems, emitters, stack bindings (nested), scratch pad authoring, graph CRUD, DI member functions, source-menu discovery
StateTree33states, tasks, evaluators, transitions, conditions, bindings
Performance Profiling3record .utrace + smart analysis (diagnose/spikes/flame)
Debug2token tracking, debug toggle

Core (2)

CommandDescription
health_checkVerify the bridge is running
execute_pythonRun arbitrary Python in the editor

Asset Management (16)

CommandDescription
find_assetsSearch Asset Registry by class/path/name
list_assetsList assets in a directory
get_asset_infoAsset metadata
get_asset_propertiesAll editable properties
set_asset_propertySet a property
find_referencesFind dependents/dependencies
import_assetImport external file (PNG, FBX, etc.)
import_assets_batchBatch import
duplicate_assetCopy to new location
rename_assetRename/move (auto-fix references)
delete_assetDelete (checks references)
save_asset / save_allSave dirty assets
open_assetOpen in editor
sync_browserNavigate Content Browser
get_selected_assetsCurrently selected assets

Blueprints (22)

CommandDescription
search_parent_classesFind valid parent classes
create_blueprintCreate from any parent class
compile_blueprintCompile
read_blueprint_contentFull structure readout
analyze_blueprint_graphGraph analysis
add_component_to_blueprintAdd component
create/get/set_blueprint_variableVariable management
set_blueprint_variable_propertiesModify variable settings
create/delete/rename_blueprint_functionFunction management
add_function_input/outputFunction parameters
get_blueprint_function_detailsFunction inspection
get/set_blueprint_class_defaultsCDO properties
add_blueprint_nodeAdd graph node (23+ types)
add_event_nodeAdd event (BeginPlay, Tick, etc.)
connect_blueprint_nodesWire nodes together
delete_blueprint_nodeRemove node
set_blueprint_node_propertyEdit node properties

Materials (35)

CommandDescription
create_materialCreate with blend/shading mode
create_material_instanceCreate with parameter overrides
build_material_graphBuild complete node graph atomically
get_material_infoInspect properties/params/textures
set_material_propertiesBulk-set material properties
add/delete/move/duplicate_material_expressionManage nodes
connect_material_expressionsWire nodes
set_material_expression_propertySet node property
disconnect_material_expressionBreak connection
layout_material_expressionsAuto-layout
recompile_materialForce recompile
get_material_errorsCompilation errors
get/set_material_instance_parameterMI parameter overrides
list_material_expression_typesDiscover node types
get_expression_type_infoNode pins & properties
search_material_functionsFind Material Functions
validate_material_graphDiagnose issues
trace_material_connectionTrace data flow
cleanup_material_graphRemove orphaned nodes
add_material_commentsComment boxes
create/get_material_functionMaterial Function management
build_material_function_graphBuild MF graph
add/set_material_function_input/outputMF pins
validate/cleanup_material_functionMF diagnostics
apply_material_to_actor/blueprintApply materials
get_available_materialsList materials
get_actor/blueprint_material_infoMaterial slot info

Data Tables (8)

CommandDescription
get_data_table_schemaColumn names and types
get_data_table_rows / get_data_table_rowRead rows
add_data_table_rowAdd with initial data
update_data_table_rowPartial update
delete_data_table_rowDelete row
duplicate_data_table_rowCopy row
rename_data_table_rowRename row

Data Assets (12)

CommandDescription
create_data_assetCreate any UDataAsset subclass
get/set_data_asset_property(ies)Read/write properties (single or batch)
list_data_assetsBrowse by path/class
list_data_asset_classesDiscover all loaded UDataAsset subclasses
get_property_valid_typesValid dropdown values for a property slot
search_class_pathsFind class paths
get_mass_config_traitsInspect all traits on a Mass Entity Config asset
add_mass_config_traitAppend a new trait to a Mass Config (non-destructive)
set_mass_config_trait_propertySurgical in-place edit of a single trait property — never replaces the Traits array
remove_mass_config_traitRemove a single trait by index or class without affecting siblings

Actors & Level (19)

CommandDescription
spawn_actorSpawn built-in actor types
spawn_blueprint_actorSpawn BP actor
spawn_actor_from_classSpawn from class name
get_actors_in_levelList all actors
find_actors_by_nameSearch by name pattern
get_actor_propertiesRead actor properties
set_actor_transformSet location/rotation/scale
delete_actorRemove from level
get_selected_actorsViewport selection
get_world_infoLevel info
set_static_mesh_propertiesMesh assignment
set_physics_propertiesPhysics config
set_mesh_material_colorMaterial color
apply_material_to_actor/blueprintApply material
get_actor/blueprint_material_infoMaterial slots
get_available_materialsList materials
take_screenshotCapture viewport

Enhanced Input (21)

CommandDescription
create_input_actionCreate UInputAction
get/set_input_action_propertiesAction properties
add/remove_input_action_triggerAction triggers
add/remove_input_action_modifierAction modifiers
list_input_actionsBrowse actions
create_input_mapping_contextCreate UInputMappingContext
get_input_mapping_contextRead mappings
add/remove/set_key_mappingKey bindings
add/remove_mapping_trigger/modifierPer-mapping overrides
list_input_mapping_contextsBrowse contexts
list_trigger_types / list_modifier_typesDiscover types
list_input_keysValid key names

Widgets — UMG (11)

CommandDescription
get_widget_treeWidget hierarchy
add_widgetAdd to parent
remove/move/rename/duplicate_widgetWidget operations
get/set_widget_propertiesWidget properties
get/set_slot_propertiesLayout slot properties
list_widget_typesAvailable widget classes

Niagara VFX (96)

End-to-end Niagara authoring — read the full stack, mutate any binding (top-level or nested), author scratch-pad dynamic inputs from scratch, spawn arbitrary graph nodes including data-interface member functions, and discover every valid option the editor's dropdowns expose. Built on Niagara's exported ViewModel / Stack Graph APIs with safe replication of non-exported helpers.

Systems

CommandDescription
create_niagara_systemCreate from emitter template or empty
get_niagara_system_infoSystem metadata, emitters, parameters
list_niagara_systemsBrowse Niagara systems by path
delete_niagara_systemDelete a system
compile_niagara_systemForce recompile
set_niagara_system_propertySet top-level system property
get_niagara_system_errorsCompilation errors / warnings
get_niagara_particle_statsPer-emitter particle stats
get/set_niagara_playback_rangePreview playback range

Emitters

CommandDescription
get_niagara_emittersList emitters in a system
add_niagara_emitterAdd from template
remove_niagara_emitterRemove an emitter
duplicate_niagara_emitterCopy emitter with new name
reorder_niagara_emitterChange emitter index
set_niagara_emitter_propertySet emitter property
get_niagara_emitter_attributesParticle attributes (Position, Velocity, etc.)

Modules (Spawn / Update / Render stacks)

CommandDescription
get_niagara_modulesList modules in any stack
add_niagara_moduleAdd module from script asset
remove_niagara_moduleRemove a module
set_niagara_module_enabledEnable/disable a module
reorder_niagara_moduleReorder within stack
get_niagara_module_inputsInspect module inputs with current values
set_niagara_module_inputSet literal value (auto-routes Module.* inputs to rapid-iteration; supports nested dot-paths like "Spawn Count.int32001")
set_niagara_dynamic_inputReplace input with a dynamic input function (nested-path aware)
set_niagara_curveSet curve points on a curve input
get_niagara_module_versionsList script versions

Stack Input Binding Loop

CommandDescription
get_niagara_module_input_bindingResolve mode (Default/Local/Linked/Dynamic/Data/Expression) + target + recursive children for every input in one call
clear_niagara_module_inputReset an input (or nested path) to default — equivalent to "Reset to Default" in the stack UI
list_niagara_input_source_menuReproduces the editor's source dropdown — engine dynamic-input assets + scratch-pad DIs + link parameters grouped by namespace

Parameters & Bindings

CommandDescription
get_niagara_user_parametersList User-namespace parameters
add_niagara_user_parameterAdd a User parameter
set_niagara_user_parameterSet a User parameter value
remove_niagara_user_parameterRemove a User parameter
link_niagara_parameterBind module input to a parameter (supports nested dot-paths)
get_niagara_rapid_iteration_parametersRI param introspection
set_niagara_rapid_iteration_parameterSet RI param value
list_niagara_available_parametersEnumerate well-known + user + scratch-pad-scoped parameters

Renderers

CommandDescription
add_niagara_rendererAdd Sprite/Mesh/Ribbon/Light renderer
remove_niagara_rendererRemove a renderer
get_niagara_renderer_infoRenderer summary with per-binding detail (binding_name + bound_variable + type + dataset_variable)
get_niagara_renderer_propertiesFull renderer property dump
set_niagara_renderer_propertySet renderer property
set_niagara_renderer_bindingBind renderer attribute to particle data

Scratch Pad — CRUD & Apply

CommandDescription
create_niagara_scratch_pad_moduleCreate per-emitter scratch module (module / dynamic_input / function)
list_niagara_scratch_pad_modulesList scratch pads on a system
duplicate_niagara_scratch_pad_moduleDuplicate with new name
rename_niagara_scratch_pad_moduleRename in-place
delete_niagara_scratch_pad_moduleRemove from system
apply_niagara_scratch_padCommit edit-copy → asset (Apply button)
apply_and_save_niagara_scratch_padApply + save asset (Apply & Save button)
create_niagara_module_assetCreate reusable standalone Niagara Module Script asset

Script Properties (Details Panel)

CommandDescription
get_niagara_script_propertiesRead Category, Description, Keywords, ModuleUsageBitmask, ProvidedDependencies, RequiredDependencies, LibraryVisibility, bDeprecated, bExperimental, NumericOutputTypeSelectionMode, ScriptMetaData, ConversionUtility
set_niagara_script_propertiesBatch-set any subset (supports TArray<FName> like ProvidedDependencies and TArray<FNiagaraModuleDependency>)

Script Parameters (Input / Output)

CommandDescription
list_niagara_script_parametersInputs + outputs on a scratch pad / standalone script
add_niagara_script_parameterAdd input or output parameter with any registered type (incl. data interfaces)
remove_niagara_script_parameterRemove — cascades to Map Get / Map Set pin cleanup automatically
rename_niagara_script_parameterRename across asset + edit-copy graphs

Graph Introspection

CommandDescription
get_niagara_graph_nodesList every node with verbosity (summary/connections/full) + type_filter + name_filter. Three resolver modes: scratch pad, emitter stack graph, standalone script
get_niagara_node_infoDeep single-node inspect by node_index / node_class / node_id with pin layout, links, and type-specific fields (op_name, function_script, hlsl_preview, input_name/type)
trace_niagara_connectionBFS upstream/downstream with pin_name filter — see the dependency chain without dumping the whole graph
validate_niagara_graphClassify orphaned / dead-end / missing-input nodes (skips +Add placeholders)

Graph Node CRUD

CommandDescription
add_niagara_graph_nodeSpawn Op / FunctionCall / DataInterfaceFunction / ParameterMapGet / ParameterMapSet / Reroute / Input node. DI member functions (e.g. Array.Length) use UNiagaraDataInterface::GetFunctionSignatures — same path as the right-click "Functions" submenu
delete_niagara_graph_nodeDelete by index or GUID, mirrors on asset + edit-copy

Pin Management

CommandDescription
add_niagara_map_get_pinAdd a typed output pin to a Map Get (e.g. Module.MyParam as Vector)
add_niagara_map_set_pinAdd a typed input pin to a Map Set (e.g. Particles.Velocity)
add_niagara_node_pinAdd a pin to any UNiagaraNodeWithDynamicPins-derived node
rename_niagara_node_pinRename a pin on a dynamic-pin node
remove_niagara_node_pinRemove a dynamic pin
connect_niagara_pinsWire two pins with UEdGraphSchema_Niagara::TryCreateConnection validation
disconnect_niagara_pinsBreak a pin connection

Custom HLSL

CommandDescription
set_niagara_scratch_pad_hlslWrite HLSL source into the scratch pad's Custom HLSL node (creates pins as needed)
add_niagara_custom_hlsl_inputAdd an input pin to a Custom HLSL node
add_niagara_custom_hlsl_outputAdd an output pin to a Custom HLSL node
rename_niagara_custom_hlsl_pinRename a pin (also rewrites {PinName} references in the HLSL body)
remove_niagara_custom_hlsl_pinRemove a pin

Events & Simulation Stages

CommandDescription
add_niagara_event_handlerAdd event handler stage
add_niagara_simulation_stageAdd simulation stage
get_niagara_event_handlersInspect handlers on emitter

Level Spawning

CommandDescription
spawn_niagara_effectSpawn at world location
control_niagara_effectActivate / deactivate / restart
add_niagara_componentAdd NiagaraComponent to a Blueprint
get_niagara_actorsFind spawned Niagara actors

Discovery (zero-guess authoring)

CommandDescription
list_niagara_modulesAll available Niagara module scripts
list_niagara_emitter_templatesEmitter templates
list_niagara_data_interfacesAvailable data interfaces (DI_*)
list_niagara_data_interface_functionsMember functions on a DI class (Array.Length, Array.Get, etc.) — pass result to add_niagara_graph_node(node_type="DataInterfaceFunction")
list_niagara_parameter_typesParameter type registry
list_niagara_node_typesSpawnable node classes with pin schema
get_niagara_node_type_infoPin schema for a node class or script asset
search_niagara_functionsFind Niagara script assets by usage + name
get_niagara_schema_actionsFull graph right-click menu — same source the editor uses. Returns op_name / function_script / input_name for direct use with add_niagara_graph_node
describe_niagara_typeType query — FNiagaraTypeRegistry types + UEnum / UScriptStruct reflection fallback for script-property enums and custom types
get_niagara_data_interface_schemaWalk a DI class's editable property schema
find_niagara_scratch_pad_usageReverse lookup — where is this scratch pad referenced?
resolve_niagara_built_in_dynamic_inputAssetRegistry scan for engine-shipped DI scripts (no more hardcoded paths)

StateTree (33, NEW)

Read and author StateTree assets — states, tasks, evaluators, transitions, conditions, parameters, and bindings. Schema-aware: works with both StateTreeSchemaBase and Mass schema variants.

Reading

CommandDescription
get_statetree_infoAsset summary (schema, states, evaluators)
get_statetree_full_infoFull recursive dump (states + tasks + transitions + bindings)
get_statetree_statesList all states (flat)
get_statetree_stateSingle state details by ID/name
get_statetree_nodeInspect any node (task/evaluator/condition)
get_statetree_evaluatorsGlobal evaluators
get_statetree_global_tasksGlobal tasks
get_statetree_parametersTree parameters
get_statetree_bindingsAll property bindings
get_statetree_transition_targetsValid transition targets for a state
search_statetree_nodesSearch nodes by name / type

Authoring

CommandDescription
create_statetreeCreate new StateTree asset
set_statetree_schemaSet schema (e.g. Mass schema)
add_statetree_stateAdd a state (parent or root)
add_statetree_taskAdd task to a state
add_statetree_evaluatorAdd global evaluator
add_statetree_global_taskAdd global task
add_statetree_conditionAdd enter / transition condition
add_statetree_transitionAdd transition (event / completed / delegate)
add_statetree_parameterAdd tree parameter
add_statetree_bindingBind property between nodes
compile_statetreeCompile after edits

Modification

CommandDescription
set_statetree_state_propertyEdit state property
set_statetree_node_propertyEdit task / evaluator / condition property
set_statetree_transition_propertyEdit transition property
set_statetree_colorSet state color

Removal

CommandDescription
remove_statetree_stateRemove a state
remove_statetree_nodeRemove a task / evaluator / condition
remove_statetree_transitionRemove a transition
remove_statetree_bindingRemove a binding
remove_statetree_parameterRemove a parameter

Discovery

CommandDescription
list_statetree_node_typesAll available task / evaluator / condition types
list_statetree_enum_valuesEnum values for property dropdowns

Performance Profiling (3)

CommandDescription
performance_start_traceStart recording .utrace
performance_stop_traceStop and auto-load
performance_analyze_insightSmart analysis (diagnose, spikes, flame, hotpath, search, histogram, etc.)

Debug (2)

CommandDescription
set_mcp_debugEnable token tracking
get_mcp_token_statsToken usage stats

Usage Examples

These work with both the CLI and MCP server. With the CLI, the AI calls ue-cli via Bash. With MCP, the AI calls tools directly.

Create a Material

Create a red metallic material at /Game/Materials/M_RedMetal
with roughness 0.3 and metallic 1.0

The AI will call create_material, then build_material_graph to wire up constant nodes to Base Color, Metallic, and Roughness pins.

Spawn Actors

Spawn 5 point lights in a circle around the origin at height 300

The AI will call spawn_actor with actor_type: "PointLight" five times with calculated positions.

Blueprint Creation

Create a Blueprint actor called BP_HealthPickup based on Actor,
add a Sphere Collision component and a Static Mesh component,
set it up so on BeginOverlap it prints "Health Picked Up"

The AI will use create_blueprint, add_component_to_blueprint, add_event_node, add_blueprint_node, and connect_blueprint_nodes.

Profile Performance

Start a performance trace, play for 10 seconds, stop it,
then diagnose the bottlenecks

The AI will call performance_start_trace, wait, performance_stop_trace, then performance_analyze_insight with query: "diagnose".

Data Table Management

Show me the schema of DT_Items, then add a new row called
"IronIngot" with StackSize 100

The AI will call get_data_table_schema, then add_data_table_row with the appropriate data.


Configuration

Custom Port

Add to Config/DefaultEngine.ini:

[UnrealMCP]
Port=55557

Environment Variable

# Force a specific port (overrides port file)
set UNREAL_MCP_PORT=55560

Multiple Editor Instances

Each editor picks a unique port automatically. The CLI and MCP server read the port from Saved/UnrealMCP/port.txt. Use --port flag or UNREAL_MCP_PORT env var to target a specific instance.


Architecture

Plugin Structure

Plugins/UnrealMCP/
├── UnrealMCP.uplugin              # Plugin manifest
├── cli/                            # Go CLI source (ue-cli)
│   ├── cmd/                        # Command definitions (288 commands)
│   ├── internal/bridge/            # TCP client
│   ├── internal/project/           # Plugin embedding & project detection
│   └── npm/                        # npm package wrapper
├── unrealmcp/                      # Python MCP server
│   ├── _tcp_bridge.py              # TCP communication
│   └── tools/                      # Tool modules (one per category)
├── Source/UnrealMCPBridge/         # C++ editor plugin
│   ├── Public/                     # Headers
│   └── Private/                    # Implementation + command handlers
└── .github/workflows/release.yml   # CI: builds + GitHub Release + npm publish

Communication Protocol

TCP with length-prefix framing:

[4 bytes: big-endian payload length] [N bytes: UTF-8 JSON]

Request: {"type": "command_name", "params": {...}} Response: {"status": "success", "result": {...}}


Adding Custom Commands

CLI Side (Go)

Add a CommandSpec to the appropriate cmd/*.go file:

{
    Name:    "my_command",
    Group:   "mygroup",
    Short:   "What it does",
    Long:    "Detailed description.",
    Example: "ue-cli my_command --param value",
    Params: []ParamSpec{
        {Name: "param", Type: "string", Required: true, Help: "Description"},
    },
},

MCP Side (Python)

Create a new file in unrealmcp/tools/:

# unrealmcp/tools/my_tools.py
from unrealmcp._bridge import mcp
from unrealmcp._tcp_bridge import _call

@mcp.tool()
def my_command(param: str) -> str:
    """Description shown to the AI assistant."""
    return _call("my_command", {"param": param})

Register it in unrealmcp/tools/__init__.py:

from unrealmcp.tools import my_tools  # noqa: F401

C++ Side

Add a command handler in Source/UnrealMCPBridge/Private/Commands/ and register it in ExecuteCommand().


Supported AI Tools

ToolInterfaceConfig FileStatus
Claude CodeCLI or MCPBash (CLI) / .mcp.json (MCP)Tested
CursorMCP.cursor/mcp.jsonTested
VS Code / CopilotMCP.vscode/mcp.jsonSupported
WindsurfMCP~/.codeium/windsurf/mcp_config.jsonSupported
Gemini CLIMCP.gemini/settings.jsonSupported
JetBrains / RiderMCP.junie/mcp/mcp.jsonSupported
ZedMCP~/.config/zed/settings.jsonSupported
Amazon QMCP.amazonq/mcp.jsonSupported

Troubleshooting

ProblemSolution
"Connection refused"Is the UE5 editor running? Check Output Log for MCP Bridge initialized on port XXXXX
ue-cli doctor shows port file missingEditor hasn't started yet, or check Saved/UnrealMCP/port.txt
Commands timeoutLarge operations (profiling, complex graphs) have 300s timeout. Use --timeout 600 to increase
Multiple editorsUse --port <num> or UNREAL_MCP_PORT env var to target a specific instance
Plugin not compilingEnsure PythonScriptPlugin, EditorScriptingUtilities, EnhancedInput are enabled
Python import errorsRun pip install fastmcp requests — make sure the Python on your PATH matches your AI tool's
Plugin not loadingVerify UnrealMCP.uplugin has "Type": "Editor" and required plugins are available in your engine build

Releases & Distribution

ChannelCommand
npmnpm install -g unrealcli
GitHub ReleasesDownload binaries
pip (MCP only)pip install unrealmcp

Releases are automated via GitHub Actions. Push a tag to trigger:

git tag v1.2.2 && git push origin v1.2.2
# → Builds 5 platform binaries
# → Creates GitHub Release
# → Publishes to npm + PyPI

Contributing

See CONTRIBUTING.md for guidelines.


Enterprise & Studio Integration

Need Unreal MCP integrated into your studio's production pipeline? I work directly with game studios to build custom AI-assisted workflows on top of this tool.

What I offer:

  • Pipeline Integration — Set up Unreal MCP within your existing build system, CI/CD, and team workflow so every artist and developer can use AI assistants with your Unreal project out of the box
  • Custom Tool Development — Build MCP commands tailored to your studio's proprietary formats, internal tools, and specific production needs that the open-source version doesn't cover
  • AI Workflow Design — Design and implement how your team uses AI assistants (Claude, Cursor, Copilot) with Unreal Engine — from material creation to level design to asset pipelines
  • Advanced Material & Substrate Systems — Procedural material generation, Substrate workflows, complex shader pipelines — fully automated through MCP

Get in touch:


Custom Development & Support

Need help with your Unreal project? I'm available for contract work across the full UE5 C++ stack, from gameplay and multiplayer to editor tooling and Mass Entity systems. See SUPPORT.md for details.

aadeshrao80@gmail.com · LinkedIn · Portfolio · Discord: destroyerpal


License

MPL-2.0 — see LICENSE for details.

Rendered live from aadeshrao123/Unreal-MCP's GitHub README — not stored, always reflects the source repo.

1 Install Method

NameDescriptionCategorySource
pypi packageInstall via pypi (stdio transport)mcp-serverunrealmcp

0 Comments

Login required
Log in to post a comment or update on this repo.

No comments yet — be the first to share an update.