Back to Browse

Unreal Mcp Ue4 For OHD MCP Server

Developer ToolsUse Caution4.2MCP RegistryLocal
Free

Server data from the Official MCP Registry

UE4.25 MCP server for Unreal Editor via Python Remote Execution (OHD mod-kit retarget).

About

UE4.25 MCP server for Unreal Editor via Python Remote Execution (OHD mod-kit retarget).

Security Report

4.2
Use Caution4.2High Risk

This is a legitimate UE4.25-focused MCP server for the Operation Harsh Doorstop mod kit with proper TypeScript architecture, documented permissions, and no evidence of malicious intent. The codebase demonstrates reasonable security practices for its purpose—remote Python execution into an editor environment. Minor concerns include broad exception handling in Python payloads and limited input validation in some helper functions, but these are typical of game engine scripting contexts and do not constitute material security risks. Supply chain analysis found 4 known vulnerabilities in dependencies (0 critical, 4 high severity). Package verification found 1 issue.

3 files analyzed · 9 issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

HTTP Network Access

Connects to external APIs or services over the internet.

env_vars

Check that this permission is expected for this type of plugin.

File System Read

Reads files on your machine. Normal for tools that analyze or process local data.

File System Write

Writes or modifies files on your machine. Check that this is expected for the tool.

process_spawn

Check that this permission is expected for this type of plugin.

system_info

Check that this permission is expected for this type of plugin.

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-ribattrw-unreal-mcp-ue4-for-ohd": {
      "args": [
        "-y",
        "unreal-mcp-ue4-for-ohd"
      ],
      "command": "npx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

unreal-mcp-ue4-for-OHD

UE4.25.4-first MCP server for Operation Harsh Doorstop modding via Unreal Python Remote Execution (stdio transport)

Fork of runreal/unreal-mcp, heavily refactored UE4-first (via a UE4.27.2 stage) and retargeted here to UE4.25.4 for the OHDCore Mod Kit: same transport and tool surface, with version pins, docs links, and Python-dialect constraints adjusted for the kit's embedded Python 2.7.14. Port, tool, docs, and smoke-test work were developed with assistance from OpenAI Codex.

[!NOTE] Still under active development — expect bugs, rough edges, and UE4.25-specific limitations. Published package: unreal-mcp-ue4-for-ohd · Registry name: io.github.RibatTRW/unreal-mcp-ue4-for-ohd

[!CAUTION] Not an official Epic Games project. Any connected MCP client can inspect and modify your open editor session — use a disposable test project first, especially for asset or world-generation tools.

Contents

Requirements

NeedPin
Unreal Engine4.25.4 via OHDCore Mod Kit: engine tree HDEngine/, project HDGame/HarshDoorstop/HarshDoorstop.uproject, launched with LaunchEditor.bat
RuntimeNode.js 20+, npm
ClientAny MCP client (Codex, Claude Code, Claude Desktop, Cursor, Copilot in a supported IDE)
Editor payloadsPython 2.7 only (kit embeds 2.7.14): no f-strings, single-argument print(), no pathlib-era idioms

Reference: Unreal Engine Python API 4.25. No custom C++ plugin is required — the server uses the editor's built-in Python Remote Execution. UE5-only scripting features are not reintroduced; unreliable graph/binding flows are excluded from the MCP surface or return a clear message instead of failing silently.

graph TD
    A[MCP client] --> B[unreal-mcp-ue4-for-ohd stdio server]
    B --> C[manage_* namespaces + direct tools]
    C --> D[Python 2.7 payloads]
    D --> E[Unreal Editor via Remote Execution]

Setup

Autonomous agents setting up unattended: follow the ordered guide in docs/agent-setup.md.

npm install -g unreal-mcp-ue4-for-ohd   # recommended; then reference the `unreal-mcp-ue4-for-ohd` binary
npx unreal-mcp-ue4-for-ohd              # one-off invocation

Local source checkout:

git clone https://github.com/RibatTRW/unreal-mcp-ue4-for-OHD.git
cd unreal-mcp-ue4-for-OHD
npm install
npm run build   # produces `dist/bin.js`, `dist/index.js`, `dist/editor/tools.js`

One install, then one line per client (global vs local-checkout variants). All clients call the same 34 tools over stdio (3 session-info + 3 direct actor CRUD primitives + 28 manage_* namespaces):

