Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Godot MCP Loop

NPM · GODOT-MCP-LOOP

Drive a live Godot 4 editor: edit scenes and scripts, run and test the game, record GIFs.

Available components

+3 this week 86 Trust /100

Last scanned (22 hours ago)

Scores higher than 90% of npm servers

Category Entertainment and Games

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 30 of 94 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to AI-osho/godot-mcp-loop). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 1 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability67
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 6232 tokens (~152/item across 41 items; 41 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management50
  • Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage97
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 92% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

  • 28 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 23 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 21 Oct 26 +16
    • Malware scan: unverified → pass ▲ security
    • Stability: unverified → 0.03 ▲ functional
  • 20 Oct 26 64

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed npm/godot-mcp-loop@0.9.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo AI-osho/godot-mcp-loop
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/AI-osho/godot-mcp-loop/.github/workflows/release.yml@refs/tags/v0.9.0
Rekor log index 3333869467
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:020cc5f7389a56bc4fd661cf838a1e8cca29f40760513aa5a8a7845f1a0a75cdfe22b4b840ff021cb60d322b480ebc20a37efad0047236dbf033ab842

Background: How many MCP packages publish verified provenance →

Dependencies 94 packages
Packages resolved 94
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 41 exposed · ~6,043 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
edit_undo ~62

Undo the most recent edits made through this MCP server (node, property, script changes), newest first. Stops without touching anything if a human made a later edit in the same history.

NameTypeReqDescription
stepsinteger–How many actions to undo (default 1).

No output schema declared.

No examples provided.

editor_launch ~170

Open the Godot editor on the current project and wait until the MCP Loop bridge answers, then return the same fields as godot_status. Does nothing when an editor already runs for the project. Godot is found from the server's --godot / GODOT_BIN, else PATH and the usual install folders (4.5+ required). The project needs the MCP Loop addon installed and enabled. headless: true opens it without a window (no screenshots; for servers and CI). The editor keeps running after the server stops; editor_quit closes editors opened here.

NameTypeReqDescription
headlessboolean–Start the editor without a window (default false).
timeout_msinteger–How long to wait for the bridge (default 120000; the first open of a project imports every asset).

No output schema declared.

No examples provided.

editor_quit ~114

Close the Godot editor of the current project — only one this server opened with editor_launch (an editor the user opened is refused with EDITOR_NOT_LAUNCHED). Stops a running game, saves the open scenes unless save: false, quits, and waits for the process to end (stopped with SIGTERM after timeout_ms).

NameTypeReqDescription
saveboolean–Save all open scenes first (default true).
timeout_msinteger–How long to wait for the editor to exit (default 20000).

No output schema declared.

No examples provided.

file_write ~171

Create, overwrite or partially edit a text file in the project: .yaml/.yml (e.g. scenarios), .json, .md, .txt, .csv. Give 'content' for the whole file or 'edits' (exact replacements, like script_edit). YAML syntax is checked before writing and scenario files are validated (warnings); JSON must parse. Undoable with edit_undo. Use script_write for .gd files.

NameTypeReqDescription
contentstring–Full file content (creates or overwrites).
dry_runboolean–Preview only: validate and return the diff without writing.
editsarray–Exact text replacements applied in order to the existing file.
pathstringyesres:// path, e.g. 'res://tests/scenarios/jump.yaml'.

No output schema declared.

No examples provided.

game_call ~136

Call a method on a node in the running game (e.g. a test hook such as restart() or spawn_wave(3)) and return its result. Arguments are converted to the declared parameter types; coroutines are awaited.

NameTypeReqDescription
argsarray–Positional arguments.
methodstringyesMethod name.
nodestring–Node in the running game: relative to the running scene (e.g. 'Player') or absolute (e.g. '/root/Main/Player'). Default: the running scene root.
timeout_msinteger–How long to wait for the result. Default 10000.

No output schema declared.

No examples provided.

game_contacts ~87

List a RigidBody3D's contact points, normals and the bodies they touch (contact_monitor must be on), so grounding can be read instead of inferred from a picture.

NameTypeReqDescription
nodestringyesNode in the running game: relative to the running scene (e.g. 'Player') or absolute (e.g. '/root/Main/Player'). A RigidBody3D.

No output schema declared.

No examples provided.

game_in_view ~119

Check whether a Node3D is inside the camera's view (not behind it, projected inside the viewport) and where it lands on screen — the 3D judgement that otherwise needs a screenshot.

NameTypeReqDescription
camerastring–Camera3D to use; default the active 3D camera.
nodestring–Node in the running game: relative to the running scene (e.g. 'Player') or absolute (e.g. '/root/Main/Player'). Default: the running scene root (must be a Node3D).

No output schema declared.

No examples provided.

game_input ~303

Play a sequence of input steps in the running game (actions, keys, mouse), in order and with real timing; hold_frames/wait_frames count physics frames for deterministic timing. Inline set/call/assert/wait_for steps run inside the game between inputs with no time passing, so one call can set up, act and check (a failing step aborts and releases held input). Returns when the whole sequence has finished. To observe something brief (e.g. the top of a jump), pass 'record': the properties are sampled every frame while the steps run, and min/max (with times) are returned. min/max are computed from every recorded frame (up to 3000 frames); only the returned sample list is thinned to 50 entries, so interval_ms is not needed for accuracy. Add a final {wait_ms} step to keep recording after the input ends. Set pause_at_end to leave the game paused when the sequence finishes, so the next call measures the state the input left behind instead of a later one.

NameTypeReqDescription
pause_at_endboolean–Pause the game when the sequence finishes (default false). The response says paused: true.
recordobject–Sample node properties during the sequence. Returns summary {min, max, min_at_ms, max_at_ms, first, last} over every recorded frame, samples_total, and an evenly thinned list of at most 50 samples.
stepsarrayyes–

No output schema declared.

No examples provided.

game_pause ~80

Pause (paused: true) or resume the running game. While paused, game nodes don't run but game_query, game_set, game_call and game_wait_for still work — inspect and set up a situation across several calls without time passing, then advance with game_step. Input sent with press: true stays held while stepping.

NameTypeReqDescription
pausedbooleanyes–

No output schema declared.

No examples provided.

game_query ~108

Read live state from the running game. With 'properties' returns those values (supports 'position:x'); without, returns the node's class, children and common properties plus script variables. It only reads properties: to call a method use game_call.

NameTypeReqDescription
nodestring–Node in the running game: relative to the running scene (e.g. 'Player') or absolute (e.g. '/root/Main/Player'). Default: the running scene root.
propertiesarray––

No output schema declared.

No examples provided.

game_ray ~147

Cast a ray between two world-space points and return the hit position, normal, distance and collider (or hit: false). World axes do not follow a body's rotation, unlike a child RayCast3D.

NameTypeReqDescription
collide_with_areasboolean–Include Area3D (default false).
collide_with_bodiesboolean–Include bodies (default true).
collision_maskinteger–Physics layers to hit (default all).
excludestring–CollisionObject3D to ignore (e.g. the body casting the ray).
from–yesWorld start point [x, y, z].
to–yesWorld end point [x, y, z].

No output schema declared.

No examples provided.

game_run ~128

Launch the game from the editor and wait until the MCP runtime inside it is connected. Script errors in the game are logged and auto-continued unless pause_on_error=true.

NameTypeReqDescription
pause_on_errorboolean–Leave the game paused in the debugger on script errors (default false).
restartboolean–Stop a running game first instead of failing.
scenestring–'main' (default), 'current' (the edited scene), or a res:// scene path.
timeout_msinteger–How long to wait for the game to connect (default 20000).

No output schema declared.

No examples provided.

game_set ~140

Change state in the running game, e.g. to set up a test: {"score": 300, "position:x": 40, "items:2": 5}. Paths may address members, array elements and dictionary keys. Values are converted to the existing type; all of them are validated first and nothing changes if one is invalid. Returns before/after per path.

NameTypeReqDescription
nodestring–Node in the running game: relative to the running scene (e.g. 'Player') or absolute (e.g. '/root/Main/Player'). Default: the running scene root.
propertiesobjectyesProperty path -> new value.

No output schema declared.

No examples provided.

game_step ~169

Run exactly N physics frames, then leave the game paused (pauses it first if needed). Deterministic: every pausable node gets the same N _physics_process calls, independent of call latency. press/release/tap are sent just before the first stepped frame, like real input, so the game sees them in that frame as Input.is_action_just_pressed() and as input events (tap lasts one frame) — input sent with game_input while paused can't do that.

NameTypeReqDescription
framesintegeryesPhysics frames to run (60 per second by default).
pressarray–Actions to press before the first frame and keep held.
releasearray–Held actions to release before the first frame.
taparray–Actions to press for exactly the first frame.

No output schema declared.

No examples provided.

game_stop ~24

Stop the running game. Its logs stay readable with logs_read(source='game').

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

game_ui_audit ~143

Walk the Control nodes of the running game and report layout problems: Controls with no size, Controls outside the viewport or beyond their parent panel, text that needs more room than its rect (clipped) and overlapping labels. Returns the tree (path, class, rect, size, anchors, text) plus the issues, so a HUD can be checked without reading a screenshot.

NameTypeReqDescription
include_hiddenboolean–Also list hidden Controls (default false).
nodestring–Node in the running game: relative to the running scene (e.g. 'Player') or absolute (e.g. '/root/Main/Player'). Default: the running scene root.

No output schema declared.

No examples provided.

game_wait_for ~326

Wait until a property of a node in the running game (or the return value of one of its methods, e.g. {method: 'summary', property: 'state'}) satisfies a condition, checked every frame. Fails with TIMEOUT and the last observed value. timeout_ms=0 checks once (an assertion). op changed/increased/decreased waits for a change from the value seen when waiting starts.

NameTypeReqDescription
argsarray–Arguments for 'method'.
messagestring–Explains a failure in the test's words; prefixed to the error.
methodstring–Check this method's return value instead of a property, e.g. a summary() test hook. Called on every check, so it should only read state.
nodestringyesNode in the running game, relative to the running scene (e.g. 'Player') or absolute.
opstringyesComparison; changed/increased/decreased compare with the value when waiting starts.
propertystring–Property path, e.g. 'position:x', 'items:2', or a script variable. With 'method': a path inside its return value (e.g. 'message').
timeout_msinteger–Default 5000.
tolerancenumber–Allowed difference for numbers with ==, !=, >=, <= (default 0.0001).
value––Expected value: a number, boolean, string, null or array (vectors as [x, y]). Not used by changed/increased/decreased.

No output schema declared.

No examples provided.

godot_status ~43

Check the connection to the Godot editor and get basic state: Godot version, project name, currently edited scene and whether the game is running. Call this first.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

image_write ~349

Create a PNG sprite from text, NES-style: 'palette' maps single characters to colors and each string in 'rows' is one row of pixels ('.' and ' ' are transparent). 'frames' (a list of row lists) makes a horizontal sprite sheet for animation. Scaled with nearest neighbour, imported immediately, undoable with edit_undo. Use the result as {"res": path} for a Sprite2D texture.

NameTypeReqDescription
dry_runboolean–Validate and report the size without writing.
framesarray–Several same-sized frames, laid out left to right. Each frame is a list of row strings: [["..##..", ...], ["..##..", ...]].
mirrorstring–Symmetric sprites: give only the left half ('x'), top half ('y') or top-left quarter ('xy'); the rest is mirrored.
mirror_overlapboolean–Share the middle column/row instead of repeating it (odd widths/heights).
paletteobjectyesCharacter -> color ('#rrggbb', '#rrggbbaa', a name, or [r, g, b, a] in 0..1), e.g. {"k": "#000000", "r": "#d82800"}. null or 'transparent' = see-through ('.' and ' ' already are).
pathstringyesres:// path ending in .png.
rowsarray–One image: rows of palette characters, all the same length (max 256x256).
scaleinteger–Integer upscale factor (default 1). Prefer 1 and scale the node instead.

No output schema declared.

No examples provided.

input_action_set ~153

Add or replace an input action in the project's input map (project.godot), or remove it with remove: true. Keys are matched by physical position (e.g. 'A', 'Space', 'Left', 'Shift'). Undoable with edit_undo. A running game picks up changes after game_run with restart: true.

NameTypeReqDescription
deadzonenumber–Default 0.2.
dry_runboolean––
joypad_buttonsarray––
keysarray––
mouse_buttonsarray––
namestringyesAction name, e.g. 'shoot' or 'move_up'.
removeboolean–Remove the action instead.

No output schema declared.

No examples provided.

logs_read ~103

Read captured output: prints, errors and warnings (with file/line and stack when available). source='game' (default; kept after the game stops) or 'editor'. Pass the returned 'next' as 'since' to read only new entries.

NameTypeReqDescription
limitinteger–Default 200.
min_levelstring–Default 'info'.
sinceinteger–Cursor from a previous call's 'next'.
sourcestring––

No output schema declared.

No examples provided.

node_add ~320

Add a node to the edited scene (undoable). Provide either 'type' (a class like 'Sprite2D') or 'scene' (a res:// .tscn to instance). Initial properties are validated before anything is changed. Value formats: Vector2/3 as [x, y(, z)] or {x, y}; Color as '#rrggbb', '#rrggbbaa', a name like 'red', or [r, g, b, a] in 0..1; NodePath/StringName as strings; Rect2 as [x, y, w, h]; resources as {"res": "res://path"} for a file, or {"new": "RectangleShape2D", "properties": {"size": [32, 48]}} to create an embedded one (shapes, materials, styles; not scripts); null clears. Nested fields can be set with Godot's indexed syntax, e.g. "position:x".

NameTypeReqDescription
dry_runboolean–Preview only: validate and describe the change without applying it.
namestring–Node name (made unique among siblings if taken).
parentstring–Parent node. Node path relative to the edited scene's root; '.' is the root itself (e.g. 'Player/Sprite2D'). Default '.'.
propertiesobject–Initial property values.
scenestring–res:// path of a scene to instance instead of 'type'.
typestring–Node class to create.

No output schema declared.

No examples provided.

node_delete ~84

Delete a node and its children from the edited scene (undoable with edit_undo). The scene root cannot be deleted.

NameTypeReqDescription
dry_runboolean–Preview only: validate and describe the change without applying it.
pathstringyesNode path relative to the edited scene's root; '.' is the root itself (e.g. 'Player/Sprite2D').

No output schema declared.

No examples provided.

node_get ~101

Read properties of a node in the edited scene. By default returns only properties that differ from the class default plus script variables.

NameTypeReqDescription
changed_onlyboolean–When no list is given: only non-default values (default true).
pathstringyesNode path relative to the edited scene's root; '.' is the root itself (e.g. 'Player/Sprite2D').
propertiesarray–Only these properties (supports 'position:x').

No output schema declared.

No examples provided.

node_set ~256

Set one or more properties on a node as a single undoable action. All values are validated first; nothing changes if any is invalid. Returns before/after values. Value formats: Vector2/3 as [x, y(, z)] or {x, y}; Color as '#rrggbb', '#rrggbbaa', a name like 'red', or [r, g, b, a] in 0..1; NodePath/StringName as strings; Rect2 as [x, y, w, h]; resources as {"res": "res://path"} for a file, or {"new": "RectangleShape2D", "properties": {"size": [32, 48]}} to create an embedded one (shapes, materials, styles; not scripts); null clears. Nested fields can be set with Godot's indexed syntax, e.g. "position:x".

NameTypeReqDescription
dry_runboolean–Preview only: validate and describe the change without applying it.
pathstringyesNode path relative to the edited scene's root; '.' is the root itself (e.g. 'Player/Sprite2D').
propertiesobjectyesProperty name -> new value.

No output schema declared.

No examples provided.

project_connect ~135

Point this running server at another Godot project, so the following tool calls work on it — one MCP registration for many games. Only projects below the folders given with --projects-root are allowed (without it the server stays on its --project). Returns the new project's status like godot_status, or, when no editor is open for it, how to open one. The previous project's editor and game keep running. Don't switch while another tool call runs.

NameTypeReqDescription
pathstringyesProject folder (the one with project.godot): absolute, ~/..., or relative to a projects root, e.g. 'games/shooter'.

No output schema declared.

No examples provided.

project_export ~209

Export the project with one of its export_presets.cfg presets (Godot's `--export-release`, headless, fixed argument list, no shell). The output always goes under res://build/ — pass `path` to choose the name, or omit it for res://build/<preset>/ (index.html for Web). Returns the files written with their sizes, plus the tail of Godot's log. Fails with TEMPLATES_MISSING when Godot has no export templates installed. `dry_run` shows the command and the target without exporting.

NameTypeReqDescription
dry_runboolean–Validate the preset and the path, show the command, export nothing.
pathstring–Output under res://build/... — a folder or .html for Web, a file for the other platforms.
presetstringyesPreset name from export_presets.cfg (project_info can list them).
timeout_msinteger–Limit for the export process (default 600000).

No output schema declared.

No examples provided.

project_info ~123

Project overview: name, main scene, autoloads, input actions and their events (Godot's built-in ui_* actions are hidden unless include_builtin_actions), and (optionally) a file list filtered by a glob.

NameTypeReqDescription
globstring–If set, list res:// files matching this glob, e.g. '*.tscn' or 'scripts/**/*.gd'.
include_builtin_actionsboolean–Also list Godot's built-in ui_* actions (about 90).
max_filesinteger–Cap on listed files (default 200).

No output schema declared.

No examples provided.

project_list ~76

List the Godot projects this server may switch to: folders with project.godot below the --projects-root folders (up to 3 levels down, hidden folders skipped), each with its name, whether the MCP Loop addon is installed, whether an editor is running for it, and which one is current. Use project_connect to switch.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

project_setting_set ~133

Change one project setting from a fixed list: the main scene, the viewport size, the window size override, the stretch mode/aspect, the project name and max_fps. Anything else (rendering, physics, autoloads, input map) is refused — use the editor. Values may be sent as strings. Undoable with edit_undo; the editor window and a running game pick most settings up when they start.

NameTypeReqDescription
dry_runboolean–Return before/after without writing.
keystringyesSetting key.
value–yesNew value; converted to the setting's type.

No output schema declared.

No examples provided.

scenario_run ~479

Run a scripted play-test: (re)start the game, then execute steps in order — wait_for, assert, input, query, screenshot, wait_ms, assert_no_errors, set, call, repeat — stopping at the first failure. Returns a summary with per-step result, what was checked and the observed value, game errors, and screenshots; report='full' adds the JSON report. Pass a YAML/JSON file in the project (path), a folder or a list of files (paths) to run several and get one summary, or an inline scenario. save_to keeps the screenshots and a report as files in the project. movie records every frame with Godot's Movie Maker (fixed frame rate, needs a game window) and saves movie.gif plus contact.png — a grid of evenly spaced frames, also returned as an image so you can see the motion.

NameTypeReqDescription
include_screenshotsboolean–Attach screenshots as images (default true; for a folder or paths, default is failure screenshots only).
movieobject–Record the run with Movie Maker (one scenario; needs save_to and a game window — not with --headless in Main Run Args). Waits in the scenario are game time, so prefer frame-based steps for exact timi…
pathstring–Scenario file, e.g. 'res://tests/scenarios/move.yaml', or a folder to run every .yaml/.yml/.json file in it (natural name order, so 2_ runs before 10_).
pathsarray–Several scenario files, run in the given order.
reportstring–'summary' (default) or 'full' to also return the JSON report.
save_tostring–Folder in the project for evidence, e.g. 'res://qa/evidence/move': every screenshot as NN-label.png, report.md and report.json (a folder run: one subfolder per scenario plus summary.md). Re-runs repl…
scenario––Inline scenario as YAML text or an object: {name, scene?, steps: [...]}.
stop_on_failureboolean–With a folder or paths: stop after the first scenario that does not pass.

No output schema declared.

No examples provided.

scene_create ~136

Create a new scene file with a single root node and open it. Fails if the file already exists.

NameTypeReqDescription
dry_runboolean–Preview only: validate and describe the change without applying it.
pathstringyesres:// path ending in .tscn, e.g. 'res://levels/level_1.tscn'. Folders are created.
root_namestring–Root node name (default: file name in PascalCase).
root_typestringyesRoot node class, e.g. 'Node2D', 'Node3D', 'Control', 'CharacterBody2D'.

No output schema declared.

No examples provided.

scene_open ~49

Open a scene in the editor and make it the edited scene. Subsequent node_* tools operate on it.

NameTypeReqDescription
pathstringyesres:// path of a .tscn/.scn file.

No output schema declared.

No examples provided.

scene_save ~16

Save the currently edited scene to disk.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

scene_tree ~88

Node hierarchy of the edited scene: name, class, relative path, attached script and instanced scene for each node.

NameTypeReqDescription
depthinteger–Max depth below the subtree root (default 10).
pathstring–Subtree root. Node path relative to the edited scene's root; '.' is the root itself (e.g. 'Player/Sprite2D'). Default '.'.

No output schema declared.

No examples provided.

screenshot ~149

Capture an image of the running game (target='game', default) or of the editor's 2D/3D viewport (target='editor'). Game captures are scaled to the project's viewport size (normalize='viewport') so repeated screenshots compare like for like; pass normalize='none' to keep the window size. The text says the size and, when it differed, the window size. Not available when running headless.

NameTypeReqDescription
max_widthinteger–Downscale to at most this width (default 1280).
normalizestring–Game only: scale to the project's viewport size (default) or keep the window size (editor captures are unchanged).
targetstring––

No output schema declared.

No examples provided.

script_attach ~99

Attach an existing script to a node in the edited scene (undoable). Pass script=null to detach.

NameTypeReqDescription
dry_runboolean–Preview only: validate and describe the change without applying it.
nodestringyesNode path relative to the edited scene's root; '.' is the root itself (e.g. 'Player/Sprite2D').
scriptstring|nullyesres:// path of the script, or null to detach.

No output schema declared.

No examples provided.

script_edit ~132

Change part of an existing GDScript file by exact text replacement, without resending the whole file. Each edit's 'old' must match exactly once (including indentation; GDScript uses tabs) unless replace_all is set; edits apply in order. The result is compiled first; on errors or a non-matching edit nothing is written. Returns a unified diff. Undoable with edit_undo.

NameTypeReqDescription
dry_runboolean–Preview only: validate and describe the change without applying it.
editsarrayyes–
pathstringyesres:// path of an existing .gd file.

No output schema declared.

No examples provided.

script_read ~40

Read a text resource inside the project (GDScript, shader, .tscn, .cfg ...).

NameTypeReqDescription
pathstringyesres:// path.

No output schema declared.

No examples provided.

script_write ~120

Create or overwrite a GDScript (.gd) file. The code is compiled first; on errors nothing is written and the errors (with line numbers) are returned. Returns a unified diff for changed files and a one-line summary for new ones. Undoable with edit_undo. For small changes to an existing file prefer script_edit.

NameTypeReqDescription
contentstringyesFull new file content.
dry_runboolean–Preview only: validate and describe the change without applying it.
pathstringyesres:// path ending in .gd.

No output schema declared.

No examples provided.

test_run ~223

Run the project's unit tests with GUT or GdUnit4 (whichever is installed in addons/) in a separate headless Godot process started by the editor, and return pass/fail counts, every failing test with its message, and errors from the log. Use it for game logic; use scenario_run for play. Failing tests are a normal result (not a tool error).

NameTypeReqDescription
frameworkstring–Default 'auto': the one installed.
pathstring–Test folder or one test script, e.g. 'res://test/unit' or 'res://test/unit/test_player.gd'. Default: res://test or res://tests (GUT: the folders in res://.gutconfig.json when it exists).
reportstring–'full' adds the JSON result with every test's status.
teststring–GUT only: run the tests whose name contains this, e.g. 'test_jump'.
timeout_msinteger–Stop the run after this long (default 120000).

No output schema declared.

No examples provided.

Install

How do I install the Godot MCP Loop server?

Godot MCP Loop runs locally as an npm package, launched with npx -y godot-mcp-loop. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · godot-mcp-loop

# add to Claude Code
claude mcp add ai-osho-godot-mcp-loop -- npx -y godot-mcp-loop
Common questions

What is the Godot MCP Loop server?

Godot MCP Loop is listed in the public MCP registry as io.github.AI-osho/godot-mcp-loop. Drive a live Godot 4 editor: edit scenes and scripts, run and test the game, record GIFs. This page covers its npm package (godot-mcp-loop).

Is the Godot MCP Loop server safe to use?

Godot MCP Loop scores 86 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Godot MCP Loop server expose?

Godot MCP Loop exposes 41 tools: godot_status, project_list, project_connect, editor_launch, editor_quit, and 36 more. Their descriptions and schemas cost roughly 6,043 tokens of context every time the server is loaded.

Is the Godot MCP Loop server still maintained?

Godot MCP Loop is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Godot MCP Loop server under?

Godot MCP Loop declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.