Skip to main content
Glama
ChiR24

Unreal Engine MCP Server

by ChiR24

📌 Which version is this? This README describes 0.6.0, the stable release: the plugin on Fab and on the Releases page, and npm unreal-engine-mcp-server (latest). The previous release, 0.5.30, exposes 23 separate tools instead of one; staying on a 0.5.30 plugin means pinning unreal-engine-mcp-server@0.5.30. See Upgrading from 0.5.x.

Contents · What it does · How it works · Quick start · The unreal tool · Configuration · Security · Engine plugins · Docker · Documentation · Development · Community


What it does

🏗️ Levels and actors Spawn one actor or hundreds in a single call, place and attach them, find the ones sunk into the floor, and load, stream and save levels.

🧩 Blueprints and UI Create Blueprints, variables and components, build whole event graphs in one batch, and lay out UMG widgets, with a preview image to check them.

🎨 Materials and worlds Material graphs and instances, procedural textures, lighting, landscapes, foliage, Niagara effects and PCG graphs.

🕹️ Gameplay Characters and animation, Gameplay Ability System, AI (Behavior Trees, State Trees, EQS), inventory, networking and Enhanced Input.

🎬 Cinematics and audio Level Sequences, cameras, Movie Render Queue and Take Recorder; Sound Cues and MetaSounds.

🧪 Play and verify Run Play-In-Editor with synthetic input, take screenshots the model can see, read logs, profile, run Python, and package builds.

Over 450 capabilities in all, behind a single MCP tool. The assistant finds them by searching in plain words, so nobody has to learn their names. The full list is the generated Action Reference.

Related MCP server: unreal-mcp

How it works

The EngineWire plugin runs inside the editor and does all the work, on the editor's game thread, and serves MCP itself. Clients reach it in one of two ways, and both get the same single tool, unreal:

🌐 Route A · Native HTTP

🧩 Route B · stdio

Path

Client → the plugin's Streamable HTTP server at http://127.0.0.1:3000/mcp

Client → unreal-engine-mcp-server (Node.js, stdio) → the same /mcp

Node.js

Not needed

20.19 or later

Capability token

The client sends it in the X-MCP-Capability-Token header

Read from the project, given UE_PROJECT_PATH

Editor restarts

The client reconnects by hand

The session stays: calls answer NOT_CONNECTED until the editor is back

Best for

Claude Code, Cursor, VS Code, and several clients sharing one editor

Claude Desktop, clients that only launch local commands, and long sessions across editor restarts

Everything listens on 127.0.0.1 and requires the project's capability token unless you change it.

Quick start

The Quick Start page walks through this with screenshots. You need Unreal Engine 5.0 to 5.8. Installing from Fab needs nothing else; building the plugin from source needs a project with C++ code (a Blueprint-only project can install from Fab or use prebuilt binaries).

1. Add the plugin

From Fab (no compiler needed). Get EngineWire on Fab. In the Epic Games Launcher, open Unreal Engine › Library › Fab Library, find EngineWire and click Install to Engine for your engine version. Open your project, enable EngineWire in Edit › Plugins and restart the editor. The Fab build ships with the native server off: turn on Enable Native MCP Server in Edit › Project Settings › Plugins › EngineWire › Native MCP and restart once more. Fab updates follow Epic's review, so the Fab build can trail the newest release here.

From a release. Download EngineWire-plugin-<version>.zip from the newest release on the Releases page, and copy the EngineWire folder it contains into your project:

MyGame/Plugins/EngineWire/

Or use a clone of this repository: copy plugins/EngineWire/, or reference the folder from your .uproject with "AdditionalPluginDirectories": ["C:/Path/To/Unreal_mcp/plugins"].

Open the project and let Unreal rebuild the plugin. When it's loaded, the status bar shows MCP :3000 (0): the plugin serves MCP on port 3000. If you see "Engine modules cannot be compiled at runtime", build the project once in Visual Studio, Rider or Xcode. More in Installation.