ClientGlobal installLocal checkout
Claudeclaude mcp add --scope user unreal-mcp-ue4-for-ohd -- unreal-mcp-ue4-for-ohdclaude mcp add --scope user unreal-mcp-ue4-for-ohd -- node /absolute/path/to/unreal-mcp-ue4-for-OHD/dist/bin.js
Codexcodex mcp add unreal-ue4 -- unreal-mcp-ue4-for-ohdcodex mcp add unreal-ue4 -- node /absolute/path/to/unreal-mcp-ue4-for-OHD/dist/bin.js
Copilot.vscode/mcp.json{ "servers": { "unreal-ue4": { "command": "unreal-mcp-ue4-for-ohd", "args": [] } } }, then start the server from the MCP config UI and confirm unreal-ue4 is in the tools pickersame file with "command": "node", "args": ["/absolute/path/to/unreal-mcp-ue4-for-OHD/dist/bin.js"]

Copilot docs: Extending GitHub Copilot Chat with MCP servers · About Model Context Protocol in GitHub Copilot

Migrating from unreal-mcp-ue4

This fork was renamed to its own identity so it can ship independently of upstream. Upstream credit: the UE4 line derives from conaman/unreal-mcp-ue4 (itself forked from runreal/unreal-mcp).

[!WARNING] npm install -g unreal-mcp-ue4 installs upstream's UE4.27 build, not this fork. For the OHD/UE4.25.4 retarget, install the renamed package instead.

Before (upstream name)After (this fork)
npm install -g unreal-mcp-ue4npm install -g unreal-mcp-ue4-for-ohd
npx unreal-mcp-ue4npx unreal-mcp-ue4-for-ohd
unreal-mcp-ue4 --versionunreal-mcp-ue4-for-ohd --version
Registry io.github.conaman/unreal-mcp-ue4Registry io.github.RibatTRW/unreal-mcp-ue4-for-ohd

Re-add the server in your client (local server labels such as unreal-ue4 are unchanged — only the command changes):

claude mcp add --scope user unreal-mcp-ue4-for-ohd -- unreal-mcp-ue4-for-ohd
codex mcp add unreal-ue4 -- unreal-mcp-ue4-for-ohd

Copilot .vscode/mcp.json: change "command" to "unreal-mcp-ue4-for-ohd", keeping the unreal-ue4 server key.

Editor remote execution

