Unreal Engine Mcp

io.github.ChiR24由 GitHub 账号 ChiR24 发布v0.6.1-beta-b更新于 Nov 8, 2026

EngineWire: drive the Unreal Editor (UE 5.0-5.8): levels, Blueprints, UI, materials, VFX and more.

已验证STDIO仅桌面开发者工具媒体与设计

概览

AI 生成的概览

把 MCP 客户端连接到正在运行的 Unreal 编辑器,让助手通过单一网关工具搭建关卡、蓝图、材质、特效与玩法。

可以做什么
  • 通过单一网关工具搜索、查看并执行 450 多项编辑器能力
  • 创建和编辑关卡、Actor、蓝图、UMG 控件、材质与贴图
  • 搭建环境、几何体、PCG 图表、Niagara 特效、动画与玩法系统
  • 制作序列、过场与音频,并管理资产和源码控制
  • 运行带模拟输入的 PIE、截图、读取日志、性能分析、执行 Python 并打包构建
适用场景
适用于使用 Unreal Engine 5.0-5.8 并希望助手直接改动编辑器的场景,例如生成和摆放 Actor、连线蓝图、布局 UI,或运行并验证游戏过程,而不是只给出需要手动执行的步骤。
运行要求
本地 Unreal Engine 5.0-5.8 项目,需安装 EngineWire 编辑器插件(来自 Fab 或发布包)并启用原生 MCP 服务器。方式 A 通过 127.0.0.1:3000 的 HTTP 连接,并在 X-MCP-Capability-Token 请求头中携带项目能力令牌。方式 B 运行 npm 包,需要 Node.js 20.19 或更高版本,并通过 UE_PROJECT_PATH 定位令牌;UNREAL_MCP_URL 与 LOG_LEVEL 可选。
安装前请注意
项目 Saved/MCP 目录中的能力令牌相当于编辑器控制密码,不要写入共享配置,删除该文件即可轮换。助手可以写入、修改和删除资产与 Actor,执行控制台命令、运行 Python 并打包构建;破坏性操作需要逐次授权,请核对这些调用。服务器仅限本机且不加密,未经隧道或 TLS 代理不要暴露到回环地址之外。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Unreal Engine Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[EngineWire: let any AI assistant work inside the Unreal Editor]

EngineWire

[License: MIT] [npm] [Get it on Fab] [MCP SDK] [Unreal Engine 5.0-5.8] [MCP Registry] [Documentation: wiki] [Project Board] [Discussions]

EngineWire connects 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, over 400 capabilities  ·  ⚙️ Native C++ editor plugin  ·  🌐 HTTP or stdio  ·  🔐 Local and token-protected by default  ·  🎮 Unreal Engine 5.0 – 5.8

🌐 enginewire.dev  ·  🛒 Fab  ·  🚀 Quick Start  ·  📖 Wiki  ·  📦 Releases  ·  💬 Discussions

📌 Which version is this? This README describes 0.6.0, the stable release: the plugin on Fab and on the Releases page, and npm unreal-engine-mcp-server (latest). The previous release, 0.5.30, exposes 23 separate tools instead of one; staying on a 0.5.30 plugin means pinning [email protected]. 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.

Over 450 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.

[Unreal Editor 5.8 showing a platformer level built with the MCP; the status bar reads MCP :3000 (1)]
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

[Architecture: an AI client reaches the EngineWire plugin inside the Unreal Editor over Streamable HTTP on port 3000, either directly (Route A) or through the Node.js stdio proxy (Route B); the plugin drives the editor APIs on the game thread]

The EngineWire plugin runs inside the editor and does all the work, on the editor's game thread, and serves MCP itself. Clients reach it in one of two ways, and both get 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 same /mcp
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
Editor restartsThe client reconnects by handThe session stays: calls answer NOT_CONNECTED until the editor is back
Best forClaude Code, Cursor, VS Code, and several clients sharing one editorClaude Desktop, clients that only launch local commands, and long sessions across editor restarts

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. Installing from Fab needs nothing else; building the plugin from source needs a project with C++ code (a Blueprint-only project can install from Fab or use prebuilt binaries).

1. Add the plugin

From Fab (no compiler needed). Get EngineWire on Fab. In the Epic Games Launcher, open Unreal Engine › Library › Fab Library, find EngineWire and click Install to Engine for your engine version. Open your project, enable EngineWire in Edit › Plugins and restart the editor. Fab's 0.6.0 build ships with the native server off: if the status bar reads MCP off, turn on Enable Native MCP Server in Edit › Project Settings › Plugins › EngineWire › Native MCP and restart once more. Fab updates follow Epic's review, so the Fab build can trail the newest release here.

From a release. Download EngineWire-plugin-<version>.zip from the newest release on the Releases page, and copy the EngineWire folder it contains into your project:

text
MyGame/Plugins/EngineWire/

Or use a clone of this repository: copy plugins/EngineWire/, 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 :3000 (0): the plugin serves MCP on port 3000. 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:

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

