Unreal-MCPCAUTION
AI Game Developer for Unreal Engine — MCP plugin (C++ editor plugin + .NET bridge), unreal-cli, connects Unreal Editor to AI agents via ai-game.dev or a local MCP server
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
✨ AI Game Developer — Unreal MCP
[](https://modelcontextprotocol.io/introduction) [](https://www.unrealengine.com/) [](https://www.unrealengine.com/) [](https://www.unrealengine.com/) [](https://github.com/IvanMurzak/Unreal-MCP/actions/workflows/release.yml) [](https://discord.gg/cfbdMZX99G) [](https://github.com/IvanMurzak/Unreal-MCP/stargazers) [](https://hub.docker.com/r/aigamedeveloper/mcp-server) [](https://github.com/IvanMurzak/Unreal-MCP/blob/main/LICENSE) [](https://stand-with-ukraine.pp.ua)
cc76cb5abe2cOBSERVED · 2026-10-13Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add unreal-mcp-cli --env GH_TOKEN=${GH_TOKEN} --env GITHUB_TOKEN=${GITHUB_TOKEN} -- npx -y [email protected]{
"mcpServers": {
"unreal-mcp-cli": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"GH_TOKEN": "${GH_TOKEN}",
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}Exposed tools (31)
23 read · 8 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
control-rig-get | read | Inspects a single Control Rig blueprint asset (read-only) and reports its rig element hierarchy. Returns { path, name, boneCount, nullCount, controlCount, curveCount, elementCount, elements:[{ name, type }] }. |
control-rig-get-component | read | Inspects the Control Rig component of an actor in the active editor world (read-only). Looks the actor up by its label. Returns { actorName, componentName, controlRigClass, hasControlRig } (controlRigClass is the bound rig instance\ |
control-rig-list | read | Lists every Control Rig blueprint (UControlRigBlueprint) asset in the project via the Asset Registry, without loading any of them. Optionally filter by a content-path prefix. Returns { count, controlRigs:[{ name, path }] }. |
control-rig-list-bones | read | Lists the bone elements of a Control Rig blueprint (read-only), each with its immediate parent bone (empty for a root). Returns { path, boneCount, bones:[{ name, parent }] }. |
control-rig-list-controls | read | Lists the control elements of a Control Rig blueprint (read-only), each with its control type (e.g. Float, Transform, Bool). Returns { path, controlCount, controls:[{ name, controlType }] }. |
enhanced-input-action-create | write | Creates a UInputAction asset (an Enhanced Input action) at a content path, with an optional value type (Boolean | Axis1D | Axis2D | Axis3D). Optionally saves it to disk. |
enhanced-input-add-mapping | write | Adds a key -> action mapping to a UInputMappingContext, binding an FKey to a UInputAction. Optionally saves it to disk. |
enhanced-input-context-create | write | Creates a UInputMappingContext asset (an Enhanced Input mapping context) at a content path. Optionally saves it to disk. |
enhanced-input-get | read | Inspects a single Enhanced Input asset (read-only): for a UInputAction reports its value type; for a UInputMappingContext reports its key -> action mappings. |
enhanced-input-list | read | Lists every Enhanced Input asset in the project via the Asset Registry, without loading any of them: Input Actions (UInputAction) and Mapping Contexts (UInputMappingContext). Optionally filter by a content-path prefix. |
gas-grant-ability | read | Grants a Gameplay Ability to a named actor |
gas-inspect-ability | read | Inspects a single Gameplay Ability class (read-only) by loading its class default object and reporting its configuration: gameplay tags, cost/cooldown Gameplay Effect classes, and instancing policy. |
gas-list-abilities | read | Lists every Gameplay Ability class (UGameplayAbility subclass — native C++ and Blueprint) known to the project via the Asset Registry, without loading any of them. Optionally filter by a class-path prefix. |
gas-list-attribute-sets | write | Lists every Attribute Set class (UAttributeSet subclass — native C++ and Blueprint) known to the project via the Asset Registry, without loading any of them. Optionally filter by a class-path prefix. |
gas-list-effects | read | Lists every Gameplay Effect class (UGameplayEffect subclass — native C++ and Blueprint) known to the project via the Asset Registry, without loading any of them. Optionally filter by a class-path prefix. |
landscape-get-actor | read | Inspects a single Landscape actor by name (read-only): section layout (componentSizeQuads / subsectionSizeQuads / numSubsections), component count, landscape material, and paint layers. |
landscape-get-water-body | read | Inspects a single Water body by name (read-only): type, spline-point count, water material, and owning water zone. |
landscape-list-actors | read | Lists every Landscape actor / proxy in the active editor world (read-only), reporting class, whether it is the primary ALandscape (vs a streaming proxy), and component count. |
landscape-list-water-bodies | read | Lists every Water body actor in the active editor world (read-only), reporting its type (River / Lake / Ocean / Custom) and spline-point count. |
landscape-list-water-zones | read | Lists every Water zone actor in the active editor world (read-only), reporting world location and 2D zone extent. |
niagara-create | write | Create a Niagara system. |
niagara-get-system | read | Inspect a single Niagara system asset (read-only) and report its emitters. |
niagara-list-systems | read | List every Niagara system (UNiagaraSystem) asset in the project (read-only), optionally filtered by a content-path prefix. |
niagara-spawn-component | read | Spawn a Niagara component for a system into the active editor world at a location. |
pcg-add-component | write | Adds a UPCGComponent to a named actor in the active editor world, optionally bound to a PCG graph asset. |
pcg-generate | read | Triggers PCG generation (refresh) on the UPCGComponent of a named actor in the active editor world. |
pcg-get-component | read | Inspects the UPCGComponent on a named actor in the active editor world (read-only): its bound graph and generation state. |
pcg-get-graph | read | Inspects a single PCG graph asset (read-only) and reports its nodes. |
pcg-list-graphs | read | Lists every PCG graph (UPCGGraph) asset in the project via the Asset Registry, without loading any of them. Optionally filter by a content-path prefix. |
run-system-tool | write | Invoke a system tool via the project\ |
run-tool | write | Invoke an MCP tool via the project\ |
Trust audit
CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (3 observation(s))
- Network
- declared (4 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (11)
UE_LOG(LogUnrealMcp, Log, TEXT("[dev-control] Listening on http://127.0.0.1:%u"), BoundPort);* a no-op. Logs `[dev-control] Listening on http://127.0.0.1:<port>` on success.
TEXT("POST"), TEXT("/control/server-url"), DevCtlBody(TEXT("{\"url\":\"http://127.0.0.1:5244\"}")), &VM.Get(), Result);TestEqual("custom host", VM->GetCustomHost(), FString(TEXT("http://127.0.0.1:5244")));return hashlib.sha1(header + data).hexdigest() # noqa: S324 - git's own blob hash
record.add_argument("--server-url", required=True, help="MCP server base URL, e.g. http://127.0.0.1:8080")data = json.loads(read_text(path).lstrip(""))data = json.loads(read_text(manifest).lstrip(""))const dir = makeProject({ config: '' + JSON.stringify({ connectionMode: 'Cloud', cloudUrl: 'https://ai-game.dev' }) });fs.writeFileSync(p, '' + JSON.stringify({ serverTarget: 'https://ai-game.dev' }));@baizor/gamedev-cli-core, chalk, commander, fflate, yocto-spinner, @types/node, typescript, vitest
Gates applied: no_behavioural_pass.
cc76cb5abe2cfull audit observations/trust-audit/mcp-server/ivanmurzak__unreal-mcp.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-13 | cc76cb5abe2c | CAUTION | B | 89 | first audit |
Questions
What is the Unreal-MCP MCP server?
AI Game Developer for Unreal Engine — MCP plugin (C++ editor plugin + .NET bridge), unreal-cli, connects Unreal Editor to AI agents via ai-game.dev or a local MCP server
What tools does Unreal-MCP expose?
31 in total: 23 read-only, 8 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is Unreal-MCP safe to connect to an agent?
With care. The audit graded it B (89/100) and found 11 things worth knowing before you trust this server, listed below with the exact line each was found on.
What credentials does Unreal-MCP need?
It reads GH_TOKEN and GITHUB_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Unreal-MCP run?
It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as unreal-mcp-cli at 0.20.2.
How current is this page?
The grade is for one exact copy of the source (cc76cb5abe2c), read on 2026-10-13. The repository is watched and re-audited when it changes.