MCP in Unreal Engine
Unreal Engine now has a first-party, in-editor MCP server that lets AI agents drive the editor. This page tracks the current state: what it does, how to set it up, how to author your own tools, and where the limits and security caveats are.

Unreal Engine now has a first-party MCP server built into the editor. With one plugin enabled, any MCP-compatible AI agent — Claude Code, Cursor, VS Code, Gemini, Codex, or the MCP Inspector — can drive the editor over a local connection: spawn actors, set up lighting, create material instances, inspect Slate widgets, run automation tests, and call any custom tool a studio chooses to expose.
This page tracks the current state of the Model Context Protocol in Unreal — what works, how to use it, and where the limits are. The official server arrived as an Experimental feature in Unreal Engine 5.8; before that, the only options were community plugins. It is the first time a AAA engine ships MCP support from the engine maker itself (Unity and Blender still rely on community integrations). It is loopback-only and not for production pipelines — but as a signal about where engine tooling is heading, it is hard to overstate.
Unreal MCP is an MCP server built into the Unreal Editor. It exposes editor actions — spawning actors, configuring lighting, creating materials, running tests, and more — as callable “tools,” so any MCP-compatible AI agent can perform them on your behalf over a local connection.
Epic's reference for the plugin is Unreal MCP in Unreal Editor. It is the authoritative source for setup, console commands, and configuration, and the basis for this page.
The plugin's friendly name in the Plugin Browser is Unreal MCP. Its identifier across the source tree, .uplugin files, C++ symbols, and console commands is ModelContextProtocol. The server advertised name is always unreal-mcp.
What is the Model Context Protocol?
The Model Context Protocol (MCP) is an open specification (published at modelcontextprotocol.io) that standardizes how an AI client talks to an external tool over a small set of JSON-RPC messages such as initialize, tools/list, and tools/call. A server advertises three kinds of primitives:
- Tools — named functions the client can call, with typed parameters and return values.
- Resources — read-only data the client fetches by URI.
- Prompts — reusable prompt templates.
Unreal MCP is an MCP server: it advertises Tools backed by Unreal Engine functionality and accepts connections from any client that speaks the protocol. The server runs inside the editor process. A key part of its job is to marshal incoming requests onto the Unreal game thread, executing Tool calls serially — which is why clients should not issue overlapping calls.
Crucially, MCP is the same protocol already wiring AI assistants to IDEs, CI/CD systems, and data platforms. Unreal speaking it natively means the engine plugs into that ecosystem with no bespoke glue.
What can the Unreal MCP server actually do?
The plugin exposes engine functionality as Tools that an agent invokes on your behalf. Out of the box that includes operations such as:
- Spawning actors and placing objects in a scene.
- Configuring lighting sources, parameters, and intensities.
- Creating and modifying material instances.
- Inspecting Slate UI widgets.
- Running automation tests.
The shipped toolsets — for example SceneTools, ActorTools, MaterialInstanceTools, and ObjectTools — are mostly authored in Python and live inside the Toolset Registry plugin. They cover a broad slice of core systems (actors, assets, levels, materials, meshes, and more), and the set will grow as the feature matures.
The most important capability, though, is extensibility. The interesting productivity gains do not come from the built-in tools but from wrapping your studio-specific operations — asset import pipelines, validation rules, scene conventions — as Tools an agent can call. See Authoring custom tools.
The value is not the AI driving the editor by itself. The value is in defining a controlled model around it: which operations you expose as tools, what each tool is allowed to touch, how it is described to the agent, and which outputs a human reviews. The built-in tools are a starting point; the leverage comes from your own toolsets.
A good first test once connected is to ask the agent something simple to confirm context is flowing, like “What actors do I have selected?” or “Spawn a directional light and set its intensity.”
How do you set it up?
Setup is short for anyone already on a version with the plugin (Unreal Engine 5.8 and later):
Enable the plugin
Open
Edit > Plugins, search for Unreal MCP, tick Enabled, and restart the editor when prompted. The dependent Toolset Registry plugin is enabled automatically.Configure auto-start
Open
Edit > Editor Preferences > General > Model Context Protocoland turn on Auto Start Server. The server then starts on every editor launch and binds tohttp://127.0.0.1:8000/mcp. The same panel exposes the port (default8000) and URL path (default/mcp).To start it on demand instead, leave auto-start off and run
ModelContextProtocol.StartServer(optionally with a port) in the editor console.Generate a client config
From the editor console (backtick key) run the generator for your agent, for example:
ModelContextProtocol.GenerateClientConfig ClaudeCodeThis writes
.mcp.jsonto the project root pointing at the running server. Supported client names areClaudeCode,Cursor,VSCode,Gemini,Codex, andAll. The generated file for Claude Code looks like this:{ "mcpServers": { "unreal-mcp": { "type": "http", "url": "http://127.0.0.1:8000/mcp" } } }JSON configs (Claude Code, Cursor, VS Code, Gemini) are merged with existing entries, so re-running is safe. The Codex TOML config is write-once — remove a stale file by hand before regenerating.
Connect your agent
Launch your AI agent CLI or app from the project/workspace root where the config was written — this is the most common reason an agent fails to find the server. If it still does not connect, start the editor first (confirm the server started in the Output Log), then launch the agent.
Optional: stay inside the editor
The Terminal plugin embeds a shell panel in the editor and can run startup commands automatically. Combined with Unreal MCP, you can run the whole agent workflow in one window. Set
TERM=xterm-256colorfirst (otherwise CLIs likeclaudefall back to a degraded mode), thencdexplicitly to where.mcp.jsonlives — the panel starts inFPaths::RootDir(), which is not always the same folder.
Toolsets, the registry, and Tool Search
The plugin does not hard-code its tools. It queries the Toolset Registry, an engine subsystem provided by a sibling plugin. A Toolset is a class deriving from UToolsetDefinition (C++) or unreal.ToolsetDefinition (Python) that groups related Tools. The registry collects every such class at startup, Unreal MCP wraps each one as an MCP Tool, and the registry is also consumed by other AI surfaces in the engine — so a toolset authored for MCP works unmodified elsewhere.
By default the server runs in Tool Search mode (bEnableToolSearch = true). Instead of dumping every Tool schema into tools/list, it returns three discovery meta-tools so payloads stay small even with hundreds of Tools:
list_toolsets— returns available toolset names and descriptions.describe_toolset— returns the schemas for a named toolset.call_tool— dispatches a named toolset's Tool and returns the result on the same turn.
The agent walks this path on demand. Turning the setting off advertises every Tool eagerly, at the cost of a much larger initial payload. Tool authors should not assume eager advertising — the search path is what a connecting agent sees by default.
How do you author your own MCP tools?
There are two routes. The first fits nearly every case; the second is for advanced, dynamic tools.
Recommended: the Toolset Registry
Write a class that derives from ToolsetDefinition and group related Tools on it. Both Python and C++ are first-class.
In Python
Python toolsets are .py modules under any plugin's Content/Python/ directory; the registry discovers them at startup. A minimal toolset looks like this:
import unreal
import toolset_registry
from toolset_registry.toolsets.core.utils import require_editable
@unreal.uclass()
class ActorTools(unreal.ToolsetDefinition):
"""Provides tools for inspecting and modifying actors, including
their transforms, labels, parent-child relationships, and
components."""
@staticmethod
@toolset_registry.tool_call
def set_actor_label(actor: unreal.Actor, label: str) -> bool:
"""Rename an actor in the level.
Args:
actor: The actor to rename.
label: The new display label.
Returns:
True on success.
"""
require_editable()
actor.set_actor_label(label)
return TrueConventions that matter:
@unreal.uclass()exposes the class to reflection; it inherits fromunreal.ToolsetDefinition.- The class docstring becomes the toolset's grouping description.
- Each Tool function carries
@toolset_registry.tool_calland is a@staticmethod. Functions without the decorator are not advertised. - Parameter and return type hints drive the JSON Schema the Tool advertises.
- The Google-style docstring (
Args:/Returns:) is reflected into the schema — write it as carefully as any public API.
In C++
Same pattern, different syntax: derive from UToolsetDefinition, mark the class UCLASS(BlueprintType, Hidden), and expose static UFUNCTION(meta = (AICallable)) methods. Doc comments on the function and each parameter feed the schema. Reach for C++ when a Tool needs engine functionality not exposed to Python, uses USTRUCT or other reflected types that do not map cleanly to Python hints, or sits in a hot path where the Python-to-engine boundary cost matters.
After authoring
Run ModelContextProtocol.RefreshTools to force a re-poll. For C++, Live Coding picks up changed function bodies, but adding a new UFUNCTION requires a full editor restart. To hide a function inside a toolset, omit @toolset_registry.tool_call (Python) or add meta = (AIIgnore) (C++).
Advanced: direct registration
When schemas are decided at runtime, or Tools come and go dynamically, implement IModelContextProtocolTool and register it directly:
TSharedRef<IModelContextProtocolTool> Tool = MakeShared<FMyDynamicTool>();
IModelContextProtocolModule::GetChecked().AddTool(Tool);The caller owns deregistration. As with registry tools, interface methods are invoked on the game thread.
Design guidance: keep each Tool small and single-purpose, prefer descriptive names and structured return types over free-form strings (structured types serialize to a typed JSON Schema; raw strings force the client to parse them), and write descriptions the way you would document a public API.
Configuration reference
Editor Preferences → Model Context Protocol
- Auto Start Server (default
false) — start the server on editor launch. - Server Port Number (default
8000) — port bound on127.0.0.1. - Server URL Path (default
/mcp) — path the server serves under. - Enable Tool Search (default
true) — return the three discovery meta-tools instead of every Tool schema.
Console commands
ModelContextProtocol.StartServer [port]— start the server, optionally overriding the port.ModelContextProtocol.StopServer— stop the server and close all sessions.ModelContextProtocol.RefreshTools— re-poll tool providers after authoring or hot-reloading.ModelContextProtocol.GenerateClientConfig <Client|All>— generate a client config in the project root.
Command-line flags
-ModelContextProtocolStartServer— start during editor/commandlet startup regardless of the auto-start setting.-ModelContextProtocolPort=N— override the listening port (1–65535).
Debugging
The server logs its bind address, port, and path to the Output Log at startup — the first place to check if it seems down. All output flows through the LogModelContextProtocol category (raise verbosity with Log LogModelContextProtocol Verbose). For protocol-level problems, point the official MCP Inspector (npx @modelcontextprotocol/inspector) at http://127.0.0.1:8000/mcp over the Streamable HTTP transport; it lists every advertised Tool with its schema and lets you invoke Tools directly, bypassing the agent's interpretation.
What are the limits and security caveats?
The server is an Experimental feature. Many features are incomplete, and APIs and data formats can change at any time. Treat it as a development-workflow tool, not a production pipeline.
The server has no authentication layer and is intended for loopback use only. It rejects non-loopback Origin headers, but you should still never forward the port or expose it on a shared machine. Anyone who can reach it can drive your editor.
- Transport: HTTP and Server-Sent Events only. No
stdioor WebSocket. - Loopback only, no auth: the listener binds to localhost and rejects non-loopback
Originheaders. There is no authentication layer — do not expose it beyond the local machine. - No Resources or Prompts: no shipping toolset advertises MCP Resources or Prompts; only Tools.
- Serial execution: Tool calls run one at a time on the game thread — clients must not issue overlapping calls.
- Editor-only registry: the Toolset Registry adapter is editor-only. Cooked/shipping builds can host a server via
IModelContextProtocolModule::StartServer(), but registry tools are not auto-discovered there — they must be added explicitly withAddTool(). - Live Coding gap: new
UFUNCTIONdeclarations are not propagated; adding a Tool requires an editor restart.
Why this matters more than a checkbox in the release notes
Game engines are an extreme case of tool complexity: multi-format assets, stateful 3D scenes, thousands of interconnected systems, and workflows that do not map cleanly onto text. MCP began as a way to connect AI assistants to developer tools and spread to CI/CD, API gateways, and data platforms. Unreal marks its arrival in creative software at AAA scale — and the first time an engine vendor ships it first-party rather than leaving it to the community.
If the protocol works well here, its expansion into other 3D DCC tools and creative suites becomes a realistic near-term outcome. There are already community Unreal MCP servers (such as bridge plugins built on the C++ Automation system) that predate the official one; the difference now is a supported, in-engine baseline everyone can target.
One distinction worth keeping clear
Around the same time, Epic previewed generative-AI asset creation plans for a future engine version, which drew significant community pushback. It is worth not conflating the two. The MCP server is a developer-control tool: it gives an agent structured access to editor operations so you can automate tedious work — you remain in the loop and review every action. Generative asset creation is a different proposition that delegates creative decisions to a model. The audience concerned about the latter is not necessarily the audience that wants to configure lighting from a prompt.
Current state, in one paragraph
MCP in Unreal is real, official, and usable today (the in-editor server shipped as an Experimental feature in 5.8) — but still explicitly experimental, localhost-only, unauthenticated, and Tools-only. The built-in toolsets cover core editor operations; the genuine value is in authoring your own toolsets in Python or C++ to wrap studio-specific workflows. The fastest way to form your own opinion is to enable the plugin, generate a config, connect Claude Code or the MCP Inspector, and ask the agent to spawn a light and set its intensity. From there, wrapping one repetitive in-house operation as a custom Tool is where the productivity case proves itself.
For deeper reference while you build, start with the official Unreal MCP documentation and the MCP specification.

