Unreal Engine MCP Skill
Companion skill for the unreal-engine entry in the Hermes MCP catalog. The
MCP server (Epic's official, experimental "Unreal MCP" plugin, internal id
ModelContextProtocol) runs INSIDE the Unreal Editor process and exposes
editor functionality as typed tools. This skill teaches how to drive it well:
discovering the live tool surface, sequencing calls safely, translating
plain-English asks into scenes that actually look good, and verifying work
visually. The user should never need to touch the editor beyond launching it.
When to Use
Use when the user wants anything done in Unreal Engine: build or dress a
level, spawn/move/delete actors, set up lighting and atmosphere, create or
tune material instances, frame a camera shot, capture screenshots or renders,
import assets, inspect the scene or UI, run automation tests, or script the
editor. Works for single actions ("make the sun golden hour") and for
complete multi-step projects ("build me a moody forest clearing with a
campfire and render a shot of it").
Don't use for: DCC-style mesh modeling/sculpting (use blender-mcp and
import the result), or for editing Unreal C++ project source (that's normal
code work — use the terminal; this skill is about the live editor).
Prerequisites
Two halves, in this order: the editor side must be up before Hermes connects.
One-time, editor side
- Unreal Editor 5.8+ with a project open. (macOS: full Xcode must be
installed and its license accepted — the editor exits on first launch
without it; see pitfalls.)
- Edit > Plugins — enable Unreal MCP (its Toolset Registry
dependency auto-enables). Restart the editor when prompted.
- The typed toolsets ship separately from the server: also enable the
AllToolsets plugin in the same Plugins browser. Unreal MCP ships NO
tools itself — AllToolsets provides the shipped toolsets (SceneTools,
ActorTools, MaterialInstanceTools, ObjectTools, …); skip it and the
server connects but the agent has nothing to call.
- Edit > Editor Preferences > General > Model Context Protocol — enable
Auto Start Server. Default bind is
http://127.0.0.1:8000/mcp
(port/path configurable in the same panel; server name is unreal-mcp).
To start manually instead, run ModelContextProtocol.StartServer in the
editor console (backtick key).
One-time, Hermes side
hermes mcp install unreal-engine
This writes the mcp_servers.unreal-engine HTTP entry pointing at
http://127.0.0.1:8000/mcp and probes the live server for its tools. Run it
while the editor + server are up so the probe sees the real surface. If the
user changed port/path in Editor Preferences, edit the url in
~/.hermes/config.yaml under mcp_servers.unreal-engine to match.
Do NOT use ModelContextProtocol.GenerateClientConfig for Hermes — that
writes .mcp.json-style files for Claude Code/Cursor/etc. Hermes connects
from config.yaml via the catalog entry.
Every session
- Launch Unreal Editor, wait for the project to finish loading; confirm the
server started (Output Log shows the bind address, or run
ModelContextProtocol.StartServer manually).
- Start the Hermes session. Tools register as
mcp_unreal_engine_*. If
they're missing: editor wasn't up first — start it, then open a new
Hermes session.
- Sanity check: call
mcp_unreal_engine_list_toolsets and confirm toolsets
come back.
The Tool Surface: Discovery, Not a Fixed List
By default the plugin runs in tool-search mode: tools/list returns only
three meta-tools, and every real tool is reached through them. Through Hermes
they appear as:
| Hermes tool |
Purpose |
mcp_unreal_engine_list_toolsets |
Names + descriptions of every registered toolset |
mcp_unreal_engine_describe_toolset |
Full JSON schemas for one named toolset's tools |
mcp_unreal_engine_call_tool |
Invoke a named tool with arguments, get the result |
The discovery walk, always in this order:
list_toolsets → see what capability groups this project actually has
(the surface is project-dependent: enabled plugins, Game Feature Plugins,
and any custom toolsets all contribute). Names come back FULLY QUALIFIED
(editor_toolset.toolsets.scene.SceneTools,
EditorToolset.EditorAppToolset) — use them verbatim as toolset_name.
describe_toolset on the group you need → read the real parameter
schemas. Never guess parameter names — schemas are the contract.
call_tool with the qualified toolset name, the SHORT tool name
(find_actors, not the dotted form), and arguments matching the schema.
Cache what you learn for the session; re-list only after the editor side
changes (new plugin enabled, toolset authored, RefreshTools run).
The alternative eager mode (Enable Tool Search off in Editor Preferences)
advertises every tool as its own mcp_unreal_engine_<tool> entry. Discovery
then happens at hermes mcp install/configure time instead. Tool-search
mode is the default and what this skill assumes; it also keeps schema tokens
out of every API call, so prefer it.
See references/tool-surface.md for the shipped toolset catalog, authoring
custom toolsets, and the full plugin configuration/console-command reference.
Operating Loop
Every Unreal task follows the same loop:
- Inspect first. List toolsets, then query the scene/level state before
touching anything. Never assume an empty or default level. In an
unfamiliar project, also check for project-registered Agent Skills
(
call_tool → AgentSkillToolset.ListSkills): a matching project skill's
instructions override this skill's generic defaults.
- Act in small, single-purpose calls. One logical step per
call_tool.
The server executes tools serially on the game thread — a big
monolithic operation freezes the editor UI until it finishes and risks
client timeouts. Exception: for loops over 5+ homogeneous operations,
ONE ProgrammaticToolset.execute_tool_script call batches them
server-side without breaking the serial rule
(references/advanced-workflows.md).
- NEVER issue overlapping calls. Do not batch multiple
mcp_unreal_engine_* calls in one turn — Hermes runs batched calls
concurrently, and parallel calls against the game thread deadlock or
fail. Strictly one call, await result, next call. This overrides the
general parallel-tool-calls guidance.
- Read every result. Many tools (Blueprint compiles, material edits,
widget creation) report success/failure in the response body with no
protocol-level exception. Anything that isn't an explicit success is a
stop-and-diagnose, not a shrug. After property writes, read the value
back — several write paths silently no-op (see pitfalls).
- Verify visually and structurally. After each milestone, confirm state
by querying the actors/properties you changed, and capture a viewport
screenshot when composition matters (see
references/tool-surface.md for
the capture options; vision_analyze the image — you are the art
director, judge it).
- Save often. Editor edits are in-memory until packages/levels are
saved; an editor crash loses everything since the last save, and MCP
edits are not reliably undoable. Save before AND after any bulk change,
and after every milestone.
- Report concretely. Actor labels, asset paths (
/Game/...), file
locations of captures/renders.
Rules of the world while you work:
- Units are centimeters; axes are Z-up, X-forward; rotations are
degrees (Rotator: Roll around X, Pitch around Y, Yaw around Z). Human eye
height ≈ 165 cm; a door ≈ 210×90 cm. Full tables in
references/scene-craft.md.
- Content paths use long package names:
/Game/Folder/Asset.Asset for
project content, /Engine/BasicShapes/Cube.Cube for engine primitives.
- Actor labels (what you see in the Outliner, settable, non-unique) are
not actor names (internal, unique). Prefer resolving actors by
label/class queries, then hold on to whatever handle the tool returns.
- Prefer physically-plausible lighting values (lux/candela/Kelvin) over
arbitrary brightness numbers — but FIRST read the existing sun's
intensity to learn the scene's calibration convention; template worlds
are often calibrated around
intensity: 10, and physical values blow
them out (references/scene-craft.md has the numbers,
references/pitfalls.md #12b has the calibration rule).
From Plain English to a Scene
The user gives intent, not specs. Translate before you build:
- Extract the brief. Subject, mood, time of day, interior/exterior,
style, deliverable (screenshot? render? playable level?). Ask at most one
round of clarifying questions, then commit — you are the technical
director; don't bounce Unreal jargon back at the user.
- Plan the build order. The order that works: level/environment shell →
blocking (major geometry/meshes in place) → lighting + atmosphere →
materials → set dressing/detail → camera → capture/render. Post the plan
as a todo list for multi-step builds.
- Build with the loop above, one milestone at a time, screenshot at
each milestone.
- Art-direct yourself. Compare each screenshot against the brief:
readable silhouette? believable light direction/intensity? horizon not
dead-center? scale correct against a human-height reference? Fix before
moving on.
- Deliver. Screenshots/renders as files (
MEDIA: path), plus a short
summary of what exists in the level and where it was saved.
references/recipes.md has complete worked builds (exterior daylight scene,
moody interior, golden-hour cinematic + render, asset import & placement)
with the exact call sequences and values.
Reference Files
Load on demand; keep SKILL.md-level rules in mind throughout.
| Reference |
Contents |
references/tool-surface.md |
Shipped toolsets catalog, discovery protocol detail, plugin console commands/CVars/flags, screenshot & capture paths, MCP Inspector debugging, extending with custom Python/C++ toolsets |
references/advanced-workflows.md |
Sophisticated workflows, live-verified: ProgrammaticToolset batching, Blueprint DSL authoring loop (create→DSL→compile→spawn), PIE test sessions, Sequencer orientation (140 tools), LogsToolset self-debugging, automation testing, semantic asset search, config settings, per-situation decision table |
references/scene-craft.md |
Numeric cheat sheet: physical light intensities, color temperatures, exposure/EV100, fog densities, mood recipes (noon/golden hour/overcast/night/interior), scale tables, content path conventions |
references/recipes.md |
End-to-end worked builds with exact call sequences |
references/pitfalls.md |
Setup, runtime, and workflow pitfalls with fixes — read before your first session and whenever something misbehaves |
Pitfalls (top of mind — full list in references/pitfalls.md)
- Start order matters. Editor + server up first, then the Hermes
session. Missing
mcp_unreal_engine_* tools = wrong order.
- One call at a time. Serial game thread; no batching, no overlap.
- The editor UI freezes during each call. That's by design (game-thread
execution). Warn the user during long operations; keep calls small.
- Modal dialogs block everything. A tool call that opens (or collides
with) a modal editor dialog stalls until a human dismisses it. If a call
hangs indefinitely, tell the user to check the editor for a dialog.
- Timeouts on long operations. Hermes' per-call default is 120 s; asset
imports, big level saves, and renders can exceed it. Raise
mcp_servers.unreal-engine.timeout in ~/.hermes/config.yaml for
render/import-heavy sessions.
- Stale tool schemas. After authoring/hot-reloading toolsets or enabling
a plugin, run
ModelContextProtocol.RefreshTools in the editor console
and re-list_toolsets. New C++ UFUNCTIONs need a full editor restart —
Live Coding won't surface them.
- Experimental plugin. APIs and tool shapes can change between engine
versions; trust
describe_toolset over memory, including this skill's
examples. When docs and the live schema disagree, the live schema wins.
- Don't expose the server beyond localhost. Loopback-only, no auth, by
design. Never suggest binding it wider.
- Licensing note. The server logs on start: data transmitted via the
plugin to a connected LLM service is Licensed Technology under the UE
EULA (§6(e)) — the user is responsible for ensuring their LLM provider
doesn't train on it. Surface this if the user asks about data handling.
Verification Checklist
Source: NousResearch/hermes-agent → optional-skills/creative/unreal-mcp/SKILL.md
1---
2name: unreal-mcp
3description: "Automate Unreal Engine editor scenes, actors, and renders."
4category: mcp-and-integrations
5source_repo: NousResearch/hermes-agent
6source_path: "optional-skills/creative/unreal-mcp/SKILL.md"
7source_url: https://github.com/NousResearch/hermes-agent/blob/HEAD/optional-skills/creative/unreal-mcp/SKILL.md
8---
9
10
11# Unreal Engine MCP Skill
12
13Companion skill for the `unreal-engine` entry in the Hermes MCP catalog. The
14MCP server (Epic's official, experimental "Unreal MCP" plugin, internal id
15`ModelContextProtocol`) runs INSIDE the Unreal Editor process and exposes
16editor functionality as typed tools. This skill teaches how to drive it well:
17discovering the live tool surface, sequencing calls safely, translating
18plain-English asks into scenes that actually look good, and verifying work
19visually. The user should never need to touch the editor beyond launching it.
20
21## When to Use
22
23Use when the user wants anything done in Unreal Engine: build or dress a
24level, spawn/move/delete actors, set up lighting and atmosphere, create or
25tune material instances, frame a camera shot, capture screenshots or renders,
26import assets, inspect the scene or UI, run automation tests, or script the
27editor. Works for single actions ("make the sun golden hour") and for
28complete multi-step projects ("build me a moody forest clearing with a
29campfire and render a shot of it").
30
31Don't use for: DCC-style mesh modeling/sculpting (use `blender-mcp` and
32import the result), or for editing Unreal C++ project source (that's normal
33code work — use the terminal; this skill is about the live editor).
34
35## Prerequisites
36
37Two halves, in this order: the editor side must be up before Hermes connects.
38
39### One-time, editor side
40
411. Unreal Editor **5.8+** with a project open. (macOS: full Xcode must be
42 installed and its license accepted — the editor exits on first launch
43 without it; see pitfalls.)
442. **Edit > Plugins** — enable **Unreal MCP** (its Toolset Registry
45 dependency auto-enables). Restart the editor when prompted.
463. The typed toolsets ship separately from the server: also enable the
47 **AllToolsets** plugin in the same Plugins browser. Unreal MCP ships NO
48 tools itself — AllToolsets provides the shipped toolsets (SceneTools,
49 ActorTools, MaterialInstanceTools, ObjectTools, …); skip it and the
50 server connects but the agent has nothing to call.
514. **Edit > Editor Preferences > General > Model Context Protocol** — enable
52 **Auto Start Server**. Default bind is `http://127.0.0.1:8000/mcp`
53 (port/path configurable in the same panel; server name is `unreal-mcp`).
54 To start manually instead, run `ModelContextProtocol.StartServer` in the
55 editor console (backtick key).
56
57### One-time, Hermes side
58
59 hermes mcp install unreal-engine
60
61This writes the `mcp_servers.unreal-engine` HTTP entry pointing at
62`http://127.0.0.1:8000/mcp` and probes the live server for its tools. Run it
63while the editor + server are up so the probe sees the real surface. If the
64user changed port/path in Editor Preferences, edit the `url` in
65`~/.hermes/config.yaml` under `mcp_servers.unreal-engine` to match.
66
67Do NOT use `ModelContextProtocol.GenerateClientConfig` for Hermes — that
68writes `.mcp.json`-style files for Claude Code/Cursor/etc. Hermes connects
69from `config.yaml` via the catalog entry.
70
71### Every session
72
731. Launch Unreal Editor, wait for the project to finish loading; confirm the
74 server started (Output Log shows the bind address, or run
75 `ModelContextProtocol.StartServer` manually).
762. Start the Hermes session. Tools register as `mcp_unreal_engine_*`. If
77 they're missing: editor wasn't up first — start it, then open a new
78 Hermes session.
793. Sanity check: call `mcp_unreal_engine_list_toolsets` and confirm toolsets
80 come back.
81
82## The Tool Surface: Discovery, Not a Fixed List
83
84By default the plugin runs in **tool-search mode**: `tools/list` returns only
85three meta-tools, and every real tool is reached through them. Through Hermes
86they appear as:
87
88| Hermes tool | Purpose |
89|---|---|
90| `mcp_unreal_engine_list_toolsets` | Names + descriptions of every registered toolset |
91| `mcp_unreal_engine_describe_toolset` | Full JSON schemas for one named toolset's tools |
92| `mcp_unreal_engine_call_tool` | Invoke a named tool with arguments, get the result |
93
94The discovery walk, always in this order:
95
961. `list_toolsets` → see what capability groups this project actually has
97 (the surface is project-dependent: enabled plugins, Game Feature Plugins,
98 and any custom toolsets all contribute). Names come back FULLY QUALIFIED
99 (`editor_toolset.toolsets.scene.SceneTools`,
100 `EditorToolset.EditorAppToolset`) — use them verbatim as `toolset_name`.
1012. `describe_toolset` on the group you need → read the real parameter
102 schemas. Never guess parameter names — schemas are the contract.
1033. `call_tool` with the qualified toolset name, the SHORT tool name
104 (`find_actors`, not the dotted form), and arguments matching the schema.
105
106Cache what you learn for the session; re-list only after the editor side
107changes (new plugin enabled, toolset authored, `RefreshTools` run).
108
109The alternative eager mode (`Enable Tool Search` off in Editor Preferences)
110advertises every tool as its own `mcp_unreal_engine_<tool>` entry. Discovery
111then happens at `hermes mcp install`/`configure` time instead. Tool-search
112mode is the default and what this skill assumes; it also keeps schema tokens
113out of every API call, so prefer it.
114
115See `references/tool-surface.md` for the shipped toolset catalog, authoring
116custom toolsets, and the full plugin configuration/console-command reference.
117
118## Operating Loop
119
120Every Unreal task follows the same loop:
121
1221. **Inspect first.** List toolsets, then query the scene/level state before
123 touching anything. Never assume an empty or default level. In an
124 unfamiliar project, also check for project-registered Agent Skills
125 (`call_tool` → `AgentSkillToolset.ListSkills`): a matching project skill's
126 instructions override this skill's generic defaults.
1272. **Act in small, single-purpose calls.** One logical step per `call_tool`.
128 The server executes tools **serially on the game thread** — a big
129 monolithic operation freezes the editor UI until it finishes and risks
130 client timeouts. Exception: for loops over 5+ homogeneous operations,
131 ONE `ProgrammaticToolset.execute_tool_script` call batches them
132 server-side without breaking the serial rule
133 (`references/advanced-workflows.md`).
1343. **NEVER issue overlapping calls.** Do not batch multiple
135 `mcp_unreal_engine_*` calls in one turn — Hermes runs batched calls
136 concurrently, and parallel calls against the game thread deadlock or
137 fail. Strictly one call, await result, next call. This overrides the
138 general parallel-tool-calls guidance.
1394. **Read every result.** Many tools (Blueprint compiles, material edits,
140 widget creation) report success/failure in the response body with no
141 protocol-level exception. Anything that isn't an explicit success is a
142 stop-and-diagnose, not a shrug. After property writes, read the value
143 back — several write paths silently no-op (see pitfalls).
1445. **Verify visually and structurally.** After each milestone, confirm state
145 by querying the actors/properties you changed, and capture a viewport
146 screenshot when composition matters (see `references/tool-surface.md` for
147 the capture options; `vision_analyze` the image — you are the art
148 director, judge it).
1496. **Save often.** Editor edits are in-memory until packages/levels are
150 saved; an editor crash loses everything since the last save, and MCP
151 edits are not reliably undoable. Save before AND after any bulk change,
152 and after every milestone.
1537. **Report concretely.** Actor labels, asset paths (`/Game/...`), file
154 locations of captures/renders.
155
156Rules of the world while you work:
157
158- Units are **centimeters**; axes are **Z-up**, X-forward; rotations are
159 degrees (Rotator: Roll around X, Pitch around Y, Yaw around Z). Human eye
160 height ≈ 165 cm; a door ≈ 210×90 cm. Full tables in
161 `references/scene-craft.md`.
162- Content paths use long package names: `/Game/Folder/Asset.Asset` for
163 project content, `/Engine/BasicShapes/Cube.Cube` for engine primitives.
164- Actor **labels** (what you see in the Outliner, settable, non-unique) are
165 not actor **names** (internal, unique). Prefer resolving actors by
166 label/class queries, then hold on to whatever handle the tool returns.
167- Prefer physically-plausible lighting values (lux/candela/Kelvin) over
168 arbitrary brightness numbers — but FIRST read the existing sun's
169 intensity to learn the scene's calibration convention; template worlds
170 are often calibrated around `intensity: 10`, and physical values blow
171 them out (`references/scene-craft.md` has the numbers,
172 `references/pitfalls.md` #12b has the calibration rule).
173
174## From Plain English to a Scene
175
176The user gives intent, not specs. Translate before you build:
177
1781. **Extract the brief.** Subject, mood, time of day, interior/exterior,
179 style, deliverable (screenshot? render? playable level?). Ask at most one
180 round of clarifying questions, then commit — you are the technical
181 director; don't bounce Unreal jargon back at the user.
1822. **Plan the build order.** The order that works: level/environment shell →
183 blocking (major geometry/meshes in place) → lighting + atmosphere →
184 materials → set dressing/detail → camera → capture/render. Post the plan
185 as a todo list for multi-step builds.
1863. **Build with the loop above**, one milestone at a time, screenshot at
187 each milestone.
1884. **Art-direct yourself.** Compare each screenshot against the brief:
189 readable silhouette? believable light direction/intensity? horizon not
190 dead-center? scale correct against a human-height reference? Fix before
191 moving on.
1925. **Deliver.** Screenshots/renders as files (`MEDIA:` path), plus a short
193 summary of what exists in the level and where it was saved.
194
195`references/recipes.md` has complete worked builds (exterior daylight scene,
196moody interior, golden-hour cinematic + render, asset import & placement)
197with the exact call sequences and values.
198
199## Reference Files
200
201Load on demand; keep SKILL.md-level rules in mind throughout.
202
203| Reference | Contents |
204|---|---|
205| `references/tool-surface.md` | Shipped toolsets catalog, discovery protocol detail, plugin console commands/CVars/flags, screenshot & capture paths, MCP Inspector debugging, extending with custom Python/C++ toolsets |
206| `references/advanced-workflows.md` | Sophisticated workflows, live-verified: ProgrammaticToolset batching, Blueprint DSL authoring loop (create→DSL→compile→spawn), PIE test sessions, Sequencer orientation (140 tools), LogsToolset self-debugging, automation testing, semantic asset search, config settings, per-situation decision table |
207| `references/scene-craft.md` | Numeric cheat sheet: physical light intensities, color temperatures, exposure/EV100, fog densities, mood recipes (noon/golden hour/overcast/night/interior), scale tables, content path conventions |
208| `references/recipes.md` | End-to-end worked builds with exact call sequences |
209| `references/pitfalls.md` | Setup, runtime, and workflow pitfalls with fixes — read before your first session and whenever something misbehaves |
210
211## Pitfalls (top of mind — full list in references/pitfalls.md)
212
213- **Start order matters.** Editor + server up first, then the Hermes
214 session. Missing `mcp_unreal_engine_*` tools = wrong order.
215- **One call at a time.** Serial game thread; no batching, no overlap.
216- **The editor UI freezes during each call.** That's by design (game-thread
217 execution). Warn the user during long operations; keep calls small.
218- **Modal dialogs block everything.** A tool call that opens (or collides
219 with) a modal editor dialog stalls until a human dismisses it. If a call
220 hangs indefinitely, tell the user to check the editor for a dialog.
221- **Timeouts on long operations.** Hermes' per-call default is 120 s; asset
222 imports, big level saves, and renders can exceed it. Raise
223 `mcp_servers.unreal-engine.timeout` in `~/.hermes/config.yaml` for
224 render/import-heavy sessions.
225- **Stale tool schemas.** After authoring/hot-reloading toolsets or enabling
226 a plugin, run `ModelContextProtocol.RefreshTools` in the editor console
227 and re-`list_toolsets`. New C++ `UFUNCTION`s need a full editor restart —
228 Live Coding won't surface them.
229- **Experimental plugin.** APIs and tool shapes can change between engine
230 versions; trust `describe_toolset` over memory, including this skill's
231 examples. When docs and the live schema disagree, the live schema wins.
232- **Don't expose the server beyond localhost.** Loopback-only, no auth, by
233 design. Never suggest binding it wider.
234- **Licensing note.** The server logs on start: data transmitted via the
235 plugin to a connected LLM service is Licensed Technology under the UE
236 EULA (§6(e)) — the user is responsible for ensuring their LLM provider
237 doesn't train on it. Surface this if the user asks about data handling.
238
239## Verification Checklist
240
241- [ ] `list_toolsets` returns toolsets at session start (connection healthy)
242- [ ] Scene state queried before first edit (never assumed empty)
243- [ ] After each milestone: changed actors/properties re-queried and a
244 screenshot reviewed against the brief
245- [ ] Level/dirty packages saved after each milestone and at the end
246- [ ] Deliverables exist on disk (screenshot/render paths confirmed) and are
247 reported to the user with absolute paths
248- [ ] Editor left in a clean state: no pending modal, no unsaved surprise,
249 user told exactly what was created/changed and where
250
251---
252
253**Source:** [`NousResearch/hermes-agent`](https://github.com/NousResearch/hermes-agent) → `optional-skills/creative/unreal-mcp/SKILL.md`