Search DevTools

Jump to any tool or page

ChiR24-unreal_mcp

Trending

Control Unreal Engine to browse assets, import content, and manage levels and sequences. Automate…

ChiR24903 stars171 forksDeveloper Tools
View source

Install

mcp_config.json

{
  "mcpServers": {
    "ai-smithery-chir24-unreal-mcp": {
      "url": "https://server.smithery.ai/@ChiR24/unreal_mcp/mcp",
      "type": "streamable-http"
    }
  }
}

Documentation

Connect Claude, Cursor, VS Code or any other MCP client to a running Unreal Editor, and let it build levels, Blueprints, UI, materials, effects and more, through a native C++ editor plugin.

🧭 One tool, nearly 400 capabilities  ·  ⚙️ Native C++ editor plugin  ·  🌐 HTTP or stdio  ·  🔐 Local and token-protected by default  ·  🎮 Unreal Engine 5.0 – 5.8

🚀 Quick Start  ·  📖 Wiki  ·  📦 Releases  ·  💬 Discussions

📌 Which version is this? This README describes the 0.6 line: the dev branch and npm unreal-engine-mcp-server@beta. The previous stable release, 0.5.30 (npm latest), exposes 23 separate tools instead of one; see Upgrading from 0.5.x.

Contents · What it does · How it works · Quick start · The unreal tool · Configuration · Security · Engine plugins · Docker · Documentation · Development · Community


What it does

🏗️ Levels and actors Spawn one actor or hundreds in a single call, place and attach them, find the ones sunk into the floor, and load, stream and save levels.

🧩 Blueprints and UI Create Blueprints, variables and components, build whole event graphs in one batch, and lay out UMG widgets, with a preview image to check them.

🎨 Materials and worlds Material graphs and instances, procedural textures, lighting, landscapes, foliage, Niagara effects and PCG graphs.

🕹️ Gameplay Characters and animation, Gameplay Ability System, AI (Behavior Trees, State Trees, EQS), inventory, networking and Enhanced Input.

🎬 Cinematics and audio Level Sequences, cameras, Movie Render Queue and Take Recorder; Sound Cues and MetaSounds.

🧪 Play and verify Run Play-In-Editor with synthetic input, take screenshots the model can see, read logs, profile, run Python, and package builds.

Nearly 400 capabilities in all, behind a single MCP tool. The assistant finds them by searching in plain words, so nobody has to learn their names. The full list is the generated Action Reference.

A platformer level built with the MCP, in Unreal Editor 5.8. Bottom right: the plugin's status, MCP :3000 (1), meaning the native server is running on port 3000 with one client connected.

How it works

The MCP Automation Bridge plugin runs inside the editor and does all the work, on the editor's game thread. Clients reach it in one of two ways, and both expose the same single tool, unreal:

🌐 Route A · Native HTTP🧩 Route B · stdio
PathClient → the plugin's Streamable HTTP server at http://127.0.0.1:3000/mcpClient → unreal-engine-mcp-server (Node.js, stdio) → the plugin's WebSocket on 127.0.0.1:8090
Node.jsNot needed20.19 or later
Capability tokenThe client sends it in the X-MCP-Capability-Token headerRead from the project, given UE_PROJECT_PATH
Best forClaude Code, Cursor, VS Code, and several clients sharing one editorClaude Desktop, and clients that only launch local commands

Everything listens on 127.0.0.1 and requires the project's capability token unless you change it.

Quick start

The Quick Start page walks through this with screenshots. You need Unreal Engine 5.0 to 5.8 and a project with C++ code; a Blueprint-only project can use prebuilt binaries.

1. Add the plugin

Download McpAutomationBridge-plugin-<version>.zip from the newest v0.6 pre-release on the Releases page, and copy the McpAutomationBridge folder it contains into your project:

MyGame/Plugins/McpAutomationBridge/

Or use a clone of this repository: copy plugins/McpAutomationBridge/, or reference the folder from your .uproject with "AdditionalPluginDirectories": ["C:/Path/To/Unreal_mcp/plugins"].

Open the project and let Unreal rebuild the plugin. When it's loaded, the status bar shows MCP off. If you see "Engine modules cannot be compiled at runtime", build the project once in Visual Studio, Rider or Xcode. More in Installation.

https://github.com/user-attachments/assets/d8b86ebc-4364-48c9-9781-de854bf3ef7d

Prebuilt binaries (Blueprint-only projects, teams)

Build the plugin once on a machine with the engine and a compiler, then hand out the zip. No compiler is needed on the target machine:

node scripts/package-plugin.mjs "C:/Program Files/Epic Games/UE_5.7"

