{
  "markdown": "<!-- mcp-name: io.github.aadeshrao123/unreal-mcp -->\n\n# UnrealMCP — AI Bridge for Unreal Engine 5\n\n**Control the Unreal Engine 5 editor from Claude Code, Cursor, Windsurf, or any MCP client.**\nBuild materials, wire Blueprint graphs, author Niagara systems, spawn actors, edit data tables and\nprofile performance, all by asking for it. **288 commands across 15 categories**, no leaving your\nterminal.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![UE 5.3+](https://img.shields.io/badge/Unreal-5.3%2B-black.svg)](https://www.unrealengine.com/)\n[![MCP](https://img.shields.io/badge/Model%20Context%20Protocol-compatible-blue.svg)](https://modelcontextprotocol.io/)\n[![Pro version](https://img.shields.io/badge/Pro-CodeFizz%20Editor%20Agent-e0483d.svg)](https://codefizz.dev/?utm_source=github&utm_medium=readme&utm_campaign=community_badge)\n\n> ### This is the community edition\n>\n> It is **stable and feature complete for what it covers**. It is not abandoned, and it is not in\n> active development either: new subsystem work now goes into\n> **[CodeFizz Editor Agent](https://codefizz.dev/?utm_source=github&utm_medium=readme&utm_campaign=community_notice)**,\n> the maintained commercial build. Everything here keeps working, issues still get read, and the\n> MIT licence is permanent.\n>\n> If you want Control Rig, PCG, Sequencer, Mutable, Procedural Vegetation, audio and MetaSounds,\n> Behavior Trees and EQS, or packaged binaries for UE 5.6 / 5.7 / 5.8, that lives in Pro.\n\n---\n\n## Community edition vs Pro\n\n| | **Community** (this repo) | **CodeFizz Editor Agent** (Pro) |\n|---|---|---|\n| **Commands** | 288 | **900+** |\n| **Categories** | 15 | **28** |\n| **Engine support** | Build it yourself | **5.6, 5.7, 5.8** |\n| **Blueprints, Materials, Niagara, StateTree** | Yes | Yes, and deeper |\n| **Control Rig, PCG, Sequencer** | No | Yes |\n| **Mutable, Procedural Vegetation** | No | Yes |\n| **Audio, MetaSounds, Sound Cues** | No | Yes |\n| **Behavior Trees, EQS** | No | Yes |\n| **Insights profiling** | Basic | Full trace analysis |\n| **Install** | Clone, build, configure | One command, no compiler needed |\n| **Updates** | Community pace | Shipped continuously |\n| **Support** | GitHub issues | Priority, private Discord |\n\n[**See the full command list →**](https://codefizz.dev/tools?utm_source=github&utm_medium=readme&utm_campaign=community_table)\n· [**Docs**](https://codefizz.dev/docs?utm_source=github&utm_medium=readme&utm_campaign=community_table)\n· [**3 day free trial**](https://codefizz.dev/account?utm_source=github&utm_medium=readme&utm_campaign=community_trial)\n\n> **Already on UE 5.8?** Epic now ships a first-party MCP server in 5.8 (Experimental, localhost\n> only). It is worth trying before you buy anything. This repo and Pro both also cover **5.6 and\n> 5.7**, which Epic's does not.\n\n---\n\n## Two ways to use this repo\n\n| | CLI | MCP Server |\n|---|---|---|\n| **Install** | `npm install -g unrealcli` | `pip install unrealmcp` |\n| **Dependencies** | None (single binary) | Python 3.10+ |\n| **Works with** | Claude Code (via Bash) | Claude Code, Cursor, Windsurf, VS Code, Gemini CLI, Rider, Zed, Amazon Q |\n| **Protocol** | Direct TCP | MCP over stdio |\n\nBoth talk to the same C++ plugin inside the editor. Use whichever fits your workflow, or both.\n\n---\n\n## Quick Start\n\n### Option A: CLI (Recommended for Claude Code)\n\n```bash\n# 1. Install\nnpm install -g unrealcli\n\n# 2. Go to any UE5 project and install the plugin\ncd YourProject/\nue-cli init\n\n# 3. Open the editor, then verify\nue-cli health_check\n```\n\nThat's it. No Python, no config files, no MCP setup.\n\n### Option B: MCP Server (For Cursor, Windsurf, etc.)\n\n```bash\n# 1. Clone the plugin into your project\ngit clone https://github.com/aadeshrao123/Unreal-MCP.git Plugins/UnrealMCP\n\n# 2. Install the Python MCP server\npip install unrealmcp\n\n# 3. Add to your AI tool's config (see MCP Setup section below)\n```\n\n---\n\n## How It Works\n\n```\n                    ┌──────────────────────────────────────────┐\n                    │         Unreal Engine 5 Editor            │\n                    │                                          │\n                    │   C++ Plugin (UnrealMCPBridge)           │\n                    │   TCP server on localhost:55557           │\n                    │   288 commands: materials, blueprints,   │\n                    │   niagara, statetree, actors, data       │\n                    │   tables, profiling, and more            │\n                    └──────────────┬───────────────────────────┘\n                                   │ TCP/JSON\n                    ┌──────────────┴───────────────────────────┐\n                    │                                          │\n          ┌─────────┴─────────┐              ┌─────────┴──────────┐\n          │   CLI (ue-cli)    │              │  MCP Server        │\n          │   Go binary       │              │  Python (unrealmcp)│\n          │   Direct TCP      │              │  stdio → TCP       │\n          │                   │              │                    │\n          │  Claude Code      │              │  Cursor, Windsurf, │\n          │  (via Bash tool)  │              │  VS Code, Rider... │\n          └───────────────────┘              └────────────────────┘\n```\n\nThe 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.\n\n---\n\n## CLI Reference\n\n### Installation\n\n```bash\n# From npm (recommended)\nnpm install -g unrealcli\n\n# Or download binary directly from GitHub Releases\n# https://github.com/aadeshrao123/Unreal-MCP/releases\n```\n\n**Platforms:** Windows (x64), macOS (Intel + Apple Silicon), Linux (x64 + ARM64)\n\n### Setup\n\n```bash\n# Navigate to your UE5 project\ncd MyProject/\n\n# Install the C++ plugin (one-time)\nue-cli init\n# → Creates Plugins/UnrealMCP/ with C++ source\n# → Patches .uproject to enable the plugin\n# → Open editor to compile, then you're ready\n\n# Verify everything works\nue-cli doctor\n```\n\n### Usage\n\n```bash\n# Every command follows this pattern:\nue-cli <command> [--flag value]\n\n# Examples:\nue-cli health_check\nue-cli find_assets --class-type material --path /Game\nue-cli spawn_actor --name MyCube --type StaticMeshActor --location \"[0,0,100]\"\nue-cli get_data_table_rows --data-table-path /Game/Data/DT_Items\nue-cli save_all\n\n# For complex params, use --json:\nue-cli build_material_graph --json '{\"material_path\":\"/Game/M_Test\",\"nodes\":[...],\"connections\":[...]}'\n\n# Or pipe from stdin:\necho '{\"material_path\":\"/Game/M_Test\",\"nodes\":[...]}' | ue-cli build_material_graph --json -\n```\n\n### Help & Discovery\n\n```bash\n# See all commands grouped by category\nue-cli --help\n\n# See flags for a specific command\nue-cli find_assets --help\n\n# Dump all commands with descriptions, flags, and examples (for AI assistants)\nue-cli list_commands\n```\n\n### Global Flags\n\n| Flag | Description |\n|------|-------------|\n| `--port <int>` | TCP port override (default: auto-discover from port file) |\n| `--timeout <int>` | Timeout in seconds (default: 30, large ops: 300) |\n| `--json <string>` | Full params as JSON string (use `-` for stdin) |\n| `--version` | Print version |\n\n### Key Commands\n\n#### Assets\n```bash\nue-cli find_assets --class-type material --path /Game/Materials\nue-cli list_assets --path /Game --class-filter blueprint\nue-cli get_asset_properties --asset-path /Game/Materials/M_Base\nue-cli import_asset --source-file \"C:/Art/texture.png\" --destination-path /Game/Textures\nue-cli save_asset --asset-path /Game/Materials/M_Base\nue-cli save_all\n```\n\n#### Blueprints\n```bash\nue-cli create_blueprint --name BP_MyActor --parent-class Actor\nue-cli add_component_to_blueprint --blueprint-path /Game/BP_MyActor --component-class StaticMeshComponent\nue-cli add_event_node --blueprint-name BP_MyActor --event-name BeginPlay\nue-cli compile_blueprint --blueprint-name BP_MyActor\nue-cli read_blueprint_content --blueprint-path /Game/BP_MyActor\n```\n\n#### Materials\n```bash\nue-cli create_material --name M_Red --path /Game/Materials\nue-cli build_material_graph --material-path /Game/Materials/M_Red \\\n  --nodes '[{\"type\":\"Constant3Vector\",\"pos_x\":-400,\"properties\":{\"Constant\":\"(R=1,G=0,B=0)\"}}]' \\\n  --connections '[{\"from_node\":0,\"to_node\":\"material\",\"to_pin\":\"BaseColor\"}]'\nue-cli create_material_instance --parent-path /Game/Materials/M_Base --name MI_Red\n```\n\n#### Data Tables\n```bash\nue-cli get_data_table_schema --data-table-path /Game/Data/DT_Items\nue-cli get_data_table_rows --data-table-path /Game/Data/DT_Items\nue-cli add_data_table_row --data-table-path /Game/Data/DT_Items --row-name CopperOre \\\n  --data '{\"DisplayName\":\"Copper Ore\",\"StackSize\":100}'\nue-cli update_data_table_row --data-table-path /Game/Data/DT_Items --row-name CopperOre \\\n  --data '{\"StackSize\":200}'\n```\n\n#### Actors & Level\n```bash\nue-cli get_actors_in_level\nue-cli spawn_actor --name MyCube --type StaticMeshActor --location \"[0,0,100]\"\nue-cli spawn_blueprint_actor --blueprint-path /Game/BP_MyActor --location \"[500,0,0]\"\nue-cli find_actors_by_name --pattern \"Light\"\nue-cli get_world_info\nue-cli take_screenshot\n```\n\n#### Performance Profiling\n```bash\n# Record → Stop → Analyze\nue-cli performance_start_trace --channels \"cpu,gpu,frame\"\n# ... play the game ...\nue-cli performance_stop_trace\nue-cli performance_analyze_insight --query diagnose\nue-cli performance_analyze_insight --query flame --count 20\nue-cli performance_analyze_insight --query search --filter \"ConveyorProcessor\"\n```\n\n#### Enhanced Input\n```bash\nue-cli create_input_action --asset-path /Game/Input/IA_Jump --value-type Boolean\nue-cli create_input_mapping_context --asset-path /Game/Input/IMC_Default\nue-cli add_key_mapping --context-path /Game/Input/IMC_Default --action-path /Game/Input/IA_Jump --key SpaceBar\n```\n\n#### Niagara VFX\n```bash\n# Create a system from an emitter template, then tweak it\nue-cli create_niagara_system --asset-path /Game/VFX/NS_Sparks \\\n  --template \"/Niagara/DefaultAssets/FX_Sparks.FX_Sparks\"\nue-cli get_niagara_system_info --asset-path /Game/VFX/NS_Sparks\nue-cli set_niagara_module_input --asset-path /Game/VFX/NS_Sparks \\\n  --emitter-name Sparks --stack SpawnStack \\\n  --module-name \"Spawn Rate\" --input-name SpawnRate --value 250\nue-cli compile_niagara_system --asset-path /Game/VFX/NS_Sparks\n\n# Spawn it in the level\nue-cli spawn_niagara_effect --asset-path /Game/VFX/NS_Sparks --location \"[0,0,200]\"\n```\n\n#### StateTree\n```bash\n# Create a StateTree, add a state with a task, compile\nue-cli create_statetree --asset-path /Game/AI/ST_Enemy\nue-cli add_statetree_state --asset-path /Game/AI/ST_Enemy --state-name Patrol\nue-cli add_statetree_task --asset-path /Game/AI/ST_Enemy \\\n  --state-name Patrol --task-type \"MassEnemyNestPatrolTask\"\nue-cli add_statetree_transition --asset-path /Game/AI/ST_Enemy \\\n  --from-state Patrol --trigger OnEvent --event-tag \"Enemy.SeePlayer\"\nue-cli compile_statetree --asset-path /Game/AI/ST_Enemy\n```\n\n#### Mass Config Traits (Surgical Editing)\n```bash\n# Modify a single trait property without touching the rest of the trait array\nue-cli get_mass_config_traits --asset-path /Game/Mass/Enemy_Config\nue-cli set_mass_config_trait_property --asset-path /Game/Mass/Enemy_Config \\\n  --trait-class MassMovementTrait --property-name MaxSpeed --property-value 600\n```\n\n#### Widgets (UMG)\n```bash\nue-cli get_widget_tree --widget-blueprint-path /Game/UI/WBP_HUD\nue-cli add_widget --widget-blueprint-path /Game/UI/WBP_HUD --widget-class TextBlock \\\n  --parent-widget-name RootCanvas --widget-name TitleText \\\n  --widget-properties '{\"Text\":\"Hello World\"}'\n```\n\n### Diagnostics\n\n```bash\n# Check entire setup\nue-cli doctor\n\n# Output:\n#   [ok] Project            MyProject/MyProject.uproject\n#   [ok] Plugin directory   Plugins/UnrealMCP/ exists\n#   [ok] Plugin source      Source/UnrealMCPBridge/ exists\n#   [ok] UProject entry     UnrealMCP plugin listed and enabled\n#   [ok] Port file          port 55557\n#   [ok] TCP connection     Connected to 127.0.0.1:55557\n#   [ok] Health check       Bridge is responsive\n#   All checks passed. ue-cli is ready to use.\n```\n\n---\n\n## MCP Server Setup\n\nFor AI tools that use the Model Context Protocol (Cursor, Windsurf, VS Code, etc.).\n\n### Requirements\n\n- **Unreal Engine 5.7** (tested on 5.7, may work on earlier 5.x versions)\n- **Python 3.10+**\n- **UE5 Plugins** (enabled automatically by the `.uplugin`):\n  - `PythonScriptPlugin`\n  - `EditorScriptingUtilities`\n  - `EnhancedInput`\n\n### Install\n\n```bash\npip install unrealmcp\n```\n\n### Setup Script (Alternative to Manual Config)\n\nThe setup script installs the `unrealmcp` pip package and creates the MCP config for your AI tool automatically.\n\n**Windows:**\n```cmd\ncd Plugins\\UnrealMCP\ninstall.bat\n```\n\n**macOS / Linux:**\n```bash\ncd Plugins/UnrealMCP\nbash install.sh\n```\n\nThe script asks where to create the MCP config:\n\n| Scope | What it does | When to use |\n|-------|-------------|-------------|\n| **Project** | Creates config next to your `.uproject` | Only want UnrealMCP in this project |\n| **Global** | Creates config in your user folder | Want UnrealMCP in all projects |\n\n### Configure Your AI Tool\n\n<details>\n<summary><b>Claude Code</b> — <code>.mcp.json</code> (project root)</summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"unreal\": {\n      \"type\": \"stdio\",\n      \"command\": \"unrealmcp\"\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>Cursor</b> — <code>.cursor/mcp.json</code></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"unreal\": {\n      \"command\": \"unrealmcp\"\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>VS Code / Copilot</b> — <code>.vscode/mcp.json</code></summary>\n\n```json\n{\n  \"servers\": {\n    \"unreal\": {\n      \"command\": \"unrealmcp\"\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>Windsurf</b> — <code>~/.codeium/windsurf/mcp_config.json</code></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"unreal\": {\n      \"command\": \"unrealmcp\"\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>Gemini CLI</b> — <code>.gemini/settings.json</code></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"unreal\": {\n      \"command\": \"unrealmcp\"\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>JetBrains / Rider</b> — <code>.junie/mcp/mcp.json</code></summary>\n\n```json\n{\n  \"servers\": [\n    {\n      \"name\": \"unreal\",\n      \"command\": \"unrealmcp\"\n    }\n  ]\n}\n```\n</details>\n\n<details>\n<summary><b>Zed</b> — <code>~/.config/zed/settings.json</code></summary>\n\n```json\n{\n  \"context_servers\": {\n    \"unreal\": {\n      \"source\": \"custom\",\n      \"command\": { \"path\": \"unrealmcp\" }\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>Amazon Q</b> — <code>.amazonq/mcp.json</code></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"unreal\": {\n      \"command\": \"unrealmcp\"\n    }\n  }\n}\n```\n</details>\n\n---\n\n## All 288 Commands\n\n| Category | Count | Highlights |\n|----------|------:|-----------|\n| [Core](#core-2) | 2 | health_check, execute_python |\n| [Asset Management](#asset-management-16) | 16 | find/list/import/duplicate/rename/delete/save |\n| [Blueprints](#blueprints-22) | 22 | create, compile, variables, functions, graph nodes |\n| [Materials](#materials-35) | 35 | create, build_material_graph, material functions, Substrate |\n| [Data Tables](#data-tables-8) | 8 | full CRUD on rows + schema introspection |\n| [Data Assets](#data-assets-12) | 12 | data assets + **surgical Mass Config trait editing** |\n| [Actors & Level](#actors--level-19) | 19 | spawn, transform, properties, screenshot |\n| [Enhanced Input](#enhanced-input-21) | 21 | actions, mapping contexts, triggers, modifiers |\n| [Widgets — UMG](#widgets--umg-11) | 11 | widget tree, add/move/rename, slot props |\n| [**Niagara VFX**](#niagara-vfx-96) | **96** | systems, emitters, stack bindings (nested), scratch pad authoring, graph CRUD, DI member functions, source-menu discovery |\n| [**StateTree**](#statetree-33-new) | **33** | states, tasks, evaluators, transitions, conditions, bindings |\n| [Performance Profiling](#performance-profiling-3) | 3 | record .utrace + smart analysis (diagnose/spikes/flame) |\n| [Debug](#debug-2) | 2 | token tracking, debug toggle |\n\n### Core (2)\n| Command | Description |\n|---------|-------------|\n| `health_check` | Verify the bridge is running |\n| `execute_python` | Run arbitrary Python in the editor |\n\n### Asset Management (16)\n| Command | Description |\n|---------|-------------|\n| `find_assets` | Search Asset Registry by class/path/name |\n| `list_assets` | List assets in a directory |\n| `get_asset_info` | Asset metadata |\n| `get_asset_properties` | All editable properties |\n| `set_asset_property` | Set a property |\n| `find_references` | Find dependents/dependencies |\n| `import_asset` | Import external file (PNG, FBX, etc.) |\n| `import_assets_batch` | Batch import |\n| `duplicate_asset` | Copy to new location |\n| `rename_asset` | Rename/move (auto-fix references) |\n| `delete_asset` | Delete (checks references) |\n| `save_asset` / `save_all` | Save dirty assets |\n| `open_asset` | Open in editor |\n| `sync_browser` | Navigate Content Browser |\n| `get_selected_assets` | Currently selected assets |\n\n### Blueprints (22)\n| Command | Description |\n|---------|-------------|\n| `search_parent_classes` | Find valid parent classes |\n| `create_blueprint` | Create from any parent class |\n| `compile_blueprint` | Compile |\n| `read_blueprint_content` | Full structure readout |\n| `analyze_blueprint_graph` | Graph analysis |\n| `add_component_to_blueprint` | Add component |\n| `create/get/set_blueprint_variable` | Variable management |\n| `set_blueprint_variable_properties` | Modify variable settings |\n| `create/delete/rename_blueprint_function` | Function management |\n| `add_function_input/output` | Function parameters |\n| `get_blueprint_function_details` | Function inspection |\n| `get/set_blueprint_class_defaults` | CDO properties |\n| `add_blueprint_node` | Add graph node (23+ types) |\n| `add_event_node` | Add event (BeginPlay, Tick, etc.) |\n| `connect_blueprint_nodes` | Wire nodes together |\n| `delete_blueprint_node` | Remove node |\n| `set_blueprint_node_property` | Edit node properties |\n\n### Materials (35)\n| Command | Description |\n|---------|-------------|\n| `create_material` | Create with blend/shading mode |\n| `create_material_instance` | Create with parameter overrides |\n| `build_material_graph` | Build complete node graph atomically |\n| `get_material_info` | Inspect properties/params/textures |\n| `set_material_properties` | Bulk-set material properties |\n| `add/delete/move/duplicate_material_expression` | Manage nodes |\n| `connect_material_expressions` | Wire nodes |\n| `set_material_expression_property` | Set node property |\n| `disconnect_material_expression` | Break connection |\n| `layout_material_expressions` | Auto-layout |\n| `recompile_material` | Force recompile |\n| `get_material_errors` | Compilation errors |\n| `get/set_material_instance_parameter` | MI parameter overrides |\n| `list_material_expression_types` | Discover node types |\n| `get_expression_type_info` | Node pins & properties |\n| `search_material_functions` | Find Material Functions |\n| `validate_material_graph` | Diagnose issues |\n| `trace_material_connection` | Trace data flow |\n| `cleanup_material_graph` | Remove orphaned nodes |\n| `add_material_comments` | Comment boxes |\n| `create/get_material_function` | Material Function management |\n| `build_material_function_graph` | Build MF graph |\n| `add/set_material_function_input/output` | MF pins |\n| `validate/cleanup_material_function` | MF diagnostics |\n| `apply_material_to_actor/blueprint` | Apply materials |\n| `get_available_materials` | List materials |\n| `get_actor/blueprint_material_info` | Material slot info |\n\n### Data Tables (8)\n| Command | Description |\n|---------|-------------|\n| `get_data_table_schema` | Column names and types |\n| `get_data_table_rows` / `get_data_table_row` | Read rows |\n| `add_data_table_row` | Add with initial data |\n| `update_data_table_row` | Partial update |\n| `delete_data_table_row` | Delete row |\n| `duplicate_data_table_row` | Copy row |\n| `rename_data_table_row` | Rename row |\n\n### Data Assets (12)\n| Command | Description |\n|---------|-------------|\n| `create_data_asset` | Create any UDataAsset subclass |\n| `get/set_data_asset_property(ies)` | Read/write properties (single or batch) |\n| `list_data_assets` | Browse by path/class |\n| `list_data_asset_classes` | Discover all loaded UDataAsset subclasses |\n| `get_property_valid_types` | Valid dropdown values for a property slot |\n| `search_class_paths` | Find class paths |\n| `get_mass_config_traits` | Inspect all traits on a Mass Entity Config asset |\n| `add_mass_config_trait` | Append a new trait to a Mass Config (non-destructive) |\n| `set_mass_config_trait_property` | **Surgical** in-place edit of a single trait property — never replaces the Traits array |\n| `remove_mass_config_trait` | Remove a single trait by index or class without affecting siblings |\n\n### Actors & Level (19)\n| Command | Description |\n|---------|-------------|\n| `spawn_actor` | Spawn built-in actor types |\n| `spawn_blueprint_actor` | Spawn BP actor |\n| `spawn_actor_from_class` | Spawn from class name |\n| `get_actors_in_level` | List all actors |\n| `find_actors_by_name` | Search by name pattern |\n| `get_actor_properties` | Read actor properties |\n| `set_actor_transform` | Set location/rotation/scale |\n| `delete_actor` | Remove from level |\n| `get_selected_actors` | Viewport selection |\n| `get_world_info` | Level info |\n| `set_static_mesh_properties` | Mesh assignment |\n| `set_physics_properties` | Physics config |\n| `set_mesh_material_color` | Material color |\n| `apply_material_to_actor/blueprint` | Apply material |\n| `get_actor/blueprint_material_info` | Material slots |\n| `get_available_materials` | List materials |\n| `take_screenshot` | Capture viewport |\n\n### Enhanced Input (21)\n| Command | Description |\n|---------|-------------|\n| `create_input_action` | Create UInputAction |\n| `get/set_input_action_properties` | Action properties |\n| `add/remove_input_action_trigger` | Action triggers |\n| `add/remove_input_action_modifier` | Action modifiers |\n| `list_input_actions` | Browse actions |\n| `create_input_mapping_context` | Create UInputMappingContext |\n| `get_input_mapping_context` | Read mappings |\n| `add/remove/set_key_mapping` | Key bindings |\n| `add/remove_mapping_trigger/modifier` | Per-mapping overrides |\n| `list_input_mapping_contexts` | Browse contexts |\n| `list_trigger_types` / `list_modifier_types` | Discover types |\n| `list_input_keys` | Valid key names |\n\n### Widgets — UMG (11)\n| Command | Description |\n|---------|-------------|\n| `get_widget_tree` | Widget hierarchy |\n| `add_widget` | Add to parent |\n| `remove/move/rename/duplicate_widget` | Widget operations |\n| `get/set_widget_properties` | Widget properties |\n| `get/set_slot_properties` | Layout slot properties |\n| `list_widget_types` | Available widget classes |\n\n### Niagara VFX (96)\n\nEnd-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.\n\n#### Systems\n| Command | Description |\n|---------|-------------|\n| `create_niagara_system` | Create from emitter template or empty |\n| `get_niagara_system_info` | System metadata, emitters, parameters |\n| `list_niagara_systems` | Browse Niagara systems by path |\n| `delete_niagara_system` | Delete a system |\n| `compile_niagara_system` | Force recompile |\n| `set_niagara_system_property` | Set top-level system property |\n| `get_niagara_system_errors` | Compilation errors / warnings |\n| `get_niagara_particle_stats` | Per-emitter particle stats |\n| `get/set_niagara_playback_range` | Preview playback range |\n\n#### Emitters\n| Command | Description |\n|---------|-------------|\n| `get_niagara_emitters` | List emitters in a system |\n| `add_niagara_emitter` | Add from template |\n| `remove_niagara_emitter` | Remove an emitter |\n| `duplicate_niagara_emitter` | Copy emitter with new name |\n| `reorder_niagara_emitter` | Change emitter index |\n| `set_niagara_emitter_property` | Set emitter property |\n| `get_niagara_emitter_attributes` | Particle attributes (Position, Velocity, etc.) |\n\n#### Modules (Spawn / Update / Render stacks)\n| Command | Description |\n|---------|-------------|\n| `get_niagara_modules` | List modules in any stack |\n| `add_niagara_module` | Add module from script asset |\n| `remove_niagara_module` | Remove a module |\n| `set_niagara_module_enabled` | Enable/disable a module |\n| `reorder_niagara_module` | Reorder within stack |\n| `get_niagara_module_inputs` | Inspect module inputs with current values |\n| `set_niagara_module_input` | Set literal value (auto-routes Module.* inputs to rapid-iteration; supports nested dot-paths like `\"Spawn Count.int32001\"`) |\n| `set_niagara_dynamic_input` | Replace input with a dynamic input function (nested-path aware) |\n| `set_niagara_curve` | Set curve points on a curve input |\n| `get_niagara_module_versions` | List script versions |\n\n#### Stack Input Binding Loop\n| Command | Description |\n|---------|-------------|\n| `get_niagara_module_input_binding` | Resolve mode (Default/Local/Linked/Dynamic/Data/Expression) + target + **recursive children** for every input in one call |\n| `clear_niagara_module_input` | Reset an input (or nested path) to default — equivalent to \"Reset to Default\" in the stack UI |\n| `list_niagara_input_source_menu` | Reproduces the editor's source dropdown — engine dynamic-input assets + scratch-pad DIs + link parameters grouped by namespace |\n\n#### Parameters & Bindings\n| Command | Description |\n|---------|-------------|\n| `get_niagara_user_parameters` | List User-namespace parameters |\n| `add_niagara_user_parameter` | Add a User parameter |\n| `set_niagara_user_parameter` | Set a User parameter value |\n| `remove_niagara_user_parameter` | Remove a User parameter |\n| `link_niagara_parameter` | Bind module input to a parameter (supports nested dot-paths) |\n| `get_niagara_rapid_iteration_parameters` | RI param introspection |\n| `set_niagara_rapid_iteration_parameter` | Set RI param value |\n| `list_niagara_available_parameters` | Enumerate well-known + user + scratch-pad-scoped parameters |\n\n#### Renderers\n| Command | Description |\n|---------|-------------|\n| `add_niagara_renderer` | Add Sprite/Mesh/Ribbon/Light renderer |\n| `remove_niagara_renderer` | Remove a renderer |\n| `get_niagara_renderer_info` | Renderer summary with per-binding detail (binding_name + bound_variable + type + dataset_variable) |\n| `get_niagara_renderer_properties` | Full renderer property dump |\n| `set_niagara_renderer_property` | Set renderer property |\n| `set_niagara_renderer_binding` | Bind renderer attribute to particle data |\n\n#### Scratch Pad — CRUD & Apply\n| Command | Description |\n|---------|-------------|\n| `create_niagara_scratch_pad_module` | Create per-emitter scratch module (module / dynamic_input / function) |\n| `list_niagara_scratch_pad_modules` | List scratch pads on a system |\n| `duplicate_niagara_scratch_pad_module` | Duplicate with new name |\n| `rename_niagara_scratch_pad_module` | Rename in-place |\n| `delete_niagara_scratch_pad_module` | Remove from system |\n| `apply_niagara_scratch_pad` | Commit edit-copy → asset (Apply button) |\n| `apply_and_save_niagara_scratch_pad` | Apply + save asset (Apply & Save button) |\n| `create_niagara_module_asset` | Create reusable standalone Niagara Module Script asset |\n\n#### Script Properties (Details Panel)\n| Command | Description |\n|---------|-------------|\n| `get_niagara_script_properties` | Read Category, Description, Keywords, ModuleUsageBitmask, ProvidedDependencies, RequiredDependencies, LibraryVisibility, bDeprecated, bExperimental, NumericOutputTypeSelectionMode, ScriptMetaData, ConversionUtility |\n| `set_niagara_script_properties` | Batch-set any subset (supports `TArray<FName>` like ProvidedDependencies and `TArray<FNiagaraModuleDependency>`) |\n\n#### Script Parameters (Input / Output)\n| Command | Description |\n|---------|-------------|\n| `list_niagara_script_parameters` | Inputs + outputs on a scratch pad / standalone script |\n| `add_niagara_script_parameter` | Add input or output parameter with any registered type (incl. data interfaces) |\n| `remove_niagara_script_parameter` | Remove — **cascades to Map Get / Map Set pin cleanup automatically** |\n| `rename_niagara_script_parameter` | Rename across asset + edit-copy graphs |\n\n#### Graph Introspection\n| Command | Description |\n|---------|-------------|\n| `get_niagara_graph_nodes` | List every node with `verbosity` (summary/connections/full) + `type_filter` + `name_filter`. Three resolver modes: scratch pad, emitter stack graph, standalone script |\n| `get_niagara_node_info` | Deep 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) |\n| `trace_niagara_connection` | BFS upstream/downstream with `pin_name` filter — see the dependency chain without dumping the whole graph |\n| `validate_niagara_graph` | Classify orphaned / dead-end / missing-input nodes (skips `+Add` placeholders) |\n\n#### Graph Node CRUD\n| Command | Description |\n|---------|-------------|\n| `add_niagara_graph_node` | Spawn 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 |\n| `delete_niagara_graph_node` | Delete by index or GUID, mirrors on asset + edit-copy |\n\n#### Pin Management\n| Command | Description |\n|---------|-------------|\n| `add_niagara_map_get_pin` | Add a typed output pin to a Map Get (e.g. `Module.MyParam` as Vector) |\n| `add_niagara_map_set_pin` | Add a typed input pin to a Map Set (e.g. `Particles.Velocity`) |\n| `add_niagara_node_pin` | Add a pin to any UNiagaraNodeWithDynamicPins-derived node |\n| `rename_niagara_node_pin` | Rename a pin on a dynamic-pin node |\n| `remove_niagara_node_pin` | Remove a dynamic pin |\n| `connect_niagara_pins` | Wire two pins with UEdGraphSchema_Niagara::TryCreateConnection validation |\n| `disconnect_niagara_pins` | Break a pin connection |\n\n#### Custom HLSL\n| Command | Description |\n|---------|-------------|\n| `set_niagara_scratch_pad_hlsl` | Write HLSL source into the scratch pad's Custom HLSL node (creates pins as needed) |\n| `add_niagara_custom_hlsl_input` | Add an input pin to a Custom HLSL node |\n| `add_niagara_custom_hlsl_output` | Add an output pin to a Custom HLSL node |\n| `rename_niagara_custom_hlsl_pin` | Rename a pin (also rewrites `{PinName}` references in the HLSL body) |\n| `remove_niagara_custom_hlsl_pin` | Remove a pin |\n\n#### Events & Simulation Stages\n| Command | Description |\n|---------|-------------|\n| `add_niagara_event_handler` | Add event handler stage |\n| `add_niagara_simulation_stage` | Add simulation stage |\n| `get_niagara_event_handlers` | Inspect handlers on emitter |\n\n#### Level Spawning\n| Command | Description |\n|---------|-------------|\n| `spawn_niagara_effect` | Spawn at world location |\n| `control_niagara_effect` | Activate / deactivate / restart |\n| `add_niagara_component` | Add NiagaraComponent to a Blueprint |\n| `get_niagara_actors` | Find spawned Niagara actors |\n\n#### Discovery (zero-guess authoring)\n| Command | Description |\n|---------|-------------|\n| `list_niagara_modules` | All available Niagara module scripts |\n| `list_niagara_emitter_templates` | Emitter templates |\n| `list_niagara_data_interfaces` | Available data interfaces (DI_*) |\n| `list_niagara_data_interface_functions` | **Member functions on a DI class** (Array.Length, Array.Get, etc.) — pass result to `add_niagara_graph_node(node_type=\"DataInterfaceFunction\")` |\n| `list_niagara_parameter_types` | Parameter type registry |\n| `list_niagara_node_types` | Spawnable node classes with pin schema |\n| `get_niagara_node_type_info` | Pin schema for a node class or script asset |\n| `search_niagara_functions` | Find Niagara script assets by usage + name |\n| `get_niagara_schema_actions` | Full graph right-click menu — same source the editor uses. Returns `op_name` / `function_script` / `input_name` for direct use with `add_niagara_graph_node` |\n| `describe_niagara_type` | Type query — `FNiagaraTypeRegistry` types + **UEnum / UScriptStruct reflection fallback** for script-property enums and custom types |\n| `get_niagara_data_interface_schema` | Walk a DI class's editable property schema |\n| `find_niagara_scratch_pad_usage` | Reverse lookup — where is this scratch pad referenced? |\n| `resolve_niagara_built_in_dynamic_input` | AssetRegistry scan for engine-shipped DI scripts (no more hardcoded paths) |\n\n### StateTree (33, NEW)\n\nRead and author StateTree assets — states, tasks, evaluators, transitions, conditions, parameters, and bindings. Schema-aware: works with both `StateTreeSchemaBase` and Mass schema variants.\n\n#### Reading\n| Command | Description |\n|---------|-------------|\n| `get_statetree_info` | Asset summary (schema, states, evaluators) |\n| `get_statetree_full_info` | Full recursive dump (states + tasks + transitions + bindings) |\n| `get_statetree_states` | List all states (flat) |\n| `get_statetree_state` | Single state details by ID/name |\n| `get_statetree_node` | Inspect any node (task/evaluator/condition) |\n| `get_statetree_evaluators` | Global evaluators |\n| `get_statetree_global_tasks` | Global tasks |\n| `get_statetree_parameters` | Tree parameters |\n| `get_statetree_bindings` | All property bindings |\n| `get_statetree_transition_targets` | Valid transition targets for a state |\n| `search_statetree_nodes` | Search nodes by name / type |\n\n#### Authoring\n| Command | Description |\n|---------|-------------|\n| `create_statetree` | Create new StateTree asset |\n| `set_statetree_schema` | Set schema (e.g. Mass schema) |\n| `add_statetree_state` | Add a state (parent or root) |\n| `add_statetree_task` | Add task to a state |\n| `add_statetree_evaluator` | Add global evaluator |\n| `add_statetree_global_task` | Add global task |\n| `add_statetree_condition` | Add enter / transition condition |\n| `add_statetree_transition` | Add transition (event / completed / delegate) |\n| `add_statetree_parameter` | Add tree parameter |\n| `add_statetree_binding` | Bind property between nodes |\n| `compile_statetree` | Compile after edits |\n\n#### Modification\n| Command | Description |\n|---------|-------------|\n| `set_statetree_state_property` | Edit state property |\n| `set_statetree_node_property` | Edit task / evaluator / condition property |\n| `set_statetree_transition_property` | Edit transition property |\n| `set_statetree_color` | Set state color |\n\n#### Removal\n| Command | Description |\n|---------|-------------|\n| `remove_statetree_state` | Remove a state |\n| `remove_statetree_node` | Remove a task / evaluator / condition |\n| `remove_statetree_transition` | Remove a transition |\n| `remove_statetree_binding` | Remove a binding |\n| `remove_statetree_parameter` | Remove a parameter |\n\n#### Discovery\n| Command | Description |\n|---------|-------------|\n| `list_statetree_node_types` | All available task / evaluator / condition types |\n| `list_statetree_enum_values` | Enum values for property dropdowns |\n\n### Performance Profiling (3)\n| Command | Description |\n|---------|-------------|\n| `performance_start_trace` | Start recording .utrace |\n| `performance_stop_trace` | Stop and auto-load |\n| `performance_analyze_insight` | Smart analysis (diagnose, spikes, flame, hotpath, search, histogram, etc.) |\n\n### Debug (2)\n| Command | Description |\n|---------|-------------|\n| `set_mcp_debug` | Enable token tracking |\n| `get_mcp_token_stats` | Token usage stats |\n\n---\n\n## Usage Examples\n\nThese 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.\n\n### Create a Material\n\n```\nCreate a red metallic material at /Game/Materials/M_RedMetal\nwith roughness 0.3 and metallic 1.0\n```\n\nThe AI will call `create_material`, then `build_material_graph` to wire up constant nodes to Base Color, Metallic, and Roughness pins.\n\n### Spawn Actors\n\n```\nSpawn 5 point lights in a circle around the origin at height 300\n```\n\nThe AI will call `spawn_actor` with `actor_type: \"PointLight\"` five times with calculated positions.\n\n### Blueprint Creation\n\n```\nCreate a Blueprint actor called BP_HealthPickup based on Actor,\nadd a Sphere Collision component and a Static Mesh component,\nset it up so on BeginOverlap it prints \"Health Picked Up\"\n```\n\nThe AI will use `create_blueprint`, `add_component_to_blueprint`, `add_event_node`, `add_blueprint_node`, and `connect_blueprint_nodes`.\n\n### Profile Performance\n\n```\nStart a performance trace, play for 10 seconds, stop it,\nthen diagnose the bottlenecks\n```\n\nThe AI will call `performance_start_trace`, wait, `performance_stop_trace`, then `performance_analyze_insight` with `query: \"diagnose\"`.\n\n### Data Table Management\n\n```\nShow me the schema of DT_Items, then add a new row called\n\"IronIngot\" with StackSize 100\n```\n\nThe AI will call `get_data_table_schema`, then `add_data_table_row` with the appropriate data.\n\n---\n\n## Configuration\n\n### Custom Port\n\nAdd to `Config/DefaultEngine.ini`:\n```ini\n[UnrealMCP]\nPort=55557\n```\n\n### Environment Variable\n\n```bash\n# Force a specific port (overrides port file)\nset UNREAL_MCP_PORT=55560\n```\n\n### Multiple Editor Instances\n\nEach 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.\n\n---\n\n## Architecture\n\n### Plugin Structure\n\n```\nPlugins/UnrealMCP/\n├── UnrealMCP.uplugin              # Plugin manifest\n├── cli/                            # Go CLI source (ue-cli)\n│   ├── cmd/                        # Command definitions (288 commands)\n│   ├── internal/bridge/            # TCP client\n│   ├── internal/project/           # Plugin embedding & project detection\n│   └── npm/                        # npm package wrapper\n├── unrealmcp/                      # Python MCP server\n│   ├── _tcp_bridge.py              # TCP communication\n│   └── tools/                      # Tool modules (one per category)\n├── Source/UnrealMCPBridge/         # C++ editor plugin\n│   ├── Public/                     # Headers\n│   └── Private/                    # Implementation + command handlers\n└── .github/workflows/release.yml   # CI: builds + GitHub Release + npm publish\n```\n\n### Communication Protocol\n\nTCP with length-prefix framing:\n```\n[4 bytes: big-endian payload length] [N bytes: UTF-8 JSON]\n```\n\nRequest: `{\"type\": \"command_name\", \"params\": {...}}`\nResponse: `{\"status\": \"success\", \"result\": {...}}`\n\n---\n\n## Adding Custom Commands\n\n### CLI Side (Go)\n\nAdd a `CommandSpec` to the appropriate `cmd/*.go` file:\n\n```go\n{\n    Name:    \"my_command\",\n    Group:   \"mygroup\",\n    Short:   \"What it does\",\n    Long:    \"Detailed description.\",\n    Example: \"ue-cli my_command --param value\",\n    Params: []ParamSpec{\n        {Name: \"param\", Type: \"string\", Required: true, Help: \"Description\"},\n    },\n},\n```\n\n### MCP Side (Python)\n\nCreate a new file in `unrealmcp/tools/`:\n\n```python\n# unrealmcp/tools/my_tools.py\nfrom unrealmcp._bridge import mcp\nfrom unrealmcp._tcp_bridge import _call\n\n@mcp.tool()\ndef my_command(param: str) -> str:\n    \"\"\"Description shown to the AI assistant.\"\"\"\n    return _call(\"my_command\", {\"param\": param})\n```\n\nRegister it in `unrealmcp/tools/__init__.py`:\n\n```python\nfrom unrealmcp.tools import my_tools  # noqa: F401\n```\n\n### C++ Side\n\nAdd a command handler in `Source/UnrealMCPBridge/Private/Commands/` and register it in `ExecuteCommand()`.\n\n---\n\n## Supported AI Tools\n\n| Tool | Interface | Config File | Status |\n|------|-----------|------------|--------|\n| **Claude Code** | CLI or MCP | Bash (CLI) / `.mcp.json` (MCP) | Tested |\n| **Cursor** | MCP | `.cursor/mcp.json` | Tested |\n| **VS Code / Copilot** | MCP | `.vscode/mcp.json` | Supported |\n| **Windsurf** | MCP | `~/.codeium/windsurf/mcp_config.json` | Supported |\n| **Gemini CLI** | MCP | `.gemini/settings.json` | Supported |\n| **JetBrains / Rider** | MCP | `.junie/mcp/mcp.json` | Supported |\n| **Zed** | MCP | `~/.config/zed/settings.json` | Supported |\n| **Amazon Q** | MCP | `.amazonq/mcp.json` | Supported |\n\n---\n\n## Troubleshooting\n\n| Problem | Solution |\n|---------|----------|\n| \"Connection refused\" | Is the UE5 editor running? Check Output Log for `MCP Bridge initialized on port XXXXX` |\n| `ue-cli doctor` shows port file missing | Editor hasn't started yet, or check `Saved/UnrealMCP/port.txt` |\n| Commands timeout | Large operations (profiling, complex graphs) have 300s timeout. Use `--timeout 600` to increase |\n| Multiple editors | Use `--port <num>` or `UNREAL_MCP_PORT` env var to target a specific instance |\n| Plugin not compiling | Ensure `PythonScriptPlugin`, `EditorScriptingUtilities`, `EnhancedInput` are enabled |\n| Python import errors | Run `pip install fastmcp requests` — make sure the Python on your PATH matches your AI tool's |\n| Plugin not loading | Verify `UnrealMCP.uplugin` has `\"Type\": \"Editor\"` and required plugins are available in your engine build |\n\n---\n\n## Releases & Distribution\n\n| Channel | Command |\n|---------|---------|\n| **npm** | `npm install -g unrealcli` |\n| **GitHub Releases** | [Download binaries](https://github.com/aadeshrao123/Unreal-MCP/releases) |\n| **pip** (MCP only) | `pip install unrealmcp` |\n\nReleases are automated via GitHub Actions. Push a tag to trigger:\n```bash\ngit tag v1.2.2 && git push origin v1.2.2\n# → Builds 5 platform binaries\n# → Creates GitHub Release\n# → Publishes to npm + PyPI\n```\n\n---\n\n## Contributing\n\n- **Bug?** [Open an issue](https://github.com/aadeshrao123/Unreal-MCP/issues/new)\n- **Feature idea?** [Open an issue](https://github.com/aadeshrao123/Unreal-MCP/issues/new)\n- **Code?** [Fork](https://github.com/aadeshrao123/Unreal-MCP/fork), make changes, open a PR\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n---\n\n## Enterprise & Studio Integration\n\nNeed 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.\n\n**What I offer:**\n\n- **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\n- **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\n- **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\n- **Advanced Material & Substrate Systems** — Procedural material generation, Substrate workflows, complex shader pipelines — fully automated through MCP\n\n**Get in touch:**\n\n- Email: [aadeshrao80@gmail.com](mailto:aadeshrao80@gmail.com)\n- LinkedIn: [linkedin.com/in/aadeshyadav](https://www.linkedin.com/in/aadeshyadav/)\n- Discord: `destroyerpal`\n- Portfolio: [aadeshyadav.vercel.app](https://aadeshyadav.vercel.app/)\n\n---\n\n## Custom Development & Support\n\nNeed 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](SUPPORT.md) for details.\n\n[aadeshrao80@gmail.com](mailto:aadeshrao80@gmail.com) · [LinkedIn](https://www.linkedin.com/in/aadeshyadav/) · [Portfolio](https://aadeshyadav.vercel.app/) · Discord: `destroyerpal`\n\n---\n\n## License\n\nMPL-2.0 — see [LICENSE](LICENSE) for details.\n",
  "bytes": 43814,
  "sha": "0cccb125994f43a156b4526b560b51c0cf6aa661a4dada9c04222ff57184b867",
  "repo_slug": "aadeshrao123/unreal-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_aadeshrao123_unreal_mcp_95a4d5b5/readme"
}