godot-mcp-native · v2.0.0 · MIT · Windows · macOS · Linux

A native MCP server that reaches into a running Godot editor.

Didi is a C++20 Model Context Protocol server for Godot 4.5+. A standalone binary speaks MCP to your assistant, a GDExtension speaks Godot inside the editor, and between them is a local named pipe rather than a network. Live scene objects, native undo history, real pixels, and an honest implemented: false wherever it cannot execute.

How it works

The mark is the architecture.

A node enters a ring through a pipe. That is the whole request path: an MCP client, a local named pipe or Unix socket, and the live Godot scene it reaches into. Left to right is the direction of every call.

nodeyour assistant pipedidi · local IPC ringthe live Godot scene JSON-RPC 2.0 over stdio, then an authenticated process-unique endpoint

Node · the client

Your assistant

Claude Code, Claude Desktop, Cursor, VS Code, Windsurf or Antigravity launches didi and speaks MCP over stdio. Every definition carries specification annotations and _meta.didi execution metadata, so a client can see whether a tool is live, offline, unavailable or unimplemented before it calls.

Pipe · the bridge

Didi

One C++20 binary, didi or didi.exe: the JSON-RPC dispatcher, the registry of 116 canonical tools, godot:// resources and prompt workflows, and an offline engine that parses GDScript and .tscn files when no editor is running. It reaches the editor over an authenticated, process-unique local IPC endpoint.

Ring · the scene

Godot 4.5+

The Didi GDExtension inside the editor dispatches on the main thread through EditorInterface, edits the live SceneTree through EditorUndoRedoManager, and captures the real viewport as PNG. A running game publishes a session the same way, with its own smaller set of live tools.

Why Didi

Native, local, and explicit about what it can actually execute.

Most bridges into Godot either drive the command line, which cannot see the editor, or chain a Node.js process, a WebSocket and a plugin, which can. Didi is the plugin and the server in one native binary each, with nothing between them but a pipe.

FeatureScript and CLI wrappersMulti-hop network bridgesDidi
Execution topologyOffline CLI subprocessesNode.js, WebSocket and a C# pluginDirect C++ GDExtension plus a standalone binary
In-memory scene accessBlind to live editor stateDepends on the bridgeDirect Godot objects for every live tool
Undo and redo safetyNone; files are overwrittenVariesNative EditorUndoRedoManager transactions
Visual inspectionNoneOften needs an exportLive editor PNG capture, node isolation, exact pixel diffs
TransportA process start per callNetwork or a multi-process bridgeLocal named pipe or Unix socket
External dependenciesNode.js or Python runtimeNode.js runtime plus WebSocketsNone at runtime

Platforms

Windows, macOS and Linux.

Every release ships a built archive for all three, with checksums and build provenance, and every push builds Didi and runs the suites on all three. The live editor harness runs on Windows in CI, so that is where Didi has the most hours behind it, and the other two are where a tester is worth the most.

Windows x64

didi-windows-x64.zip · didi.exe

MSVC build, the native and Python suites, and the live Godot editor harness on 4.5.1, 4.6.2 and 4.7.2, on every push. The platform Didi is developed on.

Linux x64

didi-linux-x64.tar.gz · didi

gcc build, the suites, and an ASan and UBSan run on every push. The archive is built in an Ubuntu 22.04 container so it runs on older glibc. No live editor run in CI yet.

macOS Apple silicon

didi-macos-arm64.tar.gz · didi

clang build and the suites on every push. No Intel archive, and no live editor run in CI yet.

Testers wanted on macOS and Linux

Those are the least-tested platforms. If you run Didi there, tell us how it went, good or bad: the Godot version, the client, and what the Didi tab's Diagnostics page reported. Every run is evidence CI does not have.

Report a run

The surface

116 canonical tools across fourteen domains.

The canonical names are the stable protocol surface; 10 legacy names are registered beside them for older clients, 126 entries in tools/list. Availability is stated per definition rather than implied by a name.

Scene tree and nodes 7

scene_get_hierarchy · scene_instantiate_node · scene_remove_node · scene_reparent_node · scene_set_property · scene_get_property · scene_duplicate_node

Live against the edited scene. The hierarchy also has an offline .tscn fallback.

Signals and events 4