This writes build/McpAutomationBridge-v<version>-UE5.7-<Platform>.zip, where <version> is the package.json version (currently 0.6.0-beta-c). Unzip it into YourProject/Plugins/. Binaries only work with the engine minor and platform they were built for: a 5.6 build won't load in 5.5, 5.7 or 5.8.

2. Connect your client

Route A · Native HTTP (no Node.js)

  1. In Edit › Project Settings › Plugins › MCP Automation Bridge, tick Enable Native MCP Server (port 3000 by default), then restart the editor. The status bar now reads MCP :3000 (0).

  2. Read the capability token the plugin generated: <YourProject>/Saved/MCP/capability-token. Treat it like a password.

  3. Add the server to your client and send the token in the X-MCP-Capability-Token header. Claude Code:

    claude mcp add --transport http unreal-engine http://127.0.0.1:3000/mcp --header "X-MCP-Capability-Token: <token>"
    

    Or in a project .mcp.json (Claude Code), reading the token from an environment variable:

    {
      "mcpServers": {
        "unreal-engine": {
          "type": "http",
          "url": "http://127.0.0.1:3000/mcp",
          "headers": { "X-MCP-Capability-Token": "${UNREAL_MCP_TOKEN}" }
        }
      }
    }
    

    Cursor (.cursor/mcp.json) takes the same url and headers without type. VS Code, Windsurf and others: Connecting Clients.

  4. Check it: when the client connects, the count in the status bar goes up.

Keep the session when the editor restarts (proxy, Node.js 20.19+)

A client connected straight to /mcp loses its session whenever the editor closes or crashes, and has to reconnect by hand. The package's proxy command sits in between over stdio: while the editor is down every call answers NOT_CONNECTED, and the first call after it is back reaches it, with no reconnect. It keeps the editor's last tool list, so a session that starts before the editor still gets the real tool.

{
  "mcpServers": {
    "unreal-engine": {
      "command": "npx",
      "args": ["-y", "unreal-engine-mcp-server@beta", "proxy"],
      "env": { "UE_PROJECT_PATH": "C:/Path/To/YourProject" }
    }
  }
}

