Configuration¶
MCP Client Configuration¶
The easiest way to configure UE-MCP is to run npx ue-mcp init — it detects your MCP clients and writes the config automatically.
Manual Configuration¶
{
"mcpServers": {
"ue-mcp": {
"command": "npx",
"args": ["ue-mcp", "C:/path/to/MyGame.uproject"]
}
}
}
Codex uses TOML instead:
[mcp_servers.ue-mcp]
command = "npx"
args = ["ue-mcp", "C:/path/to/MyGame.uproject"]
cwd = "C:/path/to"
enabled = true
Where to Put This¶
| Client | Config File |
|---|---|
| Claude Code | .mcp.json in project root, or ~/.claude/ global config |
| Claude Desktop | claude_desktop_config.json |
| Cursor | mcp.json in .cursor/ or project root |
| Codex | ~/.codex/config.toml |
Without a Project Path¶
You can start the server without a .uproject argument. It will run in a limited mode — you can then use project(action="set_project", projectPath="...") at runtime to attach to a project.
Project Configuration (ue-mcp.yml)¶
Project-level config lives under the ue-mcp: block at the top of ue-mcp.yml, next to your .uproject. The file is meant to be tracked in git so every collaborator sees the same project surface. npx ue-mcp init creates and maintains it for you, but hand-editing is fine — there's nothing in it the server treats as opaque machine state.
ue-mcp:
version: 1
contentRoots:
- /Game/
- /MyPlugin/
disable:
- gas
- networking
http:
enabled: false
tasks: {}
flows: {}
plugins: []
User-machine state
Anything that varies per machine (e.g. the list of absolute paths to Claude Code settings files where the feedback hook was installed) lives in ~/.ue-mcp/state.json, not in the project tree. The user-state file is maintained automatically by npx ue-mcp init / npx ue-mcp uninstall-hooks; you shouldn't need to touch it.
Migrating from older versions
- Pre-1.0.29 used
.ue-mcp.jsonfor the project config. - 1.0.29 briefly introduced
ue-mcp.local.ymlfor user-machine state, then moved that state to~/.ue-mcp/state.jsonin 1.0.30.
On first load after upgrade, the server detects either legacy file and migrates the contents (project fields → ue-mcp.yml, machine state → ~/.ue-mcp/state.json) automatically, then deletes the legacy file. You don't need to do anything.
ue-mcp: block options¶
| Key | Type | Default | Description |
|---|---|---|---|
version |
1 |
1 |
Schema version; required. Set automatically by init. |
contentRoots |
string[] |
["/Game/"] |
Content paths to search when using asset(action="search"). Add plugin content roots here if your project uses plugins with their own assets. |
disable |
string[] |
[] |
Tool categories to disable. Disabled categories are not registered with the MCP server, reducing context noise for the AI. Use "feedback" here to opt out of the feedback tool entirely. |
http |
object |
undefined (HTTP server off) |
Optional REST surface for the flow engine. Object with enabled (bool), port (default 7723), host (default 127.0.0.1). When enabled: true, the MCP server also serves GET /flows, GET /flows/<name>/plan, POST /flows/<name>/run, and the Server-Sent Events stream at GET /flows/events (live per-step lifecycle events; see Live Observation) over HTTP so external tools can drive and observe flows without an MCP client. |
The feedback approval mode (interactive / auto-approve / defer) is intentionally not in ue-mcp.yml — it varies per developer and per machine, so it lives in ~/.ue-mcp/state.json and is managed with npx ue-mcp feedback mode ... or the UE_MCP_FEEDBACK_MODE env var. See Feedback → modes.
User-machine state (~/.ue-mcp/)¶
Machine-specific state that ue-mcp commands write but you wouldn't hand-edit lives under ~/.ue-mcp/:
| Path | What |
|---|---|
~/.ue-mcp/state.json |
Two things: (a) per-project installedHooks — absolute paths of every Claude Code settings.json where ue-mcp installed the feedback PostToolUse hook, keyed by absolute project root; (b) preferences.feedback.mode — your personal default for the feedback approval mode (interactive / auto-approve / defer). Maintained by npx ue-mcp init, npx ue-mcp uninstall-hooks, and npx ue-mcp feedback mode. |
~/.ue-mcp/auth.json |
Cached GitHub OAuth token for feedback(submit) author=user mode. Mode 600. Written by npx ue-mcp auth. |
~/.ue-mcp/pending-feedback/<id>.json |
Submissions captured while feedback mode is defer. Acted on with npx ue-mcp feedback list/approve/discard. |
These files never need to be in your project tree or in version control.
Plugins¶
The plugins: array in ue-mcp.yml declares npm packages that inject new actions into existing built-in categories. The full author contract lives in Plugins; this is the consumer view.
plugins:
- name: pie-studio
- name: some-other-plugin
version: "0.2.x" # optional - npm semver range
At server start, ue-mcp resolves each entry against the project's node_modules/, validates the plugin manifest, and merges its injected actions into the host category tools. Stay-on-disk facts:
- The package must already be installed under
<project>/node_modules/. Useue-mcp plugin install <name>to add an entry and runnpm install --savein one step. - Plugins are loaded only when the server boots — edit the array and restart your MCP client (
/mcpin Claude Code). - A plugin that fails validation is skipped with a loud warning. Other plugins keep loading; the host tools are never partially mutated.
- Use the
pluginstool to introspect the loaded set: plugins(action="list")— name, version, prefix, status, injected count, host UE plugin presence.plugins(action="describe", name="<package>")— full detail including injected actions, knowledge files, and flows.
Order matters: earlier entries win on inter-plugin action-name collisions. A plugin action can never overwrite a built-in.
Host UE plugin dependencies¶
A plugin can declare uePluginDependency: <PluginName> in its ue-mcp.plugin.yml. The MCP server checks the project's .uproject for Plugins[].Name == "<PluginName>" and exposes the result as uePluginPresent in plugins(action="list"). The npm side loads regardless — the flag is a signal that the host UE plugin needs to be enabled before the injected actions will actually run.
For example, a plugin that declares uePluginDependency: SomePlugin will report uePluginPresent: false until SomePlugin is added to <Project>.uproject's Plugins array and the C++ modules are built.
Bridge Connection¶
The C++ plugin listens on ws://localhost:9877 (currently hardcoded). The MCP server auto-connects on startup and reconnects every 15 seconds if the connection drops.
Connection States¶
| State | Meaning |
|---|---|
| Connected | Bridge is active, all tools available |
| Disconnected | Editor not running or plugin not loaded. Filesystem tools still work (INI parsing, C++ headers, asset listing) |
| Reconnecting | Connection lost, auto-retry in progress |
Check the current state with project(action="get_status").
Plugin Deployment¶
On first run with a project path, the server automatically:
- Copies
plugin/ue_mcp_bridge/→<Project>/Plugins/UE_MCP_Bridge/ - Adds
UE_MCP_Bridgeto the.uprojectplugins list - Enables
PythonScriptPluginif not already enabled (needed forexecute_pythonescape hatch)
The plugin is editor-only and has no runtime footprint.
Plugin Dependencies¶
The C++ bridge plugin enables these UE plugins (adding them to .uproject if missing):
PythonScriptPlugin— foreditor(action="execute_python")EnhancedInput— for input action/mapping creationGameplayAbilities— for GAS toolsNiagara— for VFX toolsPCG— for procedural generation tools
CLI Subcommands¶
npx ue-mcp exposes a few utility subcommands beyond the default MCP server entry:
| Command | Description |
|---|---|
npx ue-mcp init |
Interactive setup wizard. Deploys the C++ bridge plugin, writes MCP client configs, scaffolds ue-mcp.yml, optionally installs Claude Code skills + feedback prompt hook, optionally runs the GitHub OAuth device flow. Migrates any legacy .ue-mcp.json / ue-mcp.local.yml it finds. |
npx ue-mcp update |
Check npm for the latest version and install it. Pass --deploy to also redeploy the plugin sources. |
npx ue-mcp deploy |
Copy the C++ bridge plugin sources into the project. Use after ue-mcp update or to force a redeploy. |
npx ue-mcp build |
Build the project C++ code using Unreal Build Tool. Stop the editor first. |
npx ue-mcp auth |
Run the GitHub device flow standalone so feedback(submit) can author issues as your real GitHub user. Same step that lives inside init; use this if you skipped it at init time. |
npx ue-mcp uninstall-hooks |
Remove the feedback PostToolUse hook from every Claude Code settings file recorded for this project in ~/.ue-mcp/state.json. |
npx ue-mcp feedback mode [<mode>] |
Read or set your personal feedback approval mode (interactive, auto-approve, or defer). Stored in ~/.ue-mcp/state.json. See Feedback → modes. |
npx ue-mcp feedback list \| show \| approve \| discard \| review |
Manage submissions queued while feedback mode is defer. review (experimental) walks the queue interactively (approve/discard/skip per item). See Feedback → Reviewing deferred submissions. |
npx ue-mcp resolve <issue> |
Fetch a feedback issue, branch, hand it to Claude Code to implement, open a PR. See Feedback. |
npx ue-mcp plugin install <name> |
Install a ue-mcp plugin from npm and register it in ue-mcp.yml. See Configuration → Plugins. |
npx ue-mcp plugin uninstall <name> |
Inverse of install. |
npx ue-mcp plugin create <name> |
Scaffold a new plugin package. See Plugins. |
Editor Lifecycle¶
The server can manage the editor process:
| Command | Description |
|---|---|
editor(action="start_editor") |
Launch UE with the current project |
editor(action="stop_editor") |
Gracefully stop the editor |
editor(action="restart_editor") |
Stop and relaunch |
editor(action="build_project") |
Build the project C++ code via UBT |