Verified live against the kit. In the OHD editor (LaunchEditor.batHarshDoorstop.uproject):

  1. Edit -> Plugins: enable Python Editor Script Plugin (ships disabled). Editor Scripting Utilities is already enabled — no action needed. Enable SequencerScripting (ships disabled) only for advanced manage_sequence actions: actor binding, track/key edits, camera cuts, playback ranges, speed-track analysis.
  2. Restart if prompted → Edit -> Project Settings -> Plugins -> Python → enable Enable Remote Execution (endpoint 239.0.0.1:6766, bind 0.0.0.0, raise Multicast TTL from kit default 0 to 1). Restart again if needed.
  3. Keep the project open while using the server or tests; restart the editor after any plugin/Python setting change.
  4. No UMG plugin to install (tooling uses shipped editor modules). Do mod experiments in a throwaway content-only mod (Create Mod in the editor); never edit shipped Plugins/*, HDAssets, or engine content.

Connection env overrides (UNREAL_MCP_*):

VarDefault
UNREAL_MCP_BIND_ADDRESS / UNREAL_MCP_COMMAND_ADDRESSfirst non-internal IPv4
UNREAL_MCP_COMMAND_PORT6776
UNREAL_MCP_MULTICAST_ADDRESS / UNREAL_MCP_MULTICAST_PORT / UNREAL_MCP_MULTICAST_TTL239.0.0.1 / 6766 / 1
UNREAL_MCP_RETRY_COUNT / UNREAL_MCP_RETRY_DELAY_MSbuilt-in retry policy

Usage

  • Prefer manage_* namespace tools (action-specific input schemas are exposed over MCP). Namespaces dispatch through action + params. Canonical reads: manage_editor.project_info (project), manage_editor.map_info + manage_level.world_outliner (map/level). Discover the surface with manage_tools (list_namespaces).
  • Direct tools (get_unreal_*, editor_create/update/delete_object) are low-level primitives for session path discovery and actor CRUD.
  • manage_editor.run_python is the escape hatch for debugging, prototyping, and UE4.25 API gaps — still Python 2.7-compatible.

First run: open the kit project and wait for load → confirm plugins + remote execution → npm install -g unreal-mcp-ue4-for-ohd (or npm run build) → open/start the client session → run something read-only:

  • unreal-mcp-ue4-for-ohd --version (prints version, no stdio transport)
  • manage_editor + action: "project_info" / "map_info" · manage_level + "world_outliner" · manage_tools + "list_namespaces"
  • In prose: Get project info from the unreal-ue4 server. · List the actors in the current level. · Spawn a StaticMeshActor named TestCube at 0,0,100.

What the server can do: read project/map/asset/actor info; spawn, inspect, move, delete level actors; search assets and inspect references/metadata; create DataAsset/StringTable and other common UE4 data assets; create/edit Blueprint assets and Widget Blueprint trees where UE4.25 Python exposes the APIs.

Sidebar tab

One call sets up the EUW (Editor Utility Widget) sidebar tab end to end — an EUW asset plus a WebBrowser child hosting a web page beside the viewport:

manage_widget + action: "setup_sidebar_tab", params widget_blueprint_path (e.g. /Game/DSHSidebar), url (any page URL; the DSH web GUI is the convention), use_template: true (missing target is duplicated from the golden template — full-fill DSHBrowser + verified On Key Down shortcut fix — instead of built from scratch; re-runs are idempotent, reusing existing targets while refreshing URL/layout).

Caveats: non-DSH pages get no editor-driving loop (typing in them does nothing to the viewport); the 4.25 CEF gate applies (a minimal page renders where a full app shows blank); first template use reports template_staged (the 4.25 Asset Registry can't see the staged /Game file until restart — restart, then re-run); a custom browser_widget_name is ignored on the template path with a warning and DSH asset/browser names stay; if the opened tab looks stale, Compile the widget blueprint in the designer, then dock it beside the viewport.

Internals

TypeScript 7 native toolchain (tsc -p tsconfig.json, ES2022, Node 20 proven), stdio transport, Effect-migrated dispatch/connection layers (Zod stays at the MCP SDK call-site — the SDK only accepts Zod). Recent performance work:

ItemShape
Prelude cachestatic Python prelude cached in the editor session behind the render seam; cacheable renders are ~1–5% of full bytes, miss resends once (scripts/check-prelude-cache.mjs)
Schema compactionseven heaviest tool schemas compacted to cut the listTools payload; surface pinned by scripts/__snapshots__/list-tools.snapshot.json (scripts/check-tool-surface.mjs)
Validation fragmentsshared limit/asset-path validators used across namespaces
Batch designharness-level chaining memo in docs/w1-batch-design-memo.md, offline prototype green (scripts/check-batch-prototype.mjs); live gate not run
Connect health-hintshort-lived healthy-connection hint skips redundant reconnects

Testing

CommandNeeds editor?Covers
npm run check:py27NoPython 2.7 dialect gate — run after touching server/editor/scripts
npm run test:no-unrealNooffline: MCP startup, tool discovery, namespace action schemas, param validation, payload codec, batch prototype, prelude cache, tool surface, dispatch envelope, schema parity, connection session
npm run test:e2eYesbuilds, spawns its own MCP server process, connects to the open editor: startup, discovery, project/map/outliner reads, source-control reads, direct-tool actor create/update/delete, namespace actor spawn/search/transform/inspect/delete, namespace dispatch
npm run test:e2e -- --with-assetsYesabove + Blueprint create/component-edit/mesh-assign/compile, DataAsset create + metadata, StringTable, texture import + metadata, Widget create + TextBlock/Button + CanvasPanel/child-widget flows; temp assets under /Game/MCP/Tests, removed unless --keep-assets
node scripts/probe-once.mjs --file <py> [--code <snip>] [--timeout-ms 20000] [--verbose]Yesone-shot raw Python 2.7 probe through the built server, bypassing the editor console

Runner options: --keep-assets (inspect results in the Content Browser), --skip-namespace (skip namespace-dispatch portion), --verbose (MCP server stderr), --help (options without rebuilding). Windows PowerShell:

cd C:\dev\unreal-mcp-ue4-for-OHD
npm install
npm run test:no-unreal
npm run test:e2e
npm run test:e2e -- --with-assets

Success = [PASS] on every step; actor tests visibly create then remove temp actors (both surfaces); asset tests create then remove temp Blueprint/DataAsset/StringTable/Texture/Widget assets. Workflow: test:no-unrealtest:e2etest:e2e -- --with-assets → try the real client → use a test project before production content.

Publishing

Version format YYYY.M.D-N, unified everywhere (current 2026.9.9-1) — bump it, then:

npm run publish:check                                  # typecheck + rebuild + tarball dry-run
npm run test:e2e -- --with-assets --skip-build         # when an OHD (UE4.25) editor is available
npm publish --tag latest                               # explicit dist-tag required (semver prerelease suffix)

prepack runs npm run build, so the tarball always uses a fresh dist.

Available Tools

Notes call out important requirements or UE4.25 limitations when they matter. Empty notes mean there are no additional caveats beyond normal editor setup.

The recommended public surface is the manage_* namespace layer. Prefer manage_editor.project_info, manage_editor.map_info, and manage_level.world_outliner as canonical read entry points, and treat the small direct-tool set as low-level primitives for path discovery and actor CRUD.

Editor Session Info

Core Direct Tools

Core Tool Namespaces

World & Environment Tool Namespaces

Content & Authoring Tool Namespaces

Gameplay & Systems Tool Namespaces

Excluded Capability Areas

These capability areas are intentionally not exposed through the MCP surface in this UE4.25 port because they fail reliably in the current Python environment and only add prompt or context overhead until a native bridge exists.

Capability AreaEffect on MCP SurfaceWhy It Is Excluded
Blueprint event-graph event insertionRelated event-node and input-action helpers are excluded from the MCP surface.The current UE4.25 Python environment does not expose reliable event graph access or K2 event reference setup.
Blueprint graph inspection and node searchGraph-analysis, graph-inspection, and node-search helpers are excluded from the MCP surface.The current UE4.25 Python environment does not expose Blueprint graph arrays such as UbergraphPages or FunctionGraphs reliably enough for deterministic inspection.
Low-level Blueprint graph node creationGeneric graph-node helpers and related self or component reference insertion helpers are excluded from the MCP surface.The current UE4.25 Python environment does not expose stable low-level graph node creation or member-reference wiring.
Blueprint function-call node authoringFunction-node helpers that depend on editor graph member-reference setup are excluded from the MCP surface.The current UE4.25 Python environment does not expose reliable function-call node reference setup.
Blueprint variable and function metadata inspectionVariable-detail and function-detail helpers are excluded from the MCP surface.The current UE4.25 Python environment does not expose NewVariables or FunctionGraphs reliably enough for deterministic inspection.
Blueprint variable authoringVariable-creation helpers are excluded from the MCP surface.BPVariableDescription and EdGraphPinType are not exposed in the current UE4.25 Python environment.
UMG delegate-binding authoringWidget event-binding and text-binding helpers are excluded from the MCP surface.DelegateEditorBinding is not exposed in the current UE4.25 Python environment.

Contributing

main is protected by the protect-main ruleset (PRs only — no direct pushes, force-pushes, or deletions; review threads must resolve). Branch off main, open a PR back, and before pushing run npm run typecheck + npm run check:py27 (plus npm run test:no-unreal when possible). Keep payloads Python 2.7-compatible; the tables above regenerate during build, so run npm run build before committing doc changes.

Troubleshooting

  • Remote node is not available: open the editor fully first; verify Python Editor Script Plugin, Editor Scripting Utilities, and Enable Remote Execution are enabled; restart after changing any of them.
  • Connection/discovery on Windows: allow UnrealEditor.exe and node.exe through Windows Defender Firewall. Discovery is UDP multicast on 239.0.0.1:6766, command channel on 6776. Override the bind address with UNREAL_MCP_BIND_ADDRESS or UNREAL_MCP_COMMAND_ADDRESS when the editor can't discover/connect. In JSON configs, escape backslashes or use forward slashes.
  • Client can't find unreal-mcp-ue4-for-ohd or node: put the npm global binary dir on the client's PATH (or use the absolute unreal-mcp-ue4-for-ohd path); for source checkouts use the absolute node/node.exe path instead of relying on PATH.
  • Blueprint graph / UMG binding commands unavailable: expected — Widget creation + tree editing work, but delegate bindings and runtime viewport flows don't; Blueprint asset/component/compile + summaries work, but graph inspection, pin wiring, and variable/function metadata are excluded (stock UE4.25 Python doesn't expose them). Full list under Excluded Capability Areas above.

Notes and Limitations

  • World/structure tools use UE4.25-friendly preset builders on engine basic-shape assets.
  • UMG editing works with native PanelWidget parents; absolute positioning targets CanvasPanel slots — run manage_widget.ensure_canvas_root first when the root isn't a Canvas. Reparenting the root widget and named-slot edits aren't handled; delegate bindings remain unavailable.
  • Blueprint asset/component editing works; graph inspection, pin wiring, and variable/function metadata inspection are excluded.
  • The surface mixes granular tools and action-based namespaces so clients can work at different abstraction levels.

Roadmap

  • Improve Code Architecture (Effect-migration phases 0-7 landed)
  • Add Dsh Harness Support (manage_widget.setup_sidebar_tab + golden template)
  • Add a agent.md so agents can install it easily (landed as docs/agent-setup.md)
  • Add GitHub Actions CI (.github/workflows/ci.yml green on main + Tests badge live; protect-main ruleset PR-only with required status checks)
  • Cut a first fork release (tags exist, e.g. 2026.5.12-12; published to npm as unreal-mcp-ue4-for-ohd)
  • Decide registry identity: renamed to the fork's own io.github.RibatTRW/unreal-mcp-ue4-for-ohd (see Migrating from unreal-mcp-ue4 above)

License

Licensed under the MIT License.

Reviews

No reviews yet

Be the first to review this server!