This writes build/EngineWire-v<version>-UE5.7-<Platform>.zip, where <version> is the package.json version (currently 0.6.1-beta-a). 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. Enable Native MCP Server is on by default (Edit › Project Settings › Plugins › EngineWire, port 3000); Fab's 0.6.0 build ships with it off. A project where it is off needs it on and an editor restart.

    [The Native MCP section of the plugin settings, with Enable Native MCP Server ticked]
  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:

    bash
    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:

    json
    {  "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.

    [Unreal Editor status bar showing MCP :3000 (1): the native MCP server on port 3000 with one client connected]

Route B · stdio (Node.js 20.19+)

The package is a small stdio proxy in front of the same /mcp. A client connected straight to /mcp loses its session whenever the editor closes or crashes, and has to reconnect by hand. Through the proxy, every call answers NOT_CONNECTED while the editor is down, 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.

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

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

Or let the package write it (0.6.1-beta-a and later, so @beta until 0.6.1 is the stable release): npx unreal-engine-mcp-server@beta init claude --project C:/Path/To/YourProject shows the entry for Claude Code's .mcp.json (also cursor, vscode, gemini and codex), keeping the file's other servers, and --write saves it. npx unreal-engine-mcp-server@beta doctor checks Node, the token (never shown), the editor's answer and that both sides run the same version.

UE_PROJECT_PATH (the project folder or its .uproject) is how the proxy finds the capability token (MCP_AUTOMATION_CAPABILITY_TOKEN overrides it). UNREAL_MCP_URL points it at another endpoint (default http://127.0.0.1:3000/mcp). Pair it with a 0.6 plugin; a 0.5.x plugin serves its 23 separate tools instead of the unreal gateway.

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

[The gateway flow: search with a query returns rows with a nextCall; describe with tool and action returns the contract; execute with params, and consent when needed, returns data and a receipt listing changes, handles and warnings]

A typical exchange:

json
{ "operation": "search", "query": "spawn actor" }
json
{ "operation": "describe", "tool": "control_actor", "action": "spawn" }
json
{  "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. Every destructive capability, plus some risky writes, only runs with the consentGrant from describe, passed back as a top-level consent field.
  • Names. A call names the tool + action pair or 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: 2025-11-25 (latest), 2025-06-18 or 2025-03-26. A client asking for an older version is answered with 2025-11-25. An unsupported MCP-Protocol-Version header on the native route gets HTTP 400. Both also serve MCP 2026-07-28 per request, with no initialize or session, and answer server/discover with it. 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: UE_PROJECT_PATH for Route B; Route A needs none. Everything is listed on the Configuration page.

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

SettingDefault
Enable Native MCP ServeronServe MCP over HTTP at /mcp (both routes use it)
Native MCP Port3000The MCP_NATIVE_PORT environment variable of the editor process overrides it
Listen Ports8090,8091The plugin's WebSocket listener; neither route uses it
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
MCP_AUTOMATION_CAPABILITY_TOKENread from the token fileToken to present, when the proxy can't read the project folder
UNREAL_MCP_URLhttp://127.0.0.1:3000/mcpThe editor's /mcp endpoint
LOG_LEVELinfodebug, info, warn or error; logs go to stderr

Security

  • Local by default. Both routes listen on 127.0.0.1 only. The native server never binds off-loopback: it has no TLS, so reach it from another machine through an SSH tunnel (ssh -L 3000:127.0.0.1:3000) or a TLS proxy. The WebSocket bridge binds a LAN address only with Allow Non Loopback, Require Capability Token and Enable Tls all on. The proxy sends the token to another machine only with UNREAL_MCP_ALLOW_REMOTE_TOKEN=1.
  • Capability token. Generated per project at <Project>/Saved/MCP/capability-token (a value typed into Capability Token overrides it) and compared in constant time. Delete the file and restart the editor to rotate it.
  • Consent for destructive work. Deletes and some other writes need a per-call consent grant, which the plugin checks itself.
  • Guard rails. Asset paths are limited to /Game, /Engine, /Script, /Temp and /Niagara, and a content path may also sit under a mount the connected editor reports; arguments the server treats as files (such as filePath, and outputPath even where it names an asset) never use the reported mounts; console commands that chain or quit the editor are blocked; the plugin's own settings are out of reach of automation.

Details: Security. Please report vulnerabilities privately through GitHub security advisories.

Engine plugins

The bridge declares its engine-plugin dependencies, so Unreal enables them together with it.

Required (always enabled with the bridge)
PluginUsed for
Python Editor Script PluginPython-backed editor automation, system_control Python execution
Editor Scripting UtilitiesAsset and actor subsystem operations
NiagaraVisual effects
Gameplay Abilitiesmanage_gas
Smart ObjectsAI smart objects
Movie Render Pipeline, Movie Pipeline Mask Render Pass, Takesmanage_sequence: Movie Render Queue and Take Recorder
MetaSoundmanage_audio: MetaSound authoring
Optional (used when present, skipped when not)
PluginUsed for
Level Sequence Editor, Electra Playermanage_sequence: Sequencer, media playback
Control Rig, RigVM, IK Rig, Animation Dataanimation_physics: Control Rig and IK
Chaos Vehicles, Chaos Clothanimation_physics: vehicles and cloth
Niagara Editormanage_effect: Niagara authoring
Behavior Tree Editor, Environment Query Editor, StateTree, Mass Gameplaymanage_ai
Geometry Scripting, Geometry Processing, Mesh Modeling Toolset, Procedural Mesh Componentmanage_geometry (Catmull-Clark, Loop and bilinear subdivision need Mesh Modeling Toolset)
PCGmanage_pcg, compiled in only when the project itself enables the PCG plugin
Game Featuressystem_control: game feature plugins (listed, activated, made with create_plugin) through the EngineWireGameFeatures module, loaded only when the project itself enables Game Features (EngineWire never turns it on)
Data Registrymanage_asset: data registries listed, read and made over data tables, by reflection when the project itself enables Data Registry (EngineWire never turns it on)
Synthesismanage_audio: source effect presets
Enhanced Input, Online Subsystem, Online Subsystem Utilsmanage_networking: input mappings, sessions
Interchange, Interchange OpenUSD, Data Validation, StructUtilsImport/export, validation, struct helpers
Fab, BridgeFab asset library access (optional EngineWireFab module)

The plugin targets every Unreal Engine minor from 5.0 to 5.8. If it fails to build on yours, please open an issue with the build log.

Docker

The image runs the stdio proxy. It has to reach the editor's /mcp on 127.0.0.1:3000, so use host networking (Linux), and pass the token because the container can't read your project folder:

bash
docker build -t unreal-mcp .docker run -i --rm --network host -e MCP_AUTOMATION_CAPABILITY_TOKEN=<token> unreal-mcp

Use -i without -t: a TTY corrupts the MCP stream on stdout.

Documentation

📖 WikiQuick Start, Installation, Connecting Clients, Using the Gateway, Configuration, Security, Troubleshooting, FAQ, Upgrading
📋 Action ReferenceEvery capability with its effect, scope and consent, generated from the capability records
🔌 Gateway client guideThe gateway contract, with the source file behind each claim
📡 ProtocolTransports, version negotiation, cancellation
🔐 Security and receiptsScopes, consent, path gating, idempotency, refusal codes
🧪 Testing guideTest suites and how to add cases
🧩 Extending the pluginAdding an editor action: record, handler, route and tests, plus the rules for plugin code
🗺️ RoadmapDevelopment roadmap
📝 ChangelogWhat changed in each release

Development

bash
npm installnpm run build              # clean + compile TypeScript to dist/npm run dev                # run from source with ts-nodenpm run lint               # ESLint (CI fails on any warning)npm run type-check         # tsc --noEmit, sources and testsnpm run test:unit          # Vitest unit tests (no Unreal required)npm run test:params        # strict parameter auditnpm run registry:generate  # capability records -> generated contracts, native shards, action referencenpm run registry:check     # fail if generated artifacts driftnpm run manifest:check     # fail if the gateway manifest driftsnpm run eval:check         # search-ranking corpusnpm run version:check      # all version sources agreenpm test                   # integration suite (needs a live Unreal Editor serving /mcp)

The capability records in src/tools/catalog/capabilities/records/ are the single source of truth; every *.generated.* file, the plugin's MCP/Generated/ shards and the action reference are generated from them. Never hand-edit generated files. How to add a capability: Development.

CI runs, in order: ESLint (npx eslint . --max-warnings=0), type-check, unit tests, registry:check, manifest:check, headers:check, the strict parameter audit (test:params) and eval:check, then a blocking runtime dependency audit (npm audit --omit=dev --audit-level=moderate) and an informational full-tree audit. A Node 20.19 / 26 matrix adds build. Plugin packaging runs only when an Unreal Engine root is configured, because CI runners don't ship an engine. Release archives exclude Binaries/, Intermediate/ and Saved/.

Community

💬 DiscussionsQuestions, ideas, show and tell
🐞 IssuesBug reports and feature requests
🗺️ Project boardRoadmap progress and priorities

Contributing: keep pull requests small and focused, with a Conventional Commits title; include reproduction steps for bugs; follow the existing code style. See CONTRIBUTING.md.

License

MIT. See LICENSE.

来源:README.md,提交 d8c4634

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

8
  1. v0.6.1-beta-aNov 7, 2026
  2. v0.6.0Oct 29, 2026
  3. v0.6.0-beta-fOct 16, 2026
  4. v0.6.0-beta-eOct 9, 2026
  5. v0.6.0-beta-cOct 2, 2026
  6. v0.6.0-beta-bSep 25, 2026
  7. v0.6.0-beta-aSep 18, 2026
  8. v0.5.30Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分