https://github.com/user-attachments/assets/d8b86ebc-4364-48c9-9781-de854bf3ef7d

Build the plugin once on a machine with the engine and a compiler, then hand out the zip. No compiler is needed on the target machine:

node scripts/package-plugin.mjs "C:/Program Files/Epic Games/UE_5.7"

This writes build/EngineWire-v<version>-UE5.7-<Platform>.zip, where <version> is the package.json version (currently 0.6.0). Unzip it into YourProject/Plugins/. Binaries only work with the engine minor and platform they were built for: a 5.6 build won't load in 5.5, 5.7 or 5.8.

2. Connect your client

Route A · Native HTTP (no Node.js)

  1. Enable Native MCP Server is on by default (Edit › Project Settings › Plugins › EngineWire, port 3000); the Fab build ships with it off. A project where it is off needs it on and an editor restart.

  2. Read the capability token the plugin generated: <YourProject>/Saved/MCP/capability-token. Treat it like a password.

  3. Add the server to your client and send the token in the X-MCP-Capability-Token header. Claude Code:

    claude mcp add --transport http unreal-engine http://127.0.0.1:3000/mcp --header "X-MCP-Capability-Token: <token>"

    Or in a project .mcp.json (Claude Code), reading the token from an environment variable:

    {
      "mcpServers": {
        "unreal-engine": {
          "type": "http",
          "url": "http://127.0.0.1:3000/mcp",
          "headers": { "X-MCP-Capability-Token": "${UNREAL_MCP_TOKEN}" }
        }
      }
    }

    Cursor (.cursor/mcp.json) takes the same url and headers without type. VS Code, Windsurf and others: Connecting Clients.

  4. Check it: when the client connects, the count in the status bar goes up.

Route B · stdio (Node.js 20.19+)

The package is a small stdio proxy in front of the same /mcp. A client connected straight to /mcp loses its session whenever the editor closes or crashes, and has to reconnect by hand. Through the proxy, every call answers NOT_CONNECTED while the editor is down, and the first call after it is back reaches it, with no reconnect. It keeps the editor's last tool list, so a session that starts before the editor still gets the real tool.

Add this to your client's MCP configuration, for example Claude Desktop's claude_desktop_config.json:

{
  "mcpServers": {
    "unreal-engine": {
      "command": "npx",
      "args": ["-y", "unreal-engine-mcp-server"],
      "env": {
        "UE_PROJECT_PATH": "C:/Path/To/YourProject"
      }
    }
  }
}

Or let the package write it: npx unreal-engine-mcp-server init claude --project C:/Path/To/YourProject shows the entry for Claude Code's .mcp.json (also cursor, vscode, gemini and codex), keeping the file's other servers, and --write saves it. npx unreal-engine-mcp-server doctor checks Node, the token (never shown), the editor's answer and that both sides run the same version.