signal_list_connections · signal_connect · signal_disconnect · signal_emit

Connect and disconnect land in the scene's undo history. Emit requires confirmation.

Scripting and reflection 4

script_check_syntax · script_reflect_class · script_get_symbols · script_patch_method

Offline and file-based. Reflection covers every engine class from the pinned Godot API dump.

Vision and render 5

viewport_capture_frame · viewport_diff_capture · viewport_set_camera_transform · viewport_create_test_lab · viewport_toggle_debug_draw

Real editor pixels with a process-local capture ID, reversible node isolation, and exact RGBA diffs.

Physics and navigation 6

physics_raycast_query · physics_simulate_step · nav_bake_mesh · nav_query_path · anim_list_tracks · anim_play_track

Raycasts and path queries run against the existing worlds in the editor or a game. Stepping and baking are API-blocked and say so.

Tilemaps and GridMaps 3

tilemap_set_cells · tilemap_get_used_rect · gridmap_set_cells

Editor-only batch editing: the whole request is preflighted, then applied as one undo action.

Resources and files 9

resource_create · resource_inspect · project_list_resources · project_get_uid_map · project_audit_assets · project_analyze_impact · project_search_text · project_search_symbols · asset_reimport

Bounded offline search, impact analysis and import health. Reimport is editor-only and waits for a stable idle editor.

Runtime and debug 4

runtime_launch · runtime_inject_input · runtime_get_call_stack · runtime_read_profiler

Bounded child launches, explicit press and release events into a game, live Performance monitors. The call stack is API-blocked.

Editor lifecycle 4

editor_undo · editor_redo · editor_save_scene · editor_reload_project

Live. Reload asks the editor for a resource-filesystem rescan rather than restarting anything.

Project wiring 18

script attach and detach · autoloads · InputMap · settings · groups · scene create, open, close and pack

Live with undo history, atomic ProjectSettings writes, overwrite guards and normalized res:// paths.

Runtime sessions 10

runtime_list_sessions · attach, detach, get · logs and output · pause, step, stop, tree · eval_gdscript

Attachment is deterministic or explicit and always authenticated. Evaluation is a strict read-only expression subset, not arbitrary GDScript.

Deep domains 6

csharp_check_build · shader_check_compile · project_list_export_presets · project_export · gridmap_export_mesh_library · ui_hit_test

Bounded subprocesses with no shell, per-request deadlines, a 1 MiB output cap and project-contained output paths.

Agent coordination 10

blackboard_write · blackboard_read · blackboard_patch · blackboard_list_keys · blackboard_clear · blackboard_task_create, claim, update, complete, list

File-backed under .didi/blackboard/ with an exclusive OS lock per operation and expiring leases, so two agents racing for one task produce a single winner.

Managed recovery 4

runtime_recovery_status · runtime_checkpoint · runtime_recover_editor · runtime_restore_checkpoint

Opt-in owned editor, a separate project copy, saved-file checkpoints, one automatic restart, confirmed restore.

Resources and prompts

godot://project/tree · godot://editor/state · runtime logs · prompt workflows

Dynamic resources for the project tree and editor state, plus prompt templates an agent can follow. Resources and prompts.

Honest by construction

113 of the 116 canonical names are implemented in at least one mode. The remaining 3 are registered so the surface is stable, carry implemented: false, and return a tool error when called. Nothing pretends. The three are blocked by the engine API, and the evidence for that is public.

  • physics_simulate_step
  • nav_bake_mesh
  • runtime_get_call_stack

Read the metadata, not the name

Every definition in tools/list says how it runs right now: executionModes, implemented, currentMode, liveAvailable, editorConnected and the selected sessionKind. A tool with no editor behind it reports unavailable, and a tool with an offline path reports offline_fallback only when a live call would have been better.

Current capability matrix · Tool reference · Feasibility evidence

Safety

An agent with real access needs real brakes.

Didi edits the project that is open in front of you. So every mutation can be previewed, the dangerous ones need a token the preview issued, and the person at the editor can undo what the agent did.

An explicit project, always

Didi refuses to start without --project or DIDI_PROJECT_ROOT, and the directory must contain project.godot. Endpoint names carry a stable project key.

One client per session

