Unity MCP

One tool. The whole editor.

The agent writes a few lines of JavaScript with satura_exec: press Play, drive the game through your handles, record the run, hand you a Tuner. Every step is awaited until it's really done.

One tool, not 347

A narrow tool does one thing per round trip, and its schema rides along in every request. Satura Space registers one. The agent writes the body of an async function, and every call in it settles when the work is really done: Play entered, compile finished, video saved. One script compiles, plays, drives the game, films it and opens a report.

  • The agent presses Play and reads the console itself, so you stop pasting errors back.
  • One reply per script instead of one round trip per step, and no 347-tool schema in every request.
  • unity.exec reaches every Editor API and package you have, with no recompile or domain reload.
  • A modal dialog throws DialogBlocked in about a second instead of hanging, and unity.answer presses its button.
  • The same script opens a Tuner when a value needs your eye.

It's written into .mcp.json and the Claude Code, Cursor and Codex configs for you, with no API key. Other CLI agents still work in a normal shell.

Inside satura_exec

unity.*Editor state, C# through unity.exec with no domain reload, compile, Play and Stop, logs, screenshots, dialogs, and Unity's source and docs at your version.
handles.*List and call your [SaturaHandle] handles on one player or all of them.
video.* · report.*Record the Unity panel while part of the script runs, then open a report beside the terminal.
tuner.* · drift.*Open a Tuner on just the fields the agent picks, or have Drift fly to one and explain it.
scratchpad.*Create and run scratchpads, and copy assets in and out with their GUIDs.
env.* · page · app · agentsStage "never commit" files from Source Control, drive the app window, and start helper agents in new tabs.

What a script looks like

Each line waits for the one before it. Failures are exceptions the agent can branch on: CompileError, HandleError, DialogBlocked, UnityTimeout.

await unity.refresh()
await unity.play('Assets/Scenes/Pond.unity')
await handles.call('PrepareStageForFishTest')
const bite = await handles.call('WaitForBite', 10)
await unity.stop()
return bite.value

When a value needs your eye, the agent hands it over and ends its turn:

return await tuner.open({
  name: 'arena-lights',
  note: 'Balance the arena lights, then copy your changes to me',
  objects: [{ path: '**', components: [
    { type: 'Light', fields: ['m_Intensity', 'm_Color'] }
  ] }]
})

The reply is the return value plus each step with its time, the failed one marked. Scripts get no file access and run up to 300 seconds by default.

Straight answers

Questions.

Which agents get it automatically?

Claude Code, Codex and Cursor. Any MCP client can be pointed at it, and other CLI agents still work in a normal shell.

Why one tool and not a catalog?

Every tool's schema rides along in every request, and a narrow tool does one thing per round trip. With one tool the agent chains compile, Play, handles, video and a report in a single script and gets one reply.

Does my code leave my machine?

No. The server runs locally and everything rides local loopback. Crash reports are anonymous and scrubbed.

What if a modal dialog freezes the editor?

The call throws DialogBlocked in about a second instead of hanging. unity.dialogs() reads the dialog and unity.answer('Save') presses its button from outside the editor process.

Related

Give your agent the editor.

One tool, registered for you, on a Unity session that is already running.

7-day free trial (no card required)macOS & Windows