A server for Unreal Engine integration via the Model Context Protocol (MCP)
This MCP server has 23 tools for Unreal Engine integration with mostly complete schemas and descriptions. However, there are significant issues: (1) Tool naming is inconsistent, some tools use imperative verbs clearly (create_blueprint, delete_actor), while others are passive or unclear (add_component_to_blueprint is clear, but many lack verb-noun clarity). (2) All tools have descriptions, but many are minimal (under 100 chars) or lack context on WHEN to use them vs similar tools. (3) Schemas are present and mostly well-formed with types and parameter descriptions, but OUTPUT schemas are entirely undocumented, no tool declares what it returns beyond vague 'Dict[str, Any]' or '{success: bool, message: str}'. (4) Error handling is minimal: all tools return {success: false, message: error} but never guide recovery (e.g., 'Call find_actors_by_name() first', 'Ensure parent_class is a valid UE class'). (5) No tool includes risk assessment guidance despite many being destructive (delete_actor, set_actor_property). (6) Composition is weak: many tools perform sequential operations that should be atomic (e.g., add_component_to_blueprint + set_static_mesh_properties + set_component_property could be unified). (7) Parameters are mostly described but lack enums for constrained values (e.g., component_type, variable_type, event_name accept free-form strings). Average tool description length: ~160 chars (within baseline p10-p90 range of 34-392), but descriptions often lack 'WHEN to use' context. All tools have typed input parameters, which is good. Output documentation is the largest gap.
Add an event node to a Blueprint's event graph. Args: blueprint_name: Name of the target Blueprint event_name: Name of the event. Use 'Receive' prefix for standard events: - 'ReceiveBeginPlay' for Begin Play - 'ReceiveTick' for Tick - etc. node_position: Optional [X, Y] position in the graph Returns: Response containing the node ID and success status
Add a function call node to a Blueprint's event graph. Args: blueprint_name: Name of the target Blueprint target: Target object for the function (component name or self) function_name: Name of the function to call params: Optional parameters to set on the function node node_position: Optional [X, Y] position in the graph Returns: Response containing the node ID and success status
Add an input action event node to a Blueprint's event graph. Args: blueprint_name: Name of the target Blueprint action_name: Name of the input action to respond to node_position: Optional [X, Y] position in the graph Returns: Response containing the node ID and success status
Add a variable to a Blueprint. Args: blueprint_name: Name of the target Blueprint variable_name: Name of the variable variable_type: Type of the variable (Boolean, Integer, Float, Vector, etc.) is_exposed: Whether to expose the variable to the editor Returns: Response indicating success or failure
Output schemas are completely undocumented. Every tool returns 'Dict[str, Any]' with no specification of fields, types, or what the LLM should expect. This violates the 'Document the output schema' critical check and forces LLMs to guess what fields are available.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 12 | - | v1 |
Add a Button widget to a UMG Widget Blueprint. Args: widget_name: Name of the target Widget Blueprint button_name: Name to give the new Button text: Text to display on the button position: [X, Y] position in the canvas panel size: [Width, Height] of the button font_size: Font size for button text color: [R, G, B, A] text color values (0.0 to 1.0) background_color: [R, G, B, A] button background color values (0.0 to 1.0) Returns: Dict containing success status and button properties
Add a component to a Blueprint. Args: blueprint_name: Name of the target Blueprint component_type: Type of component to add (use component class name without U prefix) component_name: Name for the new component location: [X, Y, Z] coordinates for component's position rotation: [Pitch, Yaw, Roll] values for component's rotation scale: [X, Y, Z] values for component's scale component_properties: Additional properties to set on the component Returns: Information about the added component
Add a Text Block widget to a UMG Widget Blueprint. Args: widget_name: Name of the target Widget Blueprint text_block_name: Name to give the new Text Block text: Initial text content position: [X, Y] position in the canvas panel size: [Width, Height] of the text block font_size: Font size in points color: [R, G, B, A] color values (0.0 to 1.0) Returns: Dict containing success status and text block properties
Add a Widget Blueprint instance to the viewport. Args: widget_name: Name of the Widget Blueprint to add z_order: Z-order for the widget (higher numbers appear on top) Returns: Dict containing success status and widget instance information
Bind an event on a widget component to a function. Args: widget_name: Name of the target Widget Blueprint widget_component_name: Name of the widget component (button, etc.) event_name: Name of the event to bind (OnClicked, etc.) function_name: Name of the function to create/bind to (defaults to f"{widget_component_name}_{event_name}") Returns: Dict containing success status and binding information
Connect two nodes in a Blueprint's event graph. Args: blueprint_name: Name of the target Blueprint source_node_id: ID of the source node source_pin: Name of the output pin on the source node target_node_id: ID of the target node target_pin: Name of the input pin on the target node Returns: Response indicating success or failure
Create a new Blueprint class.
Create an input mapping for the project. Args: action_name: Name of the input action key: Key to bind (SpaceBar, LeftMouseButton, etc.) input_type: Type of input mapping (Action or Axis) Returns: Response indicating success or failure
Create a new UMG Widget Blueprint. Args: widget_name: Name of the widget blueprint to create parent_class: Parent class for the widget (default: UserWidget) path: Content browser path where the widget should be created Returns: Dict containing success status and widget path
Delete an actor by name.
Find actors by name pattern.
Get all properties of an actor.
Get a list of all actors in the current level.
Set a property on an actor. Args: name: Name of the actor property_name: Name of the property to set property_value: Value to set the property to Returns: Dict containing response from Unreal with operation status
Set the transform of an actor.
Set a property on a component in a Blueprint.
Set physics properties on a component.
Set static mesh properties on a StaticMeshComponent. Args: blueprint_name: Name of the target Blueprint component_name: Name of the StaticMeshComponent static_mesh: Path to the static mesh asset (e.g., "/Engine/BasicShapes/Cube.Cube") Returns: Response indicating success or failure
Create a new actor in the current level. Args: ctx: The MCP context name: The name to give the new actor (must be unique) type: The type of actor to create (e.g. StaticMeshActor, PointLight) location: The [x, y, z] world location to spawn at rotation: The [pitch, yaw, roll] rotation in degrees Returns: Dict containing the created actor's properties
Error handling lacks recovery guidance. All tools return generic {success: false, message: error_text} but never guide the LLM on next steps. E.g., delete_actor on non-existent actor should suggest 'Try find_actors_by_name() to locate the actor first.' or set_component_property failures should explain 'Ensure component_name and property_name are valid for the blueprint's component type.'
Destructive tools (delete_actor) lack risk categorization and confirmation support. Tool descriptions do not warn about irreversibility, and there is no dry-run or confirmation mechanism. delete_actor is especially dangerous, it should require explicit confirmation or support a --confirm flag.
Free-form string parameters lack enum constraints. component_type (add_component_to_blueprint), event_name (add_blueprint_event_node), variable_type (add_blueprint_variable), and input_type (create_input_mapping) accept unvalidated strings. LLMs will hallucinate invalid values. These should either be enums or include regex patterns in descriptions.
Minimal descriptions on discovery/query tools. get_actors_in_level (40 chars), get_actor_properties (40 chars), find_actors_by_name (45 chars) lack context on WHEN to call them or what structure they return. Should explain: 'Use this to discover available actors before creating or modifying them' and 'Returns a list of actor objects with properties: name, type, location, rotation, scale.'
Weak composition: sequential operations that should be atomic. E.g., (1) add_component_to_blueprint + set_static_mesh_properties + set_component_property requires 3 calls to accomplish one intent. (2) add_blueprint_event_node + add_blueprint_function_node + connect_blueprint_nodes requires 3 calls to wire up a simple event. Combining these into higher-level tools (e.g., add_complete_mesh_component, wire_event_to_function) would reduce tokens and improve reliability.
Response fields that enable tool chaining are not documented. E.g., spawn_actor and create_blueprint should clearly return 'actor_id' or 'blueprint_name' so downstream tools (set_actor_transform, add_component_to_blueprint) know what ID to pass. Without explicit documentation, LLMs cannot reliably chain these tools.
Transport and protocol metadata not visible in source. Code shows fastmcp import but actual transport mechanism (HTTP, STDIO, SSE) is not declared. This prevents accurate assessment of Protocol Readiness.