Python bridge for the Unreal AI Connection Unreal Engine 5.7 plugin. Translates any MCP client's stdio MCP transport to the plugin's raw JSON-RPC over a local TCP socket.
This server presents 6 Unreal Engine editor automation tools with mixed quality. Tool naming follows verb_noun conventions well (list_tools, apply_python_to_selection, add_audio_track, add_blueprint_function, add_blueprint_node). However, descriptions vary significantly in quality and completeness. Parameter schemas are present but lack full JSON Schema type declarations and constraints. Critical gaps: no input validation guidance, missing error handling patterns, no output schema documentation, and parameters lack type constraints (enums, ranges). The server bridges Unreal Engine via STDIO (JSON-RPC over TCP socket translation), which is a significant limitation for remote accessibility and integration with hosted MCP clients.
Add a root-level (master) UMovieSceneAudioTrack to a Level Sequence and append a sound section playing a USoundBase (SoundWave / SoundCue / MetaSound source) starting at a given frame.
Add a new (empty) function graph to a UBlueprint.
Add one K2 graph node (CallFunction-by-name, VariableGet, VariableSet, or Branch/IfThenElse) into a UBlueprint's event or function graph, at an optional X/Y position, and return the new node's GUID + name + listable pins.
Run user-supplied Python with the editor's current selection pre-bound as locals. Convenience wrapper around execute_unreal_python that injects boilerplate to fetch selection (currently-selected level actors as TArray<AActor*>) and selected_assets (currently-selected content-browser assets as TArray<UObject*>).
Dump the project's legacy input mappings (UInputSettings) as structured JSON. Action mappings: name + key + modifier flags (shift / ctrl / alt / cmd). Axis mappings: name + key + scale. Also reports whether Enhanced Input is being used in the project.
Parameters lack type constraints and validation guidance. 'node_type' in add_blueprint_node accepts 'call_function', 'variable_get', 'variable_set', 'branch' but has no enum constraint in schema; 'node_pos_x', 'node_pos_y' lack min/max bounds; 'volume' and 'start_frame' in add_audio_track have no range specifications. LLMs will hallucinate invalid values without explicit constraints.
No output schema documentation. None of the 6 tools document what structure they return. 'list_tools' returns {tools: [], count: int}, 'add_blueprint_node' returns a node with 'GUID + name + listable pins' (per description), but LLMs have no formal schema to parse responses. This forces unstructured parsing and wastes tokens.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Returns the names of every registered MCP method.
apply_python_to_selection accepts arbitrary user-supplied Python code with no safety guardrails documented. Description notes it 'injects boilerplate' but provides no guidance on injection risks, sandboxing, or error recovery. For an irreversible write operation in a critical editor, this needs permission gates and execution confirmation.
Parameters depend on each other but dependencies are undocumented. In add_blueprint_node, 'function_name' is 'Required when node_type is call_function' and 'variable_name' is 'Required when node_type is variable_get or variable_set', but this conditional logic appears only in parameter descriptions, not as validation rules. LLMs cannot reliably infer mutual exclusivity.
No error handling guidance. All 6 tools lack documented error cases, recovery paths, or categorization (retryable vs. fatal). If 'add_audio_track' fails because the sequence_path doesn't exist, the response should guide the agent: 'Sequence not found. Use inspect_sequences() to list available sequences.' Instead, agents get nothing.
Tool descriptions mention behavior but omit preconditions and side effects. 'add_blueprint_node' says it 'adds one K2 graph node' but doesn't state: Does this automatically connect pins? Does it require the blueprint to be loaded/editable? Is the operation idempotent? Can it be retried safely? These gaps force agents to guess.
Parameter descriptions use vague terms without examples or formats. 'add_audio_track' has 'start_frame' with description 'Optional frame number to start the sound (default 0.0)', but what is a frame? 30fps? What range is valid? Agents cannot infer frame semantics without explicit guidance.