The token is found the same way as on Route B (MCP_AUTOMATION_CAPABILITY_TOKEN, else the project's token file). UNREAL_MCP_URL points it at another endpoint (default http://127.0.0.1:3000/mcp). Route B survives editor restarts the same way on its own.

Route B · stdio (Node.js 20.19+)

Add this to your client's MCP configuration, for example Claude Desktop's claude_desktop_config.json:

{
  "mcpServers": {
    "unreal-engine": {
      "command": "npx",
      "args": ["-y", "unreal-engine-mcp-server@beta"],
      "env": {
        "UE_PROJECT_PATH": "C:/Path/To/YourProject"
      }
    }
  }
}

UE_PROJECT_PATH (the project folder or its .uproject) is how the server finds the capability token and the plugin's port, so nothing else needs setting. Keep the @beta tag: without it, npm installs 0.5.30, which doesn't match a 0.6 plugin.

3. Try it

With the editor open, ask your assistant to "list the actors in the current level", "spawn a point light 300 units above the origin", or "take a screenshot of the viewport". If it doesn't connect, see Troubleshooting.

The unreal tool

Both routes expose exactly one MCP tool, unreal, with four operations. Only the contract the model is about to use gets loaded, instead of hundreds of tool schemas:

OperationWhat it does
searchFinds capabilities from 2-4 plain words, such as spawn actor or save level. Every row carries a ready-to-send nextCall.
describeReturns one capability's exact contract: parameters, schemas, an example, and the consent grant when one is needed
executeRuns one capability with validated parameters and returns the data plus a receipt of what changed
configureEnables or disables groups of internal tools; never touches the editor

A typical exchange:

{ "operation": "search", "query": "spawn actor" }
{ "operation": "describe", "tool": "control_actor", "action": "spawn" }
{
  "operation": "execute",
  "tool": "control_actor",
  "action": "spawn",
  "params": { "classPath": "/Script/Engine.PointLight", "actorName": "KeyLight", "location": [0, 0, 300] }
}
  • Parameters are strict. An undeclared name is refused with UNDECLARED_PARAMETER and the list of allowed names; every error carries an executable nextCall.
  • Deletes need consent. 62 capabilities (all destructive ones, plus some writes) only run with the consentGrant from describe, passed back as a top-level consent field.
  • Names. Both routes accept the tool + action pair; the stdio route also accepts a capability id, such as "capability": "control_actor.spawn".

Full reference with real replies: Using the Gateway.

Migrating from direct tool calls

The single unreal tool is permanent on both routes; there is no opt-out and no 23-tool listing to restore. A client that still calls a canonical tool name directly (tools/call with name: "manage_asset", name: "control_actor", …) receives a bounded, copy-paste-executable DIRECT_TOOL_CALL_REMOVED receipt instead of a routed call. Its nextCall drills exactly one level: { "operation": "search" } for an unknown name, { "operation": "describe", "tool": "<tool>" } when no action was given, or { "operation": "execute", "tool": "<tool>", "action": "<action>", "params": { ... } } when the call already named an action. Run that nextCall through unreal to finish the migration. See Upgrading.

Protocol versions

Both routes negotiate the MCP protocol version at initialize. The native /mcp transport supports 2025-11-25 (latest), 2025-06-18 and 2025-03-26; the stdio server also accepts the legacy 2024-11-05 and 2024-10-07. An unsupported MCP-Protocol-Version header on the native route gets HTTP 400. Both also answer server/discover without a session, listing those versions, so a client on the newer 2026-07-28 revision falls back to initialize. Details: docs/protocol.md.

The 23 internal tools behind unreal

These route requests inside the gateway; clients never list them. More in the Tools Reference.

CategoryToolCovers
Coremanage_assetAssets and folders, materials and material graphs, textures and render targets, data tables, structs, enums, source control
Coremanage_blueprintBlueprints, components, variables, event graphs, UMG widgets, layout, bindings, widget animations
Corecontrol_actorSpawning, transforms, attachment, components, materials, tags, placement audits
Corecontrol_editorPlay-In-Editor, synthetic input, screenshots, viewport camera, undo, editor preferences
Coremanage_levelCreate, load, save, stream, import and export levels; world settings; lighting builds
Coresystem_controlConsole commands, logs, project settings, profiling, builds and packaging, tests, Python
CoreinspectRead and write any UObject's properties, components and class info
Coremanage_toolsWhich internal tools are enabled (through configure)
Worldbuild_environmentLandscapes, foliage, lights and sky, water, weather, splines, procedural terrain
Worldmanage_level_structureSublevels, World Partition, streaming, data layers, HLOD, volumes
Worldmanage_geometryGeometry Script meshes: booleans, deformers, UVs, collision, LODs, polygon cages, subdivision surfaces, material ids, vertex-color masks
Worldmanage_pcgPCG graphs: create, add and connect nodes, execute
Gameplayanimation_physicsAnimation Blueprints, blend spaces, montages, skeletons, Control Rig and IK, ragdolls, cloth, vehicles
Gameplaymanage_characterCharacter Blueprints, movement, MetaHuman
Gameplaymanage_combatWeapons, projectiles, hit detection
Gameplaymanage_effectNiagara systems, emitters and modules, debug shapes
Gameplaymanage_gasGameplay Ability System: abilities, attributes, effects
Gameplaymanage_aiAI controllers, Behavior Trees, EQS, State Trees, Smart Objects, perception, navigation
Gameplaymanage_inventoryItems, loot tables, crafting recipes
Gameplaymanage_interactionDoors and other interactables
Utilitymanage_audioSounds, audio components, Sound Cues, MetaSounds, attenuation, mixes
Utilitymanage_sequenceLevel Sequences, Movie Render Queue, media, Take Recorder, replays
Utilitymanage_networkingReplication, RPCs, sessions, game framework classes, Enhanced Input

Configuration

Most setups touch one setting: Enable Native MCP Server for Route A, or UE_PROJECT_PATH for Route B. Everything is listed on the Configuration page.

Plugin settings (Project Settings › Plugins › MCP Automation Bridge, saved in Config/DefaultGame.ini):

SettingDefault
Enable Native MCP ServeroffServe MCP over HTTP at /mcp
Native MCP Port3000The MCP_NATIVE_PORT environment variable of the editor process overrides it
Listen Ports8090,8091WebSocket ports for Route B
Require Capability TokenonBoth routes refuse clients without the token
Allow Non LoopbackoffLAN access for both listeners. See Security.

Environment variables (Route B only, in the client's env block):

VariableDefault
UE_PROJECT_PATHunsetProject folder or .uproject; used to find the token and the port
MCP_AUTOMATION_PORTthe project's first Listen Ports entry, else 8090Editor WebSocket port
MCP_AUTOMATION_HOST127.0.0.1A LAN address also needs MCP_AUTOMATION_ALLOW_NON_LOOPBACK=true
MCP_AUTOMATION_CAPABILITY_TOKENread from the token fileToken to present, when the server can't read the project folder
MCP_ADDITIONAL_PATH_PREFIXESemptyExtra content roots such as /MyPluginContent/, comma-separated; most content-path arguments also accept the mounts the connected editor reports, so this is needed only with no editor connected, for a mount the editor does not report or the server ignores, and for arguments the server treats as files (filePath, outputPath and a few others), even where outputPath names an asset
LOG_LEVELinfodebug, info, warn or error; log

Sourced from the repository README.

More in Developer Tools