UE_PROJECT_PATH (the project folder or its .uproject) is how the proxy finds the capability token (MCP_AUTOMATION_CAPABILITY_TOKEN overrides it). UNREAL_MCP_URL points it at another endpoint (default http://127.0.0.1:3000/mcp). Pair it with a 0.6 plugin; a 0.5.x plugin serves its 23 separate tools instead of the unreal gateway.

3. Try it

With the editor open, ask your assistant to "list the actors in the current level", "spawn a point light 300 units above the origin", or "take a screenshot of the viewport". If it doesn't connect, see Troubleshooting.

The unreal tool

Both routes expose exactly one MCP tool, unreal, with four operations. Only the contract the model is about to use gets loaded, instead of hundreds of tool schemas:

Operation

What it does

search

Finds capabilities from 2-4 plain words, such as spawn actor or save level. Every row carries a ready-to-send nextCall.

describe

Returns one capability's exact contract: parameters, schemas, an example, and the consent grant when one is needed

execute

Runs one capability with validated parameters and returns the data plus a receipt of what changed

configure

Enables or disables groups of internal tools; never touches the editor

A typical exchange:

{ "operation": "search", "query": "spawn actor" }
{ "operation": "describe", "tool": "control_actor", "action": "spawn" }
{
  "operation": "execute",
  "tool": "control_actor",
  "action": "spawn",
  "params": { "classPath": "/Script/Engine.PointLight", "actorName": "KeyLight", "location": [0, 0, 300] }
}
  • Parameters are strict. An undeclared name is refused with UNDECLARED_PARAMETER and the list of allowed names; every error carries an executable nextCall.

  • Deletes need consent. Every destructive capability, plus some risky writes, only runs with the consentGrant from describe, passed back as a top-level consent field.

  • Names. A call names the tool + action pair or a capability id, such as "capability": "control_actor.spawn".

Full reference with real replies: Using the Gateway.

Migrating from direct tool calls

The single unreal tool is permanent on both routes; there is no opt-out and no 23-tool listing to restore. A client that still calls a canonical tool name directly (tools/call with name: "manage_asset", name: "control_actor", …) receives a bounded, copy-paste-executable DIRECT_TOOL_CALL_REMOVED receipt instead of a routed call. Its nextCall drills exactly one level: { "operation": "search" } for an unknown name, { "operation": "describe", "tool": "<tool>" } when no action was given, or { "operation": "execute", "tool": "<tool>", "action": "<action>", "params": { ... } } when the call already named an action. Run that nextCall through unreal to finish the migration. See Upgrading.

Protocol versions

Both routes negotiate the MCP protocol version at initialize: 2025-11-25 (latest), 2025-06-18 or 2025-03-26. A client asking for an older version is answered with 2025-11-25. An unsupported MCP-Protocol-Version header on the native route gets HTTP 400. Both also serve MCP 2026-07-28 per request, with no initialize or session, and answer server/discover with it. Details: docs/protocol.md.

These route requests inside the gateway; clients never list them. More in the Tools Reference.

Category

Tool

Covers

Core

manage_asset

Assets and folders, materials and material graphs, textures and render targets, data tables, structs, enums, source control

Core

manage_blueprint

Blueprints, components, variables, event graphs, UMG widgets, layout, bindings, widget animations

Core

control_actor

Spawning, transforms, attachment, components, materials, tags, placement audits

Core

control_editor

Play-In-Editor, synthetic input, screenshots, viewport camera, undo, editor preferences

Core

manage_level

Create, load, save, stream, import and export levels; world settings; lighting builds

Core

system_control

Console commands, logs, project settings, profiling, builds and packaging, tests, Python

Core

inspect

Read and write any UObject's properties, components and class info

Core

manage_tools

Which internal tools are enabled (through configure)

World

build_environment

Landscapes, foliage, lights and sky, water, weather, splines, procedural terrain

World

manage_level_structure

Sublevels, World Partition, streaming, data layers, HLOD, volumes

World

manage_geometry

Geometry Script meshes: booleans, deformers, UVs, collision, LODs, polygon cages, subdivision surfaces, material ids, vertex-color masks

World

manage_pcg

PCG graphs: create, add and connect nodes, execute

Gameplay

animation_physics

Animation Blueprints, blend spaces, montages, skeletons, Control Rig and IK, ragdolls, cloth, vehicles

Gameplay

manage_character

Character Blueprints, movement, MetaHuman

Gameplay

manage_combat

Weapons, projectiles, hit detection

Gameplay

manage_effect

Niagara systems, emitters and modules, debug shapes

Gameplay

manage_gas

Gameplay Ability System: abilities, attributes, effects

Gameplay

manage_ai

AI controllers, Behavior Trees, EQS, State Trees, Smart Objects, perception, navigation

Gameplay

manage_inventory

Items, loot tables, crafting recipes

Gameplay

manage_interaction

Doors and other interactables

Utility

manage_audio

Sounds, audio components, Sound Cues, MetaSounds, attenuation, mixes

Utility

manage_sequence

Level Sequences, Movie Render Queue, media, Take Recorder, replays

Utility

manage_networking

Replication, RPCs, sessions, game framework classes, Enhanced Input

Configuration

Most setups touch one setting: UE_PROJECT_PATH for Route B; Route A needs none. Everything is listed on the Configuration page.

Plugin settings (Project Settings › Plugins › EngineWire, saved in Config/DefaultGame.ini):

Setting

Default

Enable Native MCP Server

on

Serve MCP over HTTP at /mcp (both routes use it)

Native MCP Port

3000

The MCP_NATIVE_PORT environment variable of the editor process overrides it

Listen Ports

8090,8091

The plugin's WebSocket listener; neither route uses it

Require Capability Token

on

Both routes refuse clients without the token

Allow Non Loopback

off

LAN access for both listeners. See Security.

Environment variables (Route B only, in the client's env block):

Variable

Default

UE_PROJECT_PATH

unset

Project folder or .uproject; used to find the token

MCP_AUTOMATION_CAPABILITY_TOKEN

read from the token file

Token to present, when the proxy can't read the project folder

UNREAL_MCP_URL

http://127.0.0.1:3000/mcp

The editor's /mcp endpoint

LOG_LEVEL

info

debug, info, warn or error; logs go to stderr

Security

  • Local by default. Both routes listen on 127.0.0.1 only. The native server never binds off-loopback: it has no TLS, so reach it from another machine through an SSH tunnel (ssh -L 3000:127.0.0.1:3000) or a TLS proxy. The WebSocket bridge binds a LAN address only with Allow Non Loopback, Require Capability Token and Enable Tls all on. The proxy sends the token to another machine only with UNREAL_MCP_ALLOW_REMOTE_TOKEN=1.

  • Capability token. Generated per project at <Project>/Saved/MCP/capability-token (a value typed into Capability Token overrides it) and compared in constant time. Delete the file and restart the editor to rotate it.

  • Consent for destructive work. Deletes and some other writes need a per-call consent grant, which the plugin checks itself.

  • Guard rails. Asset paths are limited to /Game, /Engine, /Script, /Temp and /Niagara, and a content path may also sit under a mount the connected editor reports; arguments the server treats as files (such as filePath, and outputPath even where it names an asset) never use the reported mounts; console commands that chain or quit the editor are blocked; the plugin's own settings are out of reach of automation.

Details: Security. Please report vulnerabilities privately through GitHub security advisories.

Engine plugins

The bridge declares its engine-plugin dependencies, so Unreal enables them together with it.

Plugin

Used for

Python Editor Script Plugin

Python-backed editor automation, system_control Python execution

Editor Scripting Utilities

Asset and actor subsystem operations

Niagara

Visual effects

Gameplay Abilities

manage_gas

Smart Objects

AI smart objects

Plugin

Used for

Level Sequence Editor, Takes, Movie Render Pipeline, Movie Pipeline Mask Render Pass, Electra Player

manage_sequence: Sequencer, Take Recorder, Movie Render Queue, media playback

Control Rig, RigVM, IK Rig, Animation Data

animation_physics: Control Rig and IK

Chaos Vehicles, Chaos Cloth

animation_physics: vehicles and cloth

Niagara Editor

manage_effect: Niagara authoring

Behavior Tree Editor, Environment Query Editor, StateTree, Mass Gameplay

manage_ai

Geometry Scripting, Geometry Processing, Mesh Modeling Toolset, Procedural Mesh Component

manage_geometry (Catmull-Clark, Loop and bilinear subdivision need Mesh Modeling Toolset)

PCG

manage_pcg, compiled in only when the project itself enables the PCG plugin

Game Features

system_control: game feature plugins (listed, activated, made with create_plugin) through the EngineWireGameFeatures module, loaded only when the project itself enables Game Features (EngineWire never turns it on)

Data Registry

manage_asset: data registries listed, read and made over data tables, by reflection when the project itself enables Data Registry (EngineWire never turns it on)

MetaSound, Synthesis

manage_audio: MetaSound authoring

Enhanced Input, Online Subsystem, Online Subsystem Utils

manage_networking: input mappings, sessions

Interchange, Interchange OpenUSD, Data Validation, StructUtils

Import/export, validation, struct helpers

Fab, Bridge

Fab asset library access (optional EngineWireFab module)

The plugin targets every Unreal Engine minor from 5.0 to 5.8. If it fails to build on yours, please open an issue with the build log.

Docker

The image runs the stdio proxy. It has to reach the editor's /mcp on 127.0.0.1:3000, so use host networking (Linux), and pass the token because the container can't read your project folder:

docker build -t unreal-mcp .
docker run -i --rm --network host -e MCP_AUTOMATION_CAPABILITY_TOKEN=<token> unreal-mcp

Use -i without -t: a TTY corrupts the MCP stream on stdout.

Documentation

📖 Wiki

Quick Start, Installation, Connecting Clients, Using the Gateway, Configuration, Security, Troubleshooting, FAQ, Upgrading

📋 Action Reference

Every capability with its effect, scope and consent, generated from the capability records

🔌 Gateway client guide

The gateway contract, with the source file behind each claim

📡 Protocol

Transports, version negotiation, cancellation

🔐 Security and receipts

Scopes, consent, path gating, idempotency, refusal codes

🧪 Testing guide

Test suites and how to add cases

🧩 Extending the plugin

Adding an editor action: record, handler, route and tests, plus the rules for plugin code

🗺️ Roadmap

Development roadmap

📝 Changelog

What changed in each release

Development

npm install
npm run build              # clean + compile TypeScript to dist/
npm run dev                # run from source with ts-node
npm run lint               # ESLint (CI fails on any warning)
npm run type-check         # tsc --noEmit, sources and tests
npm run test:unit          # Vitest unit tests (no Unreal required)
npm run test:params        # strict parameter audit
npm run registry:generate  # capability records -> generated contracts, native shards, action reference
npm run registry:check     # fail if generated artifacts drift
npm run manifest:check     # fail if the gateway manifest drifts
npm run eval:check         # search-ranking corpus
npm run version:check      # all version sources agree
npm test                   # integration suite (needs a live Unreal Editor serving /mcp)

The capability records in src/tools/catalog/capabilities/records/ are the single source of truth; every *.generated.* file, the plugin's MCP/Generated/ shards and the action reference are generated from them. Never hand-edit generated files. How to add a capability: Development.

CI runs, in order: ESLint (npx eslint . --max-warnings=0), type-check, unit tests, registry:check, manifest:check, headers:check, the strict parameter audit (test:params) and eval:check, then a blocking runtime dependency audit (npm audit --omit=dev --audit-level=moderate) and an informational full-tree audit. A Node 20.19 / 26 matrix adds build. Plugin packaging runs only when an Unreal Engine root is configured, because CI runners don't ship an engine. Release archives exclude Binaries/, Intermediate/ and Saved/.

Community

💬 Discussions

Questions, ideas, show and tell

🐞 Issues

Bug reports and feature requests

🗺️ Project board

Roadmap progress and priorities

Contributing: keep pull requests small and focused, with a Conventional Commits title; include reproduction steps for bugs; follow the existing code style. See CONTRIBUTING.md.

License

MIT. See LICENSE.

Available Tools

1 tool
unrealDInspect

Unreal Engine editor: operation search, describe, execute or configure. The editor has not been reached yet, so this is a placeholder; the full contract replaces it once the editor answers.

NameRequiredDescriptionDefault
operationYes

TDQS

D1.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, and it discloses nothing: no mention of whether 'execute' mutates editor state, what permissions are needed, or how the editor is reached. It explicitly states the editor has not been reached, so even basic operational behavior is unknown.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short and front-loads the domain and operation list, which is good structure. The second sentence, however, is an admission of incompleteness rather than content, so the text is more under-specified than genuinely concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and no output schema, the description should explain what search/describe/execute/configure actually do and what comes back; instead it openly says the contract is pending. An agent cannot confidently invoke this tool from this definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter ('operation') and its enum values are already fully visible in the schema; the description merely restates those four values without explaining what any of them means or returns. Zero schema description coverage is not compensated by the text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a domain (Unreal Engine editor) and four operation verbs (search, describe, execute, configure), but it does not say what those operations act on or return. It then declares itself a placeholder, which by design leaves the actual purpose undefined for the agent reading it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to pick one operation over another, no prerequisites, and no indication of what each mode does. An agent seeing 'search' vs 'describe' vs 'execute' gets no basis for choosing, and the placeholder caveat gives none either.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.6.0
    • Changedunreal17 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • removedInput schema / properties / action
        Removed value: -{
        -  "description": "Exact action name returned by describe. For configure, this is a manage_tools action.",
        -  "type": "string"
        -}
      • removedInput schema / properties / capability
        Removed value: -{
        -  "description": "Exact canonical capability ID (or declared alias) returned by search, e.g. asset.import. Preferred selector for describe.",
        -  "type": "string"
        -}
      • removedInput schema / properties / consent
        Removed value: -{
        -  "additionalProperties": false,
        -  "description": "Per-call consent grant for a capability whose policy.consent is not 'none'. Bound to one capability and one call; never persisted, inherited or reused. Read the exact grant from describe.consentGrant. Use with execute only.",
        -  "properties": {
        -    "acknowledge": {
        -      "description": "Acknowledgement strength. 'explicit' satisfies an explicit policy; 'elevated' is required by a destructive policy and also satisfies explicit.",
        -      "enum": [
        -        "explicit",
        -        "elevated"
        -      ],
        -      "type": "string"
        -    },
        -    "capability": {
        -      "description": "Exact canonical capability ID this grant authorizes, as returned by describe.",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "capability",
        -    "acknowledge"
        -  ],
        -  "type": "object"
        -}
      • removedInput schema / properties / cursor
        Removed value: -{
        -  "description": "Opaque search cursor from a previous response nextCursor. Supersedes offset.",
        -  "type": "string"
        -}
      • removedInput schema / properties / domain
        Removed value: -{
        -  "description": "Capability domain to browse or filter by. Call describe with no selector to list domains.",
        -  "type": "string"
        -}
      • removedInput schema / properties / effect
        Removed value: -{
        -  "description": "Filter search results by declared behavior effect.",
        -  "enum": [
        -    "read",
        -    "write",
        -    "destructive"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / family
        Removed value: -{
        -  "description": "Capability family inside a domain. Call describe with a domain to list its families.",
        -  "type": "string"
        -}
      • removedInput schema / properties / limit
        Removed value: -{
        -  "description": "Maximum search results to return. Defaults to 12.",
        -  "maximum": 25,
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • removedInput schema / properties / maxBytes
        Removed value: -{
        -  "description": "Serialized byte ceiling for a search response. Results are dropped from the end until the response fits.",
        -  "maximum": 262144,
        -  "minimum": 512,
        -  "type": "integer"
        -}
      • removedInput schema / properties / offset
        Removed value: -{
        -  "description": "Zero-based search result offset. Defaults to 0.",
        -  "minimum": 0,
        -  "type": "integer"
        -}
      • removedInput schema / properties / operation / description
        Removed value: -"search finds capabilities. describe returns an exact parent-tool contract. execute runs one validated action. configure manages internal capability availability."
      • removedInput schema / properties / param
        Removed value: -{
        -  "description": "Exact parameter name (tool-union catalog) to inspect. Requires tool and action for full drill-down; resolves the single parameter schema. Use with describe only.",
        -  "type": "string"
        -}
      • removedInput schema / properties / params
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Parameters for execute or configure. Keys are the action-specific parameter names returned by describe. Never include action or subAction here.",
        -  "type": "object"
        -}
      • removedInput schema / properties / query
        Removed value: -{
        -  "description": "Search words for tools, categories, descriptions, or actions.",
        -  "type": "string"
        -}
      • removedInput schema / properties / tool
        Removed value: -{
        -  "description": "Exact canonical parent tool name returned by search or describe.",
        -  "type": "string"
        -}
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "properties": {
        -    "action": {
        -      "type": "string"
        -    },
        -    "actionCount": {
        -      "type": "integer"
        -    },
        -    "actionHasMore": {
        -      "type": "boolean"
        -    },
        -    "actionLimit": {
        -      "type": "integer"
        -    },
        -    "actionOffset": {
        -      "type": "integer"
        -    },
        -    "actions": {
        -      "description": "Paginated/filterable action list on tool-only describe.",
        -      "type": "array"
        -    },
        -    "availability": {
        -      "description": "Whether the capability is available, disabled or unavailable, and why."
        -    },
        -    "availableActions": {
        -      "type": "array"
        -    },
        -    "availableParameters": {
        -      "type": "array"
        -    },
        -    "behavior": {
        -      "type": "object"
        -    },
        -    "capabilities": {
        -      "description": "Bounded capability list on a family-level describe.",
        -      "type": "array"
        -    },
        -    "capability": {
        -      "description": "Canonical capability ID this response describes.",
        -      "type": "string"
        -    },
        -    "catalogRevision": {
        -      "description": "Revision of the generated canonical capability catalog this response was served from.",
        -      "type": "string"
        -    },
        -    "consentGrant": {
        -      "description": "Exact consent grant this capability requires, ready to pass back as the execute call's consent sibling. Absent when policy.consent is 'none'.",
        -      "type": "object"
        -    },
        -    "cost": {
        -      "type": "object"
        -    },
        -    "data": {
        -      "description": "Execute payload projected against the capability's declared output schema. Same value as receipt.data, and the same location the native /mcp surface publishes."
        -    },
        -    "deprecation": {
        -      "type": "object"
        -    },
        -    "domain": {
        -      "type": "string"
        -    },
        -    "domains": {
        -      "description": "Bounded domain list on a catalog-level describe.",
        -      "type": "array"
        -    },
        -    "drillDown": {
        -      "description": "Example nextCall payload to drill one level deeper.",
        -      "type": "object"
        -    },
        -    "error": {
        -      "type": "string"
        -    },
        -    "errorCode": {
        -      "type": "string"
        -    },
        -    "families": {
        -      "description": "Bounded family list on a domain-level describe.",
        -      "type": "array"
        -    },
        -    "family": {
        -      "type": "string"
        -    },
        -    "filters": {
        -      "description": "Filters applied to this search.",
        -      "type": "object"
        -    },
        -    "hasMore": {
        -      "type": "boolean"
        -    },
        -    "hashes": {
        -      "description": "Per-record schema and content hashes from the generated catalog.",
        -      "type": "object"
        -    },
        -    "inputSchema": {
        -      "description": "Exact input schema of the described capability. Never a parent-tool union.",
        -      "type": "object"
        -    },
        -    "limit": {
        -      "type": "integer"
        -    },
        -    "maxBytes": {
        -      "type": "integer"
        -    },
        -    "message": {
        -      "type": "string"
        -    },
        -    "migratedFrom": {
        -      "description": "Legacy tool/action pair that resolved to this capability.",
        -      "type": "object"
        -    },
        -    "nextCall": {
        -      "description": "Directly-invokable gateway request for guided self-correction.",
        -      "type": "object"
        -    },
        -    "nextCursor": {
        -      "description": "Cursor to pass back as cursor to continue a search.",
        -      "type": "string"
        -    },
        -    "offset": {
        -      "type": "integer"
        -    },
        -    "operation": {
        -      "type": "string"
        -    },
        -    "outputSchema": {
        -      "description": "Exact output schema of the described capability.",
        -      "type": "object"
        -    },
        -    "outputs": {
        -      "type": "array"
        -    },
        -    "param": {
        -      "type": "string"
        -    },
        -    "parameterCount": {
        -      "type": "integer"
        -    },
        -    "parameterHasMore": {
        -      "type": "boolean"
        -    },
        -    "parameterLimit": {
        -      "type": "integer"
        -    },
        -    "parameterOffset": {
        -      "type": "integer"
        -    },
        -    "parameters": {
        -      "description": "Paginated/filterable compact parameter catalog on tool+action describe.",
        -      "type": "array"
        -    },
        -    "parentTool": {
        -      "description": "Legacy parent tool that dispatches the described capability.",
        -      "type": "string"
        -    },
        -    "perActionSchemas": {
        -      "type": "boolean"
        -    },
        -    "policy": {
        -      "type": "object"
        -    },
        -    "reasons": {
        -      "type": "array"
        -    },
        -    "required": {
        -      "description": "Whether the described param is required.",
        -      "type": "boolean"
        -    },
        -    "resolvedFromAlias": {
        -      "description": "Declared alias that resolved to this capability.",
        -      "type": "string"
        -    },
        -    "result": {},
        -    "results": {
        -      "type": "array"
        -    },
        -    "runnable": {
        -      "description": "False when the capability cannot currently be executed; nextCall then points at the fix.",
        -      "type": "boolean"
        -    },
        -    "schema": {
        -      "description": "Full schema of the single described param.",
        -      "type": "object"
        -    },
        -    "scope": {
        -      "description": "Catalog scope: 'tool' for a tool summary, 'union' for the tool-union parameter catalog.",
        -      "type": "string"
        -    },
        -    "success": {
        -      "type": "boolean"
        -    },
        -    "suggestions": {
        -      "description": "Closest-match names for an invalid tool/action/param call.",
        -      "type": "array"
        -    },
        -    "tool": {
        -      "type": "string"
        -    },
        -    "total": {
        -      "type": "integer"
        -    },
        -    "truncated": {
        -      "description": "True when results were dropped to fit the byte budget.",
        -      "type": "boolean"
        -    }
        -  },
        -  "required": [
        -    "success",
        -    "operation"
        -  ],
        -  "type": "object"
        -}New value: +null
  2. 1 tool updatev0.5.30
    • First observedunreal

TDQS

D1.9/5.0

Scored across 1 tool

Disambiguation3/5

With only one tool there is no cross-tool ambiguity for an agent to resolve, which is a plus. However, that single tool multiplexes search, describe, execute, and configure operations behind an operation parameter, so the real ambiguity is pushed inside the tool rather than eliminated.

Naming Consistency3/5

The lone name 'unreal' is a plain lowercase noun with no verb_noun convention, so there is no pattern for an agent to learn or rely on. It is not inconsistent with anything, but it establishes no predictable convention for the eventual expanded surface.

Tool Count2/5

One placeholder tool is far too thin for something as broad as driving an Unreal Engine editor, and it forces every capability through a single generic entry point. The count is a deliberate stub, but as a shipped surface it is severely under-scoped.

Completeness2/5

The description explicitly states the editor has not been reached and the contract is a placeholder, so there is no real CRUD or lifecycle coverage to assess. Agents cannot depend on any concrete operation until the editor responds and replaces the tool.

Maintenance

ActivityNo data
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to control and automate Unreal Engine through a native C++ Automation Bridge plugin. It supports a comprehensive range of tasks including asset management, actor manipulation, editor control, and blueprint graph editing.
    1,312 npm
    1
    MIT
  • A
    license
    C
    quality
    D
    maintenance
    Enables natural language interaction with Unreal Engine, providing 127 tools across 16 subsystems for tasks like actor manipulation, asset management, blueprint creation, and more, using built-in Python and Remote Control plugins.
    100
    8
    MIT