MCP server for Unreal Engine editor automation. Provides tools for actor/component management, asset operations, blueprint editing, level/map management, and editor/console control via native C++ reflection APIs.
Unreal-MCP demonstrates solid engineering with explicit tool registration, complete parameter schemas, and comprehensive descriptions. All 7 tools have formal JSON Schema definitions with types and descriptions. However, several definition quality gaps prevent a higher score: (1) descriptions lack LLM-optimized structure, they are verbose and procedural rather than answering 'what', 'when', and 'why'; (2) error handling guidance is minimal, tools document error conditions but don't guide recovery (e.g., 'No actor matched ref' should suggest 'Call actor-list to see available actors'); (3) composition and chaining support is weak, tools return minimal navigation aids for follow-up calls; (4) no batch operations despite patterns (e.g., asset-find returns paginated results but no actor-destroy-batch for multi-actor deletion); (5) parameter enums are used correctly (actor-create, editor-application-set-state) but descriptions for complex objects like 'rotation' lack formal schema. The implementation is well-structured (visible in UnrealMcpActorTools.cpp with FUnrealMcpToolRegistry), but definition patterns lag behind production baselines.
Spawn a new actor in the current editor level from a native class path (e.g. '/Script/Engine.StaticMeshActor', 'PointLight') or a Blueprint asset path. Optionally set label, location, rotation, and a parent actor to attach to.
Remove an actor from the current editor level. Identify it by label, object name, or full path.
Query the Content Browser AssetRegistry with optional filters: 'name' (case-insensitive substring of the asset name), 'classPath' (full class path e.g. '/Script/Engine.Material', subclasses included), 'path' (package path to search under, e.g. '/Game/Materials'), 'tagKey'/'tagValue' (asset registry tag filter). When no 'path'/'classPath'/'tagKey' is given the search is scoped to '/Game' (not the whole registry incl. /Engine). Paginated via 'offset'/'limit' (limit is clamped to 1000).
Create a new Blueprint class from a parent UClass path via the public FKismetEditorUtilities::CreateBlueprint. 'path' is the /Game package path for the asset (e.g. '/Game/MCP/BP_Thing'); the object-path form ('/Game/MCP/BP_Thing.BP_Thing') is also accepted and normalised. 'parentClass' is a native class path or short name (e.g. '/Script/Engine.Actor' or 'Actor'). The asset is registered in-session; saving to disk is out of scope for the MVP.
Snapshot of the editor play state: whether Play-In-Editor is running, paused, or simulating, plus the current editor map. Read-only.
Descriptions lack recovery guidance for error cases. 'No actor matched' errors do not suggest next steps (e.g., 'Call actor-list to discover available actors'). LLMs need explicit recovery paths to self-correct.
Parameter descriptions are functional but not LLM-optimized. They state what a param does but not why or when to use it. E.g., actor-create 'parentActor' description should say 'Attach to another actor for hierarchical transforms; omit for world-level placement.' Current: 'Label/path of an actor to attach the new actor to.' is terse.
Complex object parameters (e.g., 'rotation' in actor-create) lack formal nested schema. The description says '{pitch,yaw,roll} in degrees' but no JSON Schema oneOf/object constraint visible. LLMs may pass invalid structures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Drive Play-In-Editor: action = 'start' | 'stop' | 'pause' | 'resume'. PIE transitions are deferred to the next editor tick, so this returns a structured 'pending' result; poll editor-application-get-state to confirm the transition. Invalid transitions (e.g. pause while not playing) return a structured error.
Create a new, empty level and make it the active editor world. Optionally seed it from an existing level via 'template' (asset path), and optionally persist it to disk via 'path' (asset path, e.g. '/Game/Maps/Arena') — omit 'path' to leave the new level transient/in-memory. Replaces the current editor world (its undo buffer is reset, as with any New/Open Level).
No output schema documented for any tool. asset-find returns paginated results but no documented field structure. LLMs cannot plan chaining calls or extract nested fields without guessing. HARD BASELINE RULE VIOLATED: 100% of A+ tools document return types.
No batch operations offered. Agents cannot delete multiple actors in one call or create multiple blueprints. asset-find supports pagination but no tools offer batch mutations. Production baseline: agents calling tools in loops waste tokens and latency.
actor-destroy and level-create are destructive but descriptions do not explicitly state 'irreversible' or offer dry-run/confirmation patterns. Agents need to know consequences before acting.
editor-application-set-state transitions are deferred ('pending' result); tool description hints at polling via editor-application-get-state but does not document polling frequency or timeout. LLMs may poll too aggressively or give up prematurely.