NAJEMWEHBE/unreal-ai-connection

๐ŸŽฎ Gaming
0 Views
0 Installs

๐ŸŒŠ ๐Ÿ ๐Ÿ  ๐ŸชŸ - Drive the Unreal Engine 5.7 editor from any MCP client over a local TCP socket โ€” 105 editor-automation tools (72 native C++ + 33 bridge-side). Native C++ plugin + thin Python bridge, 50ms round-trips. 498 tests, MIT.

Quick Install

One-Click IDE Configuration
claude_desktop_config.json
{
  "mcpServers": {
    "najemwehbe-unreal-ai-connection": {
      "command": "npx",
      "args": [
        "-y",
        "najemwehbe-unreal-ai-connection"
      ]
    }
  }
}
Or

Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.

Documentation Overview

[!WARNING] DEPRECATED โ€” this project is no longer maintained (deprecated 2026-07-17; active development stopped 2026-07-03, when the maintainer moved to Epic's native plugin for this workflow). No further features, fixes, releases, or PR/issue responses are promised.

Last-known-good state: UE 5.7 officially supported & tested (source build); UE 5.6 via the prebuilt v0.9.1-ue5.6 release. Other UE versions remain best-effort via the kept compat scaffold (ADR-0001), untested.

Toolchain note: the maintainer's BuildConfiguration.xml <CompilerVersion> pin stays cleared (see the 36th closing note in docs/HANDOFF.md) โ€” UE โ‰ค5.3 source builds require re-pinning an engine-appropriate MSVC toolchain yourself. No new build promises on any version.

The code stays up under the MIT license โ€” forks welcome. Full deprecation record: the 37th closing note.

Unreal AI Connection

Drive Unreal Engine 5.7 from any MCP-compliant client over a local TCP socket.

151 tools total. Zero pixel-clicking. ~50ms round-trip.

CI License Unreal Engine Python MCP Tests Tools Changelog PRs Welcome

Unreal AI Connection โ€” abstract geometric AI core on the left, orange data streams flowing right into a wireframe low-poly 3D landscape with mountains and a glowing river

Live demo: an MCP client procedurally builds a city in Unreal Engine 5.7, places Niagara FX, and orbits a camera

Live capture โ€” an MCP client builds the scene, places Niagara FX (spawn_niagara_at_location), and orbits a camera, entirely over the local TCP socket. Reproduce with scripts/capture_demo_gif.py.

Native C++ handlers โ€” not Python Remote Execution. ~50 ms round-trips across 149 tools ยท 637 tests ยท MIT ยท works with any MCP-compliant client (Claude Code, Cursor, Cline, Codex, Gemini, Continue, Windsurf, Zed, โ€ฆ).

The suite now spans inspection and authoring โ€” read existing assets and create them: actors, levels, data tables/assets, Blueprints (incl. K2 graph nodes), material graphs, Niagara FX, Level Sequence cinematics (camera cuts, audio, visibility), and Movie Render Queue renders โ€” all over the same socket.

โญ If this saves you time, a star helps other devs find it.

Authoring high-quality assets: see docs/ASSET-PIPELINE-BLENDER.md.


Install (one paste, any client)

Every route below only wires the stdio bridge. You must separately install the UE 5.7 plugin into your project's Plugins/ folder and launch the editor (it binds 127.0.0.1:18888). See docs/setup/README.md for the prerequisite, and docs/DISTRIBUTION.md for how this is published.

Claude Code โ€” paste the owner/repo, no clone needed:

/plugin marketplace add NAJEMWEHBE/unreal-ai-connection
/plugin install unreal-ai-connection@unreal-ai-connection

Cursor โ€” one-click deeplink. Base64-encode your machine's bridge path into this template:

cursor://anysphere.cursor-deeplink/mcp/install?name=unreal-ai-connection&config=<BASE64>

where <BASE64> is base64 of {"command":"python3","args":["/ABSOLUTE/PATH/TO/bridge/unreal_ai_connection_bridge.py"]} (on Windows use "command":"py" if python3 is not on PATH). Manual fallback โ€” .cursor/mcp.json:

{ "mcpServers": { "unreal-ai-connection": { "command": "python3", "args": ["/ABSOLUTE/PATH/TO/bridge/unreal_ai_connection_bridge.py"] } } }

VS Code โ€” install deeplink (URL-encode the JSON for your path):

vscode:mcp/install?<URL-ENCODED {"name":"unreal-ai-connection","command":"python3","args":["/ABSOLUTE/PATH/.../bridge/unreal_ai_connection_bridge.py"]}>

Windows: all snippets use python3; if that's not on PATH use the py launcher instead ("command": "py"). The .claude-plugin/mcp-config.json marketplace path uses python3 for cross-platform consistency โ€” Windows users without python3 should use the manual per-client recipe in docs/setup/ with py.

Every other client โ€” copy-paste recipe per client:

ClientRouteRecipe
Claude Code/plugin marketplace add NAJEMWEHBE/unreal-ai-connectiondocs/setup/claude-code.md
Claude Desktopedit claude_desktop_config.jsondocs/setup/claude-desktop.md
Cursordeeplink / .cursor/mcp.jsondocs/setup/cursor.md
Codex CLIcodex mcp add unreal-ai-connection -- โ€ฆdocs/setup/codex-cli.md
Windsurfmcp_config.jsondocs/setup/windsurf.md
Continue~/.continue/config.yamldocs/setup/continue.md
ClineMCP Marketplace tab / settingsdocs/setup/cline.md
Zed~/.config/zed/settings.jsondocs/setup/zed.md
Gemini CLI~/.gemini/settings.jsondocs/setup/gemini-cli.md
VS Code Copilot.vscode/mcp.jsondocs/setup/vscode-copilot.md

Also discoverable in the official MCP Registry as io.github.najemwehbe/unreal-ai-connection (feeds the VS Code MCP gallery, mcp.so, PulseMCP) and submittable to the Cline marketplace via llms-install.md.


Jump to


How it fits together

graph LR
    A[Any MCP client] -->|stdio MCP| B[Python Bridge]
    B -->|TCP 127.0.0.1:18888| C[UnrealAIConnection plugin<br/>UE editor module]
    C -->|native C++ API| D[Unreal Editor 5.7]
Per-call sequence โ€” click to see exactly what fires on a single tool call
sequenceDiagram
    participant User
    participant Client as MCP client<br/>(e.g. Claude Code)
    participant Bridge as Python bridge
    participant Plugin as UE plugin module
    participant Editor as Unreal Editor 5.7

    User->>Client: "Spawn a Cube at origin"
    Client->>Bridge: stdio MCP โ€” tools/call spawn_actor
    Bridge->>Plugin: TCP 127.0.0.1:18888<br/>JSON-RPC framed
    Plugin->>Editor: GEditor->SpawnActor()
    Editor-->>Plugin: success + actor ref
    Plugin-->>Bridge: JSON-RPC result
    Bridge-->>Client: MCP envelope
    Client-->>User: rendered confirmation<br/>(~50ms total)

You ask Claude Code: "Take a screenshot of my level and tell me what's there." โ€” Claude resolves the request to a tool call, the bridge forwards it as JSON-RPC to the running editor, the plugin captures the viewport, and Claude renders the image inline. Same flow works for spawning actors, inspecting Blueprints, mutating Widget Trees, executing arbitrary unreal.* Python, listing actors, focusing the viewport, loading levels, taking high-res screenshots.

The plugin binds to 127.0.0.1 only โ€” your running editor is never reachable across the network.


Why it exists

UE 5.7's Python reflection has known dead-ends. Most painfully: EditorUtilityWidgetBlueprint.WidgetTree is a UPROPERTY() without EditAnywhere, so neither get_editor_property nor direct attribute access can reach it. This blocks "let an LLM build me an editor utility panel" workflows entirely.

The plugin sidesteps these limits by calling UE's native C++ APIs directly inside the editor process. It's also dramatically faster than driving UE's GUI with screenshot pixel-clicks โ€” ~50ms round-trip vs. minutes of GUI fiddling.


Why MCP specifically

MCP (Model Context Protocol) is a vendor-neutral I/O protocol designed for LLM tool-use. Because this plugin speaks MCP rather than baking in any one client, every conforming client gets all 151 tools for free: Claude Code, Codex CLI, Cursor, Gemini CLI, Continue, Zed, Cline, and any future entrant. Switch clients without changing the plugin or the bridge.

The wire format is stdio MCP between client and bridge, then a tight length-prefixed JSON-RPC over TCP 127.0.0.1:18888 between bridge and the running UE editor. Either side can be reimplemented in another language; the contract is the JSON.


Tools

151 tools total. 114 are native C++ handlers registered by the plugin at editor startup; 37 are bridge-side synthetic tools (wait_for_events, get_camera_transform, set_camera_transform, screenshot_actor, compile_mod_pak, compile_mod_pak_direct, bulk_delete_assets, bulk_move_assets, bulk_rename_assets, bulk_duplicate_assets, bulk_inspect_assets, inspect_data_asset, inspect_sound_class, inspect_sound_submix, inspect_audio_bus, inspect_material_function, inspect_metasound, find_unused_assets, get_reference_chain, bulk_compile_blueprints, audit_blueprint_compile_status, find_actors_by_class, bulk_focus_actors, bulk_screenshot_actors, bulk_set_actor_property, compare_assets, bulk_set_console_variables, inspect_dependency_graph, bulk_fix_redirectors, marketplace_search, marketplace_import, convert_hdri_to_cubemap, sequencer_add_transform_keyframe, import_mesh, material_auto_remap, batch_capture_cameras, batch_spawn_from_csv) that compose existing handlers without a dedicated UE round-trip (or, for compile_mod_pak and compile_mod_pak_direct, shell out to RunUAT or UnrealPak entirely outside the UE process) โ€” see bridge/unreal_ai_connection_bridge.py's SYNTHETIC_TOOLS. Per-tool JSON schemas and examples live in docs/TOOLS.md. Grouped overview:

Progressive tool disclosure (opt-in). Advertising all 147 schemas up front is a lot of context โ€” past ~30โ€“50 tools, model tool-selection accuracy and token cost both degrade (Anthropic Tool Search Tool, MCP discussion #532). Set the environment variable UCMCP_TOOL_MODE=progressive on the bridge and tools/list returns only a small core set (get_project_summary, list_tools, get_actors_in_level, execute_unreal_python, take_high_res_screenshot, get_viewport_screenshot, poll_events) plus a single search_tools discovery tool. The model calls search_tools(query="add a camera keyframe", category="sequencer") to pull the schemas of just the tools it needs, on demand. Every one of the 147 tools stays directly callable via tools/call in both modes โ€” progressive mode changes only what is advertised, never what is dispatchable, so existing clients keep working. Default (unset / all) is the legacy expose-everything behaviour. search_tools runs entirely bridge-side (no UE round-trip), validates its input, and fails closed.

Python execution (5 tools)

Python execution โ€” click to expand the tool table
ToolPurpose
execute_unreal_pythonUniversal escape hatch โ€” run arbitrary unreal.* Python in the editor's interpreter. Multi-line scripts work.
run_python_fileExecute a .py file from disk in the editor's Python interpreter.
apply_python_to_selectionRun a Python snippet with the editor's current selection bound as actors / assets.
exec_python_persistentPersistent Python session โ€” variables defined in one call survive into the next.
reset_python_stateWipe the persistent session's globals.

Project / asset registry (10 tools)

Project / asset registry โ€” click to expand the tool table
ToolPurpose
get_project_summaryProject name, engine version, enabled plugins, asset count.
find_assetsQuery the asset registry by class + path + name.
inspect_assetClass, tags, dependencies, referencers, on-disk size.
move_assetMove an asset to a different folder; UE creates a redirector at the source path.
rename_assetChange an asset's leaf name in place; UE creates a redirector at the old name.
duplicate_assetCopy an asset to a new path.
delete_assetDelete an asset; refuses if referenced by other packages unless force=true.
fix_up_redirectorsResolve all object redirectors under a folder.
create_data_tableCreate a new UDataTable asset whose rows conform to a given row UScriptStruct.
create_data_assetCreate a new UDataAsset (or subclass) asset from a UDataAsset subclass path.

Blueprint / widget / animation โ€” introspection + authoring (20 tools)

Blueprint / widget / animation โ€” introspection + authoring โ€” click to expand the tool table
ToolPurpose
inspect_blueprintVariables, function/event graphs, parent class of any Blueprint asset.
compile_blueprintRecompile a Blueprint asset and report errors.
inspect_widget_treeRead the widget hierarchy of a UWidgetBlueprint or EUW (the thing UE Python can't do).
inspect_widget_blueprintWidget-BP-specific surface: animations, delegate bindings, palette category, inherited named slots, property-binding count, blueprint compile status. Pairs with inspect_blueprint + inspect_widget_tree.
edit_widget_treeMutate the tree: set_root / add_child / set_property. Solves the EUW WidgetTree blocker.
inspect_anim_blueprintRead variables and state machines of an Animation Blueprint.
inspect_anim_montageRead sections, slots, and notify tracks of an UAnimMontage.
inspect_static_meshLODs, materials, collision, bounds for a UStaticMesh.
inspect_skeletal_meshLODs, materials, sockets, skeleton info for a USkeletalMesh.
inspect_physics_assetBody setups (one per simulated bone), constraint setups (joints between bodies), bounds-bodies subset, named physical-animation + constraint profiles. Cross-links to inspect_skeletal_mesh via preview_skeletal_mesh.
inspect_niagara_systemEmitters and exposed user parameters of a Niagara system.
inspect_landscapeComponents, layers, and material info for a landscape actor.
inspect_data_tableRowStruct identity, sorted row names, per-property name+type for every FProperty on the row struct, plus client-strip / ignore-extra/missing-fields flags.
inspect_curveUCurveBase channel layout (1ch UCurveFloat / 4ch UCurveLinearColor / 3ch UCurveVector), per-channel name + key count + per-channel + global time/value range.
create_blueprintCreate a new UBlueprint asset under /Game/ from a parent class (default /Script/Engine.Actor).
add_blueprint_variableAdd a typed member variable (bool/int/float/string/name/vector/rotator/transform/object) to an existing UBlueprint.
add_blueprint_functionAdd a new empty function graph to an existing UBlueprint.
add_blueprint_nodeAdd a K2 node (call_function / variable_get / variable_set / branch) to a Blueprint event or function graph; returns the new node's GUID + pins.
connect_blueprint_pinsWire two pins (exec or data) between nodes by GUID + pin name, via the schema-validated UEdGraphSchema_K2::TryCreateConnection.
set_blueprint_node_pin_defaultSet a literal or object default on an input pin (verified by read-back).

Materials (6 tools)

Materials โ€” click to expand the tool table
ToolPurpose
create_material_instanceCreate a UMaterialInstanceConstant asset with a parent material set.
set_mi_parameterOverride a scalar/vector/texture parameter on a material instance. Type discriminator picks value shape.
inspect_materialList parameter names declared by a UMaterial or UMaterialInstance (scalar/vector/texture/static-switch).
inspect_material_instanceRead a material instance's parent + currently-overridden parameter values.
add_material_expressionCreate a UMaterialExpression node inside an existing UMaterial's graph, then recompile the material.
connect_material_expressionWire an expression's output to a material property input (property:BaseColor) or another expression's input (node:<ExprName>:<InputName>), then recompile.

Textures (3 tools)

Textures โ€” click to expand the tool table
ToolPurpose
import_textureBring an image file (PNG / JPG / EXR / TGA / BMP / HDR) from disk into the project as a UTexture2D asset via UE's canonical import path.
configure_textureAdjust SRGB / compression / LOD group / filter on an existing texture asset.
inspect_textureTexture class, surface dimensions, sRGB, compression, filter, LOD group, mip-gen, virtual-texture / never-stream flags, composite-texture cross-link. UTexture2D-specific size / mips / pixel format / imported source dimensions emitted conditionally.

Level Sequences (9 tools)

Level Sequences โ€” click to expand the tool table
ToolPurpose
inspect_sequenceRead structure of a Level Sequence: tracks, sections, bindings, frame rate, playback range.
create_sequenceCreate a new empty Level Sequence asset with a configured display rate and playback range.
bind_actor_to_sequenceAdd a level actor as a possessable binding to a Level Sequence.
set_sequence_playback_rangeSet a Level Sequence's playback start/end (display-rate frames).
add_cine_camera_to_sequenceSpawn an ACineCameraActor and add it as a possessable binding; returns the binding GUID (feed it to add_camera_cut_track).
add_camera_cut_trackAdd (or reuse) the camera-cut track and bind a camera over a [start, end] frame range.
add_audio_trackAdd a master audio track + sound section to a Level Sequence.
add_visibility_trackAdd an actor-visibility track that keys an actor shown/hidden over time (inverted bHidden).
render_sequence_mrqAsync-render a Level Sequence (optional map override) to PNG / JPG / BMP / EXR via Movie Render Queue; returns a task_id (completion via poll_task).

Level / actor authoring (24 tools)

Level / actor authoring โ€” click to expand the tool table
ToolPurpose
get_actors_in_levelName / class / transform of every actor; optional case-insensitive substring filter.
spawn_actorCreate an actor at a location with optional rotation, label, and initial properties. Class path supports built-ins and Blueprints.
set_actor_transformMove / rotate / scale an existing actor by name. Absolute or relative mode.
delete_actorRemove an actor by name. Force flag overrides children-attached safety check.
set_actor_propertyMutate any UPROPERTY on an actor. Supports primitives, FName/FText, vectors, rotators, colors, enums, and TSoftObjectPtr.
add_componentAttach a component (UActorComponent / USceneComponent subclass) to an existing actor at runtime, optionally socketed.
duplicate_actorClone an existing level actor (label or FName), optionally offset and relabel. Undoable (single Ctrl+Z).
set_actor_folderSet an actor's World Outliner folder path (e.g. Lighting/Key); empty string moves it to the outliner root. Undoable.
rename_actorChange an actor's World Outliner display label (SetActorLabel); the stable FName is unchanged. Undoable.
focus_actorSelect an actor by label and frame the viewport on it.
load_level_by_pathOpen a level by package path.
create_levelCreate a new empty level (UWorld) asset under /Game/ and open it as the active level.
build_lightingInvoke a static-lighting build on the active editor world. Non-interactive; may take time on large levels.
spawn_niagara_at_locationPlace a Niagara system in the level (ANiagaraActor + SetAsset) at a world transform; optional auto-activate. Undoable.
spawn_niagara_attachedAttach a Niagara system component to an existing actor, optionally socketed. Undoable.
set_niagara_user_paramSet a user-exposed Niagara parameter (float / vec3 / linear-color / bool) on a placed Niagara component, with type-match validation. Undoable.
find_actors_by_classFilter the active level's actors by class. Composes get_actors_in_level and matches against the short class name. Bridge-side synthetic.
bulk_focus_actorsFrame the viewport on each actor in a sequence, optionally screenshotting each one. Composes focus_actor (+ get_viewport_screenshot) per name. Bridge-side synthetic.
bulk_screenshot_actorsFocus + screenshot each actor in a sequence. Composes screenshot_actor per name. Bridge-side synthetic.
bulk_set_actor_propertyApply many {actor, property, value} mutations in one call. Composes set_actor_property per assignment. Bridge-side synthetic.
compare_assetsSymmetric diff between two assets' inspect_asset outputs. Bridge-side synthetic.
bulk_set_console_variablesSet many CVars in one call with optional atomic rollback. Composes get_console_variable + set_console_variable. Bridge-side synthetic.
inspect_dependency_graphBFS the asset dependency graph (down by default, optional bidirectional sweep). Composes inspect_asset recursively. Bridge-side synthetic.
bulk_fix_redirectorsResolve redirectors across many content folders in one call. Composes fix_up_redirectors per folder. Bridge-side synthetic.

Viewport / screenshots (3 tools)

Viewport / screenshots โ€” click to expand the tool table
ToolPurpose
get_viewport_screenshotActive viewport as a PNG written to a project-confined disk path (throttle-proof fresh frame; optional small inline thumbnail).
take_high_res_screenshotTrigger UE's HighResShot console command.
render_camera_to_pngForce a synchronous render of the level-editor viewport (or an off-screen SceneCapture2D at arbitrary resolution) and write a PNG โ€” works headless where deferred screenshots fail.

Console / logs (5 tools)

Console / logs โ€” click to expand the tool table
ToolPurpose
get_log_linesRead recent UE Output Log entries from the in-process ring buffer. Filter by category and minimum verbosity.
execute_console_commandRun a UE console command (e.g. stat fps, r.ScreenPercentage 50) and capture its output.
get_console_variableRead a single console variable's current value.
set_console_variableWrite a value to a console variable.
find_console_variablesEnumerate console variables matching a name pattern.

Long-running tasks (4 tools)

Long-running tasks โ€” click to expand the tool table
ToolPurpose
start_sleep_taskReference long-running task โ€” sleeps for N seconds. Used to exercise the task pattern from clients.
poll_taskRead a task's current state / result.
cancel_taskCancel an in-flight task by id.
list_tasksEnumerate all tracked tasks and their states.

Event push / subscriptions (5 tools)

Event push / subscriptions โ€” click to expand the tool table
ToolPurpose
poll_eventsDrain queued editor events (actor spawn/delete, asset add/remove/rename/import, level save, map change) from the in-process EventBus.
wait_for_eventsBridge-side synthetic tool โ€” block until matching events arrive or timeout_ms elapses, by polling poll_events at poll_interval_ms cadence.
register_subscriptionOpen a per-client subscription channel for a filtered event stream.
poll_subscriptionDrain queued events from a specific subscription.
unsubscribeClose a subscription.

Audio (3 tools โ€” introspection trio)

Audio โ€” click to expand the tool table
ToolPurpose
inspect_sound_cueUSoundCue duration, multipliers, attenuation cross-link, root sound-node class, full graph node list (sorted, with class taxonomy).
inspect_sound_waveUSoundWave sample rate, channels, frame count, duration, compression type + runtime format + compressed-data size, sound group, looping/streaming flags, loading behavior, subtitle + cue-point + loop-region counts. Editor-only LUFS / sample-peak / comment fields conditional.
inspect_sound_attenuationUSoundAttenuation 3D-playback rules: distance algorithm + shape, spatialization, air-absorption LPF/HPF, listener focus, occlusion tracing, reverb send, priority attenuation, plus assorted feature flags. Each major feature is gated by its master bitfield; sub-objects collapse to {enabled: false} when disabled.

Camera (3 tools โ€” bridge-side synthetic)

Camera โ€” click to expand the tool table
ToolPurpose
get_camera_transformRead the level-editor viewport camera's location + rotation. Composes execute_unreal_python + get_log_lines via the marker pattern.
set_camera_transformSet the level-editor viewport camera's location and/or rotation. Single execute_unreal_python round-trip.
screenshot_actorFrame the viewport on a specific actor and capture a focused PNG. Composes focus_actor + get_viewport_screenshot.

Editor state / undo (2 tools)

Editor state / undo โ€” click to expand the tool table
ToolPurpose
undo_transactionStep the editor undo stack backward โ€” the programmatic Ctrl+Z. Each mutating MCP edit (spawn/delete/transform/property/component) is one transaction, so this reverts the last such edit (or the last N via count).
redo_transactionStep the editor undo stack forward โ€” the programmatic Ctrl+Y. Re-applies transactions previously reverted by undo_transaction (or Ctrl+Z), up to count steps.

Self-introspection (1 tool)

Self-introspection โ€” click to expand the tool table
ToolPurpose
list_toolsNames of every registered method (for autodiscovery).

Adding the next C++ handler is one .cpp file plus one line of registration โ€” see docs/ARCHITECTURE.md. New synthetic tools are an entry in SYNTHETIC_TOOLS plus a function in bridge/unreal_ai_connection_bridge.py.


Quick start

Engineers (you already build UE projects from source)

  1. Drop the plugin in. Copy UnrealAIConnection/ into <YourProject>/Plugins/.
  2. Regenerate project files. Right-click <YourProject>.uproject โ†’ Generate Visual Studio project files.
  3. Build the editor. Open the .sln, build Development Editor | Win64. First build takes ~5โ€“15 min.
  4. Launch. Open the .uproject. The MCP server auto-starts on 127.0.0.1:18888. Look for these lines in the Output Log:
    [LogUnrealAIConnection] Module started
    LogUCMCPHandler: Registered handler 'execute_unreal_python'
      ... (85 more handler lines)
    [LogUCMCP] Listening on 127.0.0.1:18888
    
  5. Wire your MCP client. Copy examples/.mcp.json.example to your project root as .mcp.json, edit the path to point at bridge/unreal_ai_connection_bridge.py, restart your client, and approve the new MCP server. Same bridge works with Claude Code, Claude Desktop, Cursor, Codex CLI, Windsurf, Continue, Cline, Zed, Gemini CLI, and VS Code Copilot โ€” see docs/setup/ for per-client copy-paste recipes.

Non-engineers / GUI-only users

See docs/INSTALLATION.md โ€” step-by-step, screenshot-first.

Verify it works

The smoke test fires every default-on tool from a plain Python TCP client (not through Claude Code) โ€” a fast way to confirm the plugin loaded and the server is alive:

python examples/smoke_test.py

You'll see structured JSON output for every default-on step (eleven banner-headed sections, plus a few unbannered checks for the asset registry, sequencer and materials handlers โ€” the last two skip with a print if your project has no Level Sequences or Materials in /Game/). Last line: "Smoke test complete."


What's in the box

UnrealAIConnection/                The Unreal Engine plugin (drop into <Project>/Plugins/)
  Source/UnrealAIConnection/         C++ editor module
  Resources/                      MCP manifest JSON
  UnrealAIConnection.uplugin         Plugin manifest

bridge/
  unreal_ai_connection_bridge.py     Python stdio โ†” TCP bridge for any MCP client

examples/
  smoke_test.py                   Connects to the live server, fires the safe tools
  .mcp.json.example               Template Claude Code MCP config

docs/
  INSTALLATION.md                 Step-by-step install for a UE 5.7 project
  TOOLS.md                        What each tool does + JSON examples
  ARCHITECTURE.md                 How the pieces fit + UE 5.7 API gotchas

skills/
  driving-unreal/                 Bundled know-how skill โ€” which tools to chain for common UE workflows (auto-discovered by MCP clients)

tests/                            Pytest suite for the bridge (no UE required)
.github/workflows/                CI runs the bridge tests on every push & PR

Status

Latest releasev0.9.1 โ€” 2026-05-23 (plus v0.9.1-ue5.6 prebuilt 5.6 binaries โ€” 2026-05-25)
Tools151 live โ€” 114 native C++ handlers (one MCP method per Handler_*.cpp) plus 37 bridge-side synthetic tools (Python-only composition over existing handlers; never crosses the TCP wire as a dedicated round-trip). See docs/TOOLS.md for the per-tool reference.
Tested onUE 5.7.4 / Windows 11 / Visual Studio Build Tools 2022 / MSVC 14.44 / NETFXSDK 4.8.1
Build statusPlugin compiles + loads against UE 5.7.4 host on Windows 11; 114 handlers register, TCP server binds 127.0.0.1:18888, bridge round-trip via tools/call list_tools returns full registry.
Bridge tests645 pytest cases, ~99% coverage
CIGitHub Actions on every push and PR
Development workflowMulti-agent ensemble โ€” Opus orchestrates, Codex authors C++, Sonnet handles Python + recon, NVIDIA cloud + local OSS LLMs run pre-PR diff review, Copilot CLI gives a second opinion, Gemini auto-review fires on every PR open. No single model gates a merge.

Roadmap / status honesty

One in-flight item is stated plainly here so nothing is oversold:

  • Officially built & tested on UE 5.7. Other UE versions are community / best-effort: the cross-engine compatibility scaffold lets you build from source for your engine version (uncertified, not actively maintained, contributions welcome). See ADR-0001 / docs/PHASE-H-COMPAT.md.
  • Prebuilt 5.6 binaries available (Win64). Host-verified build (MSVC 14.38) + live smoke pass (all suites green) on a real 5.6 editor. Skip the source build: download the packaged plugin from the v0.9.1-ue5.6 release and drop it into YourProject/Plugins/. Load note: enable the engine's DMXEngine + DMXProtocol plugins (the DMX handlers link against them) or the module fails to load.

What this is NOT

  • A general MCP server framework โ€” this is bonded to UE's editor process.
  • A live-broadcast tool โ€” for that, look at vMix, OBS, NDI Studio Monitor.
  • An Aximmetry / Pixotope / Disguise replacement โ€” those have multi-engineer multi-year codebases.

Contributing

Issues and PRs welcome. Two house rules:

  1. Verify UE API claims against UE 5.7 source. Past reviewer subagents have made specific UE API claims that turned out wrong; ground-truth the engine source before committing.
  2. Each new MCP handler is one Handler_*.cpp file in Source/UnrealAIConnection/Private/MCP/Handlers/, plus one extern declaration and one Reg.Register(Make_Handler_*()) line in UnrealAIConnectionModule.cpp. Don't grow the foundation โ€” add handlers.

Running tests

Bridge unit tests run without UE in under a second:

pip install pytest pytest-cov
pytest tests/

CI runs the same suite on every push and PR (see .github/workflows/tests.yml). The live integration smoke test in examples/smoke_test.py requires a running UE editor โ€” see tests/README.md.


License

MIT โ€” see LICENSE. ยฉ 2026 HD Media (Kuwait).

Related MCP Servers

3aKHP/prts-mcp

๐Ÿ ๐Ÿ“‡ โ˜๏ธ ๐Ÿ  - MCP Server for Arknights, querying the PRTS Wiki API and serving auto-synced operator archives and voice lines from game data. Designed for fan-creation (ๅŒไบบๅ‰ตไฝœ) AI agents. Python (stdio/Docker) and TypeScript (Streamable HTTP) implementations.

๐ŸŽฎ Gaming0 views
alex-gon/thegamecrafter-mcp-server

๐Ÿ“‡ โ˜๏ธ - Design, manage, and price tabletop games on The Game Crafter. Browse catalogs, create projects, upload artwork, get pricing.

๐ŸŽฎ Gaming0 views
antics-gg/antics-mcp

๐Ÿ“‡ โ˜๏ธ - Deploy a single-file HTML game to a shareable multiplayer URL with rooms, state sync, and leaderboards. No backend or player accounts.

๐ŸŽฎ Gaming0 views
beckettlab/beckett-godot-mcp

๐Ÿ  ๐ŸŽ ๐ŸชŸ ๐Ÿง - Beckett โ€” MCP for Godot: a zero-sidecar GDScript editor addon that serves MCP over Streamable HTTP from inside the Godot 4 editor (no Node/Python sidecar). Reflection over any class, validate-before-write GDScript, scene/script/resource authoring, and a runtime play-test loop (play, screenshot, input, assert). MIT.

๐ŸŽฎ Gaming0 views

Engagement

Views
0
Installs
0
Upvotes
0

Views and upvotes are unique per visitor network (hashed IP). Installs count copy actions.

Status

Health: Not checked yet

We have not completed a health check for this listing yet.

No check timestamp yet.

Unclaimed listing (imported or pending owner verification). Claim it โ†’
โ˜… Spotlight Slot

Feature Your MCP Server

Get maximum visibility for your server across our directory, search results, and detail pages.

Spotlight Your Server

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge and attach your website.

Claim this listing

Promote this listing

Optional paid placement. Free listings stay free forever.

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.