Atlas / MCP servers / ivanmurzak / Unreal-MCP

Unreal-MCPCAUTION

mcp/ivanmurzak/unreal-mcp

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

Verdict
CAUTION
Grade
B
Trust score
89 /100
Exposed tools
31 23r · 8w · 0d
Transport
streamable-http
License
Apache-2.0
Stars
46
01

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)

Read from source at commit cc76cb5abe2cOBSERVED · 2026-10-13
02

Connect

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-code
claude mcp add unreal-mcp-cli --env GH_TOKEN=${GH_TOKEN} --env GITHUB_TOKEN=${GITHUB_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "unreal-mcp-cli": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "GH_TOKEN": "${GH_TOKEN}",
        "GITHUB_TOKEN": "${GITHUB_TOKEN}"
      }
    }
  }
}
03

Exposed tools (31)

23 read · 8 write · 0 destructive.

ToolRiskDescription
control-rig-getreadInspects 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-componentreadInspects 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-listreadLists 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-bonesreadLists 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-controlsreadLists 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-createwriteCreates 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-mappingwriteAdds a key -> action mapping to a UInputMappingContext, binding an FKey to a UInputAction. Optionally saves it to disk.
enhanced-input-context-createwriteCreates a UInputMappingContext asset (an Enhanced Input mapping context) at a content path. Optionally saves it to disk.
enhanced-input-getreadInspects a single Enhanced Input asset (read-only): for a UInputAction reports its value type; for a UInputMappingContext reports its key -> action mappings.
enhanced-input-listreadLists 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-abilityreadGrants a Gameplay Ability to a named actor
gas-inspect-abilityreadInspects 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-abilitiesreadLists 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-setswriteLists 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-effectsreadLists 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-actorreadInspects a single Landscape actor by name (read-only): section layout (componentSizeQuads / subsectionSizeQuads / numSubsections), component count, landscape material, and paint layers.
landscape-get-water-bodyreadInspects a single Water body by name (read-only): type, spline-point count, water material, and owning water zone.
landscape-list-actorsreadLists 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-bodiesreadLists 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-zonesreadLists every Water zone actor in the active editor world (read-only), reporting world location and 2D zone extent.
niagara-createwriteCreate a Niagara system.
niagara-get-systemreadInspect a single Niagara system asset (read-only) and report its emitters.
niagara-list-systemsreadList every Niagara system (UNiagaraSystem) asset in the project (read-only), optionally filtered by a content-path prefix.
niagara-spawn-componentreadSpawn a Niagara component for a system into the active editor world at a location.
pcg-add-componentwriteAdds a UPCGComponent to a named actor in the active editor world, optionally bound to a PCG graph asset.
pcg-generatereadTriggers PCG generation (refresh) on the UPCGComponent of a named actor in the active editor world.
pcg-get-componentreadInspects the UPCGComponent on a named actor in the active editor world (read-only): its bound graph and generation state.
pcg-get-graphreadInspects a single PCG graph asset (read-only) and reports its nodes.
pcg-list-graphsreadLists 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-toolwriteInvoke a system tool via the project\
run-toolwriteInvoke an MCP tool via the project\
04

Trust audit

CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (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)

MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
UnrealMCP/Source/UnrealMcpEditor/Private/DevControl/UnrealMcpDevControlServer.cpp:197
UE_LOG(LogUnrealMcp, Log, TEXT("[dev-control] Listening on http://127.0.0.1:%u"), BoundPort);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
UnrealMCP/Source/UnrealMcpEditor/Private/DevControl/UnrealMcpDevControlServer.h:43
* a no-op. Logs `[dev-control] Listening on http://127.0.0.1:<port>` on success.
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
UnrealMCP/Source/UnrealMcpEditorTests/Private/UnrealMcpDevControlSpec.cpp:300
TEXT("POST"), TEXT("/control/server-url"), DevCtlBody(TEXT("{\"url\":\"http://127.0.0.1:5244\"}")), &VM.Get(), Result);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
UnrealMCP/Source/UnrealMcpEditorTests/Private/UnrealMcpDevControlSpec.cpp:303
TestEqual("custom host", VM->GetCustomHost(), FString(TEXT("http://127.0.0.1:5244")));
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
.github/scripts/chain_feed.py:1847
return hashlib.sha1(header + data).hexdigest()  # noqa: S324 - git's own blob hash
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/scripts/chain_fixture.py:809
record.add_argument("--server-url", required=True, help="MCP server base URL, e.g. http://127.0.0.1:8080")
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
.github/scripts/chain_feed.py:2042
data = json.loads(read_text(path).lstrip(""))
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
.github/scripts/chain_feed.py:2626
data = json.loads(read_text(manifest).lstrip(""))
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
cli/tests/config.test.ts:67
const dir = makeProject({ config: '' + JSON.stringify({ connectionMode: 'Cloud', cloudUrl: 'https://ai-game.dev' }) });
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
cli/tests/project-marker.test.ts:69
fs.writeFileSync(p, '' + JSON.stringify({ serverTarget: 'https://ai-game.dev' }));
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
cli/package.json
@baizor/gamedev-cli-core, chalk, commander, fflate, yocto-spinner, @types/node, typescript, vitest
Why it matters. 8 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-13 · audit v0.4.1 · source sha cc76cb5abe2cfull audit observations/trust-audit/mcp-server/ivanmurzak__unreal-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-13cc76cb5abe2cCAUTIONB89first audit
06

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.

Advertisement