{"name":"io.github.Erodenn/godot-mcp-runtime","slug":"erodenn-godot-mcp-runtime","title":"Godot MCP Runtime","description":"Zero-addon MCP server for Godot 4: agents edit, run, and play-test the game.","url":"https://mcp.market/server/erodenn-godot-mcp-runtime","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":49,"stars":82,"forks":17,"downloads_week":1334,"last_push_at":"2026-10-01T19:49:30.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Erodenn/godot-mcp-runtime","website":null,"version":"3.8.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"godot-mcp-runtime","version":"3.8.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Path to the Godot 4.x executable. Auto-detected if Godot is on PATH.","name":"GODOT_PATH"},{"description":"Enable verbose logging when set to 'true'.","name":"DEBUG"},{"description":"Set to 'true' to disable run_project/run_script confirmation prompts (fail-open) for clients that cannot display elicitation, e.g. Claude Desktop. Tier 1 security hard-blocks still apply.","name":"GODOT_MCP_DISABLE_ELICITATION"},{"description":"Set to 'true' to hard-reject anything that would otherwise prompt, for unattended operation. Takes precedence over GODOT_MCP_DISABLE_ELICITATION.","name":"GODOT_MCP_STRICT"},{"description":"Set to 'true' to disable the run_script/run_project static gate entirely, Tier 1 hard blocks included. Overrides GODOT_MCP_STRICT. Operator opt-out, not a convenience.","name":"GODOT_MCP_DISABLE_SECURITY"}]}],"tools":[{"name":"add_autoload","description":"Register a new autoload in a project. autoloadPath accepts \"res://...\" or a project-relative path (auto-prefixed). singleton defaults true (accessible globally by name). No Godot process required. Warning: autoloads initialize in headless mode - a broken script will crash every subsequent headless op; validate before adding. Returns plain-text confirmation with the registered name, path, and singl","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_node","description":"Add a node to a Godot scene. Saves automatically. position, rotation, scale, visible, modulate are top-level params; anything else goes in properties. Values are checked against the property's declared type and error instead of silently storing that type's zero value. Object-typed properties take a res:// path, a {type: ClassName, ...props} dict that builds a Resource inline, or null; slash-suffix","write_action":false,"price_micros":0,"input_schema":null},{"name":"attach_project","description":"Inject the MCP bridge into a Godot process you launch yourself, then wait up to 20s for the bridge to start listening and up to 45s total once it has, so a large project's cold start is absorbed; a port that listens but answers no ping gives up sooner. Call BEFORE Godot launches - Godot reads autoloads only at process start, so a late call returns \"bridge did not respond.\" Recommended pattern: kic","write_action":false,"price_micros":0,"input_schema":null},{"name":"attach_script","description":"Attach an existing GDScript file to a node in a scene. Use after writing the script with the standard file tools and validating it via the validate tool. Replaces any previously attached script. Saves automatically. Returns: success with the resolved nodePath and scriptPath that were attached. Errors if scriptPath does not exist or nodePath is not found. Errors while a Godot runtime session is act","write_action":false,"price_micros":0,"input_schema":null},{"name":"batch_scene_operations","description":"Use this instead of chaining add_node / load_sprite / save_scene calls when you have multiple mutations on the same or related scenes - runs in one Godot process (~3s startup avoided per call) and shares an in-memory scene cache, saving once at the end. Each item picks its own sub-operation (add_node, load_sprite, set_node_properties, save) and supplies its own params; add_node items accept the sa","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_project","description":"Get project metadata (name, path, Godot version, structure summary) plus an always-present runtime block reporting whether a runtime session is active, its bridge is responsive, and its process is alive. Omit projectPath for just the Godot version and runtime status. Use as the first call before driving a running project. Never errors on the runtime probe itself. Returns: { name?, path?, structure","write_action":false,"price_micros":0,"input_schema":null},{"name":"connect_signal","description":"Connect a signal on a source node to a method on a target node, persisting it in the .tscn. Use get_node_signals first to confirm names - connecting the same pair twice creates a duplicate connection. Saves automatically. Returns a plain-text confirmation naming source, signal, target, and method. Errors if the signal or method does not exist. Errors while a Godot runtime session is active on this","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_scene","description":"Create a new Godot scene file with a single root node. Writes a fresh .tscn at scenePath. Use when starting a new scene from scratch; for adding nodes to an existing scene, use add_node. rootNodeType defaults to Node2D - pass \"Node3D\" for 3D scenes or \"Control\" for UI. Saves automatically. Overwrites silently if the file already exists. Returns: success and the scenePath that was written. Errors w","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_nodes","description":"Remove one or more nodes (and their descendants) from a scene file. Always-array: pass a single-element nodePaths array for one-off deletes. Saves once at the end. Cannot delete the scene root - that entry returns an error and the rest still process. Returns: results array with one entry per nodePath in input order (success or error message). Errors while a Godot runtime session is active on this ","write_action":true,"price_micros":0,"input_schema":null},{"name":"detach_project","description":"Clear attached-mode runtime state and remove the injected McpBridge autoload. Does NOT stop the manually launched Godot process - that stays running. Use after attach_project when you are done driving the game from MCP. For spawned sessions (run_project), use stop_project instead. Mostly optional now: when the bridge disconnects (you closed Godot), the next runtime tool call probes once and ends t","write_action":false,"price_micros":0,"input_schema":null},{"name":"disconnect_signal","description":"Remove an existing signal connection between two nodes, persisting the change in the .tscn. Use get_node_signals first to confirm the connection exists; recovery requires reconnecting via connect_signal. Saves automatically. Returns a plain-text confirmation naming the disconnected signal and target. Errors if the connection does not exist. Errors while a Godot runtime session is active on this pr","write_action":true,"price_micros":0,"input_schema":null},{"name":"duplicate_node","description":"Duplicate a node and its descendants in a Godot scene, without rebuilding it node-by-node via add_node. newName defaults to the original name + \"2\"; targetParentPath defaults to the original parent. Saves automatically. Returns: success with originalPath and the newPath where the duplicate now lives. Errors if nodePath does not exist or targetParentPath cannot accept children. Errors while a Godot","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_mesh_library","description":"Export a scene of MeshInstance3D nodes as a MeshLibrary .res file for use in GridMap. For grid-based 3D tile palettes only, not 2D scenes. Source scene must contain MeshInstance3D children. Pass meshItemNames for a subset, or omit for all. Saves to outputPath, overwriting silently. Returns a plain-text confirmation with the exported item count. Errors if the scene contains no valid meshes. Errors ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_debug_output","description":"Get captured stdout/stderr from a spawned Godot project. Use whenever runtime tools fail unexpectedly - script errors, missing nodes, and crash backtraces all surface here. Still works after the process exits or crashes: the session clears itself on exit but the captured logs are retained until stop_project. Requires run_project (not attach_project; attached mode does not capture output). Returns:","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_node_properties","description":"Read one or more nodes' current property values from a scene file in a single Godot process. Always-array: pass a single-element nodes array for one-off reads. Per-node changedOnly:true filters out properties matching class defaults (useful for compact diffs). Returns: { results: [{ nodePath, nodeType, properties?, error? }] }; failed reads include error and omit properties.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_node_signals","description":"List all signals defined on a node and their current connections. Use before connect_signal/disconnect_signal to verify signal/method names. The connections[].target field is already scene-root-relative in the \"root/...\" form connect_signal/disconnect_signal accept as targetNodePath (a self-connection reports as \"root\") - pass it straight through with no conversion. Returns: nodeType and signals[]","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_project_files","description":"Return a recursive file tree of a Godot project. Use to discover project structure when paths are unknown. Pass extensions to filter (e.g. [\"gd\",\"tscn\"]); maxDepth caps recursion (-1 unlimited). Skips hidden (dot-prefixed) entries and the .mcp directory. Returns: { name, type, path, extension?, children? } (nested tree).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_project_settings","description":"Parse project.godot into structured JSON. Use to inspect configured display, input, rendering, etc. settings without launching Godot. Pass section to filter to one INI section (e.g. \"display\", \"application\"). Returns: { settings: { [section]: { [key]: value } } } or { settings: { [key]: value } } when section is given. Complex Godot types (including multi-line arrays/dicts, e.g. the full \"[input]\"","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_scene_dependencies","description":"Parse a .tscn file for ext_resource references (scripts, textures, subscenes). Use to inspect what a scene depends on before refactoring or moving files. Returns: the queried scene path and dependencies[] from ext_resource refs (path, type, optional uid). Errors if scene file does not exist.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_scene_tree","description":"Get the scene hierarchy as a nested tree of { name, type, path, script, children }. Use maxDepth:1 for a shallow listing of direct children only; default -1 returns the full tree. parentPath scopes the result to a subtree. Returns the nested tree as JSON text. Errors if scene does not exist or parentPath is not found.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_ui_elements","description":"Walk the running scene tree and return all Control nodes with positions, sizes, types, and text content. Always call this before simulate_input click_element actions to discover valid element names and paths. Requires an active runtime session (run_project or attach_project). visibleOnly defaults true; pass false to include hidden Controls. filter narrows by class. Returns: elements[] with path/ty","write_action":false,"price_micros":0,"input_schema":null},{"name":"launch_editor","description":"Open the Godot editor GUI for a project for the human user. Use only when the user explicitly asks to \"open the editor\"; for any agent-driven work, use the headless scene/node tools (add_node, set_node_properties, etc.) instead - the editor cannot be controlled programmatically. Returns plain-text confirmation after spawning the editor process. Errors if projectPath has no project.godot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_autoloads","description":"List all registered autoloads in a project with paths and singleton status. Use first when diagnosing headless failures - broken autoloads crash all headless ops, so this tells you what is loaded. No Godot process required (reads project.godot directly). Returns: [{ name, path, singleton }].","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_projects","description":"Find Godot projects under a directory by locating project.godot files. Use to discover available projects when the user has not specified one; for inspecting a known project, use check_project. recursive:true descends into subdirectories (skipping hidden ones); default false checks only the directory itself and its immediate children. Returns: [{ path, name }], empty array on no matches.","write_action":false,"price_micros":0,"input_schema":null},{"name":"load_sprite","description":"Set the texture on an existing Sprite2D, Sprite3D, or TextureRect node. For new nodes, pass texture via add_node properties instead. Saves automatically. texturePath must be a real file under projectPath. Returns a plain-text confirmation message naming the loaded texture. Errors if the node is not one of those three classes, or the texture file does not exist. Errors while a Godot runtime session","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_project","description":"Capture a window of Godot's function profiler - the editor's Profiler tab numbers. Requires run_project with profiling: true. Blocks for `seconds` (default 5). Times are elapsed, not CPU; inclusive rows overlap - never sum totalMs. Returns: rows (function, file, line, calls, selfMs/totalMs, per-frame averages, percentOfFrame, peak), the frame budget, servers, worstFrame, plus frames/frameGaps/limi","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_autoload","description":"Unregister an autoload from a project by name. Use to recover from a broken autoload that is crashing headless ops. No Godot process required. Returns plain-text confirmation on success. Errors if no autoload with that name exists.","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_project","description":"Spawn a Godot project as a child process with stdout/stderr captured. Required before take_screenshot, simulate_input, get_ui_elements, run_script, or get_debug_output. Set profiling: true at launch to enable the profiler tools. Use attach_project for one you launched yourself. Verifies MCP bridge readiness before returning success. Returns status with the assigned bridge port. Call stop_project w","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_script","description":"Execute a custom GDScript in the live running project with full scene tree access. Requires an active runtime session. Script must extend RefCounted and define func execute(scene_tree: SceneTree) -> Variant. Return values are JSON-serialized (primitives, Vector2/3, Color, Dictionary, Array, and Node path strings). Use print() for debug output - it appears in get_debug_output, not in the result. In","write_action":true,"price_micros":0,"input_schema":null},{"name":"save_scene","description":"Re-pack and save a scene, optionally to a different path (save-as). Most mutations (add_node, set_node_properties, delete_nodes, etc.) auto-save - only use this for save-as via newPath, or to re-canonicalize a hand-edited .tscn. Overwrites silently. Returns a plain-text confirmation naming the save path. Errors if the scene file does not exist. Errors while a Godot runtime session is active on thi","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_project","description":"Plain-text (substring) search across project files. Use to find references, callers, or signatures across the codebase. Default fileTypes is [\"gd\",\"tscn\",\"cs\",\"gdshader\"]; caseSensitive default false; maxResults default 100. Skips hidden entries and the .mcp directory. Returns: matches[] (project-relative file, 1-indexed lineNumber, line text) and truncated:true when maxResults was hit - consider ","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_node_properties","description":"Set one or more node properties on a scene in one Godot process. Always-array: pass a single-element updates array for one-off edits. Values are checked against the property's declared type and error instead of silently storing that type's zero value. Object-typed properties (e.g. CollisionShape2D.shape) take a res:// path, a {type: ClassName, ...props} dict that builds a Resource inline, or null ","write_action":false,"price_micros":0,"input_schema":null},{"name":"simulate_input","description":"Simulate sequential input in a running project and report what each action did. Action `type`: key, mouse_button, mouse_motion, click_element, action, text, wait. For key/mouse_button/action, omit `pressed` to tap (press+release); set it to hold or release. click_element resolves by node path/name (see get_ui_elements), not visible text. Returns: results[] per action with ok, timing, signals fired","write_action":false,"price_micros":0,"input_schema":null},{"name":"start_profiler","description":"Start a profiler capture and return immediately, so simulate_input, run_script and screenshots can drive the game while it records. Requires run_project with profiling: true. Stops itself after `seconds` (default 30, max 60); call stop_profiler for the results. Returns: active, firstFrame, captureLimit, maxSeconds. Use profile_project instead for an unattended window. Errors if a capture is alread","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_profiler","description":"Stop the capture started by start_profiler and rank the recorded functions; a capture that already hit its time limit is read back as-is, and can be re-read with a different sort. Times are elapsed, not CPU; inclusive rows overlap - never sum totalMs. Returns: the same payload as profile_project - rows (file, line, function, calls, selfMs/totalMs, per-frame averages, percentOfFrame, peak frame), f","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_project","description":"Stop the spawned Godot project and clean up bridge state. Call when done with runtime testing, even after a crash, and even if you closed the Godot window yourself: it frees the process slot and clears the flag blocking scene-editing tools. A process that exited on its own already removed the bridge autoload at that moment, and this still succeeds - it reports alreadyExited:true with the exit code","write_action":false,"price_micros":0,"input_schema":null},{"name":"take_screenshot","description":"Capture a PNG of the running viewport. responseMode: preview (default - saves full PNG, returns bounded inline preview at 960x540), full (full inline PNG; use for small text or pixel-level inspection), path_only (saved-path only, no inline image). Saved under .mcp/godot-runtime/screenshots/ (persists after stop_project). Returns: inline image block (full/preview modes), plus path and size of the s","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_autoload","description":"Modify an existing autoload's path or singleton flag. Pass either or both - omitted fields keep their current value. Use instead of remove_autoload + add_autoload (single edit, no orphan window). No Godot process required. Returns plain-text confirmation on success. Errors if autoloadName is not registered.","write_action":true,"price_micros":0,"input_schema":null},{"name":"validate","description":"Validate GDScript syntax or scene integrity using headless Godot. Use before attach_script or run_script to catch parse errors early. Give exactly one of scriptPath, source, or scenePath, or a targets array validated in one Godot process. Returns { valid, errors } for one target, { results: [{ target, valid, errors }] } for a batch. An errors entry is { line?, message } for a parse error, or { che","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-10-03T12:02:25.362Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-03T12:02:25.341Z","components":{"code":{"score":25,"max":25,"notes":["67 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"godot-mcp-runtime","version":"3.8.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":1,"publishedAt":"2026-09-20T19:31:32.620Z","repositoryUrl":"git+https://github.com/Erodenn/godot-mcp-runtime.git","weeklyDownloads":1334}],"repo":{"found":true,"owner":"Erodenn","repo":"godot-mcp-runtime","archived":false,"pushedAt":"2026-10-01T19:49:30Z","stars":82,"forks":17,"openIssues":6,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/90123623?v=4","ownerCreatedAt":"2021-09-05T04:17:14Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/90123623?v=4&s=128","source":"registry"},"presence":{"stars":82,"forks":17,"downloadsWeek":1334,"license":"MIT","lastPushAt":"2026-10-01T19:49:30.000Z","score":49}}}},"grade_history":[],"reviews":[]}