A per-session OS lock admits one MCP client at a time and is released when that client exits. The blackboard tools are how separate agents share decisions instead.

Dry-run on every mutation

Every implemented mutation advertises dry_run and answers with a handler-free change plan bound to the exact project and live route.

Confirmation tokens

Always-confirmed and overwrite-confirmed tools need the 64-hex, 120-second, single-use confirmation_token that the exact preview returned.

Native undo

Scene mutations register with the edited scene's EditorUndoRedoManager history. Ctrl+Z in the editor works on what the agent did.

Annotations that mean it

readOnlyHint, destructiveHint, idempotentHint and openWorldHint on every definition, with the managed-mode restart caveat stated rather than hidden.

Bounded live work

A 15-second main-thread deadline. Work that never started says not_started; work that started and did not resolve says unknown_outcome and quarantines the route, so nothing blindly retries a mutation.

Authenticated local IPC

A process-unique endpoint, owner-only session descriptors, and a session ID bound to PID plus process start time. Public responses never include the token.

Crash recovery, opt in

Start with --managed-editor and --recovery-workspace and Didi edits a separate project copy, checkpoints saved files, and can restart its owned editor once without replaying an uncertain edit.

Setup

Sixty seconds, three steps.

Build the binary and the addon together, enable the plugin, point your assistant at the binary. The in-editor console generates the third step for you with the binary already located. The full quickstart covers each client by hand, and the release page has built archives for Windows, Linux and macOS with checksums and build provenance.

Step 1 · build

# Release binary and the complete addon, assembled under build/
git clone https://github.com/saworbit/didi.git
cd didi
cmake -B build -S .
cmake --build build --config Release

On Windows this produces build/Release/didi.exe and build/addons/didi/ with the extension library inside it.

Step 2 · enable

your_game/
├── addons/
│   └── didi/          ← copy build/addons/didi here
│       ├── plugin.cfg
│       ├── didi.gdextension
│       └── bin/
└── project.godot

Open the project, then Project → Project Settings → Plugins and enable Didi Native MCP Bridge. A Didi tab appears beside 2D, 3D and Script.

Step 3 · connect

{
  "mcpServers": {
    "didi": {
      "command": "D:/didi/build/Release/didi.exe",
      "args": ["--project", "D:/my_game"]
    }
  }
}

Into claude_desktop_config.json, .cursor/mcp.json or your client's equivalent. Or open the Didi tab's Connect page and copy the generated one.

In the editor

Can my assistant reach this project right now?

Enabling the plugin adds a Didi main screen to the editor. It answers the question every bridge raises first, without anyone reading a log: six cards, each with a red, amber or green light, the fact behind it, and the one thing to do about it.

Switches that do something

Live bridge opens and closes the bridge for real, loading and unloading the extension and reporting the status Godot returns, including the one that means "not without a restart". Auto refresh re-reads state on a timer. Technical detail reveals the session id, the endpoint, the descriptor path and the other sessions on the machine.

The other four tabs

Connect generates the launch configuration for Claude Code, Cursor, Claude Desktop and VS Code, and can write it into the project. Log shows the console's own record and Godot's log for the last run, filterable by level and text. Settings lives in your editor's EditorSettings, where nothing in the project can change it. Diagnostics names the path or pid behind every check and copies into an issue. The console never displays, copies or reports a session token.

Documentation

Every page, grouped by what you came for.

The documentation lives in the repository so it is versioned with the code it describes. The index lists every page, including the design records and their status.

Start here

What Didi does today

How it works

  • ArchitectureThe C++20 design, the dual topology, threading, and the IPC transport.
  • API and wire protocolJSON-RPC 2.0 over the wire and the binary frame format.
  • AdministrationDACL hardening, headless CI, observability, troubleshooting.
  • Developer guideBuilding from source, the test suites, and adding a tool.
  • Test inventoryGenerated. What each suite contains and how many cases it runs.

Where it is going

The project

  • ChangelogVersion history, and what a version number does and does not promise.
  • Security policySupported release line, the local attachment boundary, private reporting.
  • ContributingBuild, test and review expectations for a change you want merged.
  • On the use of AIWhere AI was used, what checks it, and who is responsible when it is wrong.
  • Third-party codeThe vendored sources no package manager resolves.