esc
navigate openSearch by Pagefind

Discover, then drive

Ground on the live 4.7 API with the engine group, then act through typed or generic commands.

The commands deliberately do not hard-code the engine’s feature list. The design principle is version-agnostic access, introspection for discovery.

Introspection is the feature list

node.set / node.get for properties, node.call / runtime.call for methods, their runtime.* twins for the running game, and editor.run_script / runtime.eval for anything that needs several statements: all of them reflect whatever the running binary exposes. Any 4.7 (or later) feature surfaced as a property or a callable is reachable with no per-feature wrapper. The one remaining gap is discovery: an agent may not know a new feature’s name. That is what the engine group closes, by reading ClassDB from the live build.

Terminal window
# what members match a term, across every class?
godot-mcp engine search --query navigation_layer
# the full API of one class, optionally filtered
godot-mcp engine class-info --class CharacterBody3D --filter velocity
# registered singletons and global class_name scripts
godot-mcp engine singletons
godot-mcp engine script-classes

engine search matches by substring. On Godot 4.8+, a query that matches nothing is retried fuzzily, so a half-remembered abbreviation still lands: linvel reaches RigidBody2D.linear_velocity, glbpos reaches Node3D.global_position. The result’s match_mode reports which pass answered. On 4.7 there is no fuzzy pass, so widen to a real substring instead.

Read what it means

Structure answers what exists; the docs answer what it does. engine docs serves the running build’s own documentation prose, the same text as the editor’s Help panel, read from the editor’s doc cache. engine doc-search searches that prose by concept, for when you know the behavior you want but not the term:

Terminal window
# search the prose: "make text wrap" without knowing the property name
godot-mcp engine doc-search --query "wrap text"
# then read the meaning, class-level or one member
godot-mcp engine docs --class Label --member autowrap_mode
godot-mcp engine docs --class Node --member queue_free

Member lookup walks the inheritance chain (asking Sprite2D about queue_free finds Node’s), reaches annotations with or without the @ (export finds @export), and covers pages ClassDB has never held: @GlobalScope, @GDScript, and the Variant types. A name that only matches an enum returns that enum’s values, so engine docs --class @GlobalScope --member Key lists the key constants.

Then drive, generically or typed

With the name confirmed, act. There is usually a typed command, but the generic path always works:

Terminal window
# generic: works on any property the live node exposes
godot-mcp node set --node-path Player --property motion_mode --value 1
# arbitrary GDScript, editor-side or in the running game
godot-mcp editor run-script --code "print(ProjectSettings.get_setting('application/config/name'))"
Built with the help of godot-mcp. MIT licensed.