{"name":"io.github.tomyud1/godot-mcp","slug":"tomyud1-godot-mcp","title":null,"description":"MCP server for Godot game engine integration — control the Godot editor with AI","url":"https://mcp.market/server/tomyud1-godot-mcp","rating":null,"grade":"B","score":74,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":55,"stars":448,"forks":52,"downloads_week":980,"last_push_at":"2026-10-17T14:01:05.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/tomyud1/godot-mcp","website":null,"version":"0.6.1","remotes":[],"packages":[{"registryType":"npm","identifier":"godot-mcp-server","version":"0.6.1","transport":{"type":"stdio"}}],"tools":[{"name":"add_node","description":"Add a node (optionally with a script, groups, properties and a whole tree of children) to an existing scene file in one call. Children format: {name|node_name, type|node_type, properties?, script?, groups?, children?}; unknown child keys are errors. **All-or-nothing:** the node tree is built and checked in memory before the scene is touched. Every problem (unknown types or properties with suggesti","write_action":false,"price_micros":0,"input_schema":null},{"name":"attach_script","description":"Attach or change a script on a node in a scene.","write_action":false,"price_micros":0,"input_schema":null},{"name":"batch_execute","description":"Run an ordered list of MCP tool calls as a single composite operation.","write_action":true,"price_micros":0,"input_schema":null},{"name":"classdb_query","description":"Query Godot's ClassDB for class information: properties, methods, signals, and inheritance. Use this to verify that a class, method, or property actually exists in the running Godot engine before writing code. Prevents using wrong method names, outdated Godot 3 API, or incorrect signatures.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clear_console_log","description":"Mark the current position in the Godot editor log. Subsequent get_console_log and get_errors calls will only return output after this point.","write_action":false,"price_micros":0,"input_schema":null},{"name":"close_editor_tabs","description":"Close open editor tabs (scenes and/or scripts). Files on disk are NOT touched — this only changes the editor UI state. Default behavior with no args closes EVERY open tab (both scenes and scripts). Primary use case: test automation — reset the editor to a known state between test runs without restarting Godot. Also useful before calling delete_file / delete_folder, which refuse by default when the","write_action":false,"price_micros":0,"input_schema":null},{"name":"configure_input_map","description":"Add, remove, or replace input actions and their key/button bindings. Use get_input_map to see current actions before modifying.","write_action":false,"price_micros":0,"input_schema":null},{"name":"connect_signal","description":"Connect a signal between two nodes inside a .tscn scene file. The target script must define the method (will refuse otherwise). Equivalent to clicking the \"+\" in the editor's Node > Signals panel and persists the connection to the .tscn. NOTE: scripts must be attached via attach_script, otherwise the editor's in-memory node will not see the script and this tool will reject the connection.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_folder","description":"Create a directory (with parent directories if needed).","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_scene","description":"Create a new Godot scene (.tscn) with a tree of nodes in one call, including their properties, textures, collision shapes, scripts and groups. Use this to create player scenes, UI screens, game objects, etc. **All-or-nothing:** the whole tree is built and checked in memory first. Unknown node types or property names (with suggestions), values of the wrong type, missing resource files and bad scrip","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_script","description":"Create a NEW GDScript file (.gd) that does not exist yet. STRICTLY for .gd files — non-.gd extensions (.json, .gdignore, .md, etc.) are rejected with a pointer at write_file. A missing extension is auto-completed to .gd. Use edit_script for changes to an existing file. Use classdb_query to verify unfamiliar Godot class methods. After creating a script, consider run_scene and get_errors to verify i","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_file","description":"Permanently delete a file from the project. REQUIRES confirm=true as an explicit safety gate \\u2014 omitting confirm returns an error. Creates a .bak backup alongside the original by default (disable with create_backup=false). REFUSES if the file is currently open in the editor (any scene tab or script editor tab); close the tab first, or pass force=true to bypass the check (not recommended \\u2014","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_folder","description":"Recursively delete a directory and ALL of its contents from the project. REQUIRES confirm=true. For a non-empty folder you must ALSO pass recursive=true — otherwise the call refuses and reports the file/sub-folder count. The whole deletion lands as a SINGLE undo entry: one mcp_undo restores every file (empty sub-directories are not restored — only files are tracked). Three safety guards each REFUS","write_action":true,"price_micros":0,"input_schema":null},{"name":"detach_script","description":"Remove a script from a node in a scene.","write_action":true,"price_micros":0,"input_schema":null},{"name":"disconnect_signal","description":"Remove a signal connection from a .tscn scene file. No-op if the connection doesn't exist.","write_action":true,"price_micros":0,"input_schema":null},{"name":"edit_script","description":"Edit an existing GDScript (.gd) file in place by replacing old_text with new_text, and save. The text can be any size — a single line, a function, or the whole file for a full rewrite. If old_text matches more than once, pass context_before/context_after to disambiguate; if it can't be found, read_file the relevant range and retry with an exact match. ONLY for .gd files; not for .tscn scene files ","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_nodes","description":"Search a .tscn file for nodes matching one or more filters. Filters AND together; pass any subset. Scene-scoped — for project-wide text search use search_project instead. Returns one entry per match with path (relative to scene root, \".\" = root), name, type (Godot class), and groups. Filters: \\u2022 name_pattern: case-insensitive. If it contains \"*\" or \"?\" it is treated as a glob (matchn); otherwi","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_2d_asset","description":"Render an SVG to a PNG asset on disk via Image.load_svg_from_buffer. The SVG is rendered directly from bytes \\u2014 no temp file is created, so concurrent calls are safe and project-rename quirks (user:// rebinding) cannot break it. Returns resource_path, absolute_path, dimensions {width,height}, and the render_scale used.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_collision_layers","description":"Return named 2D/3D physics collision layers from ProjectSettings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_console_log","description":"Return the latest lines from the Godot editor Output panel (editor-side messages plus prints from the running game). NOTE: this does NOT include the Debugger > Errors tab — runtime push_error / script errors during play often surface only there. After run_scene, always call get_errors (not just this) to check for errors. When this tool finds error-prefixed lines it returns errors_detected=true and","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_editor_selection","description":"Return the node path(s) the user has currently selected in the Godot editor (Scene dock). **Call this FIRST whenever the user refers to a node without naming a path** — phrases like \"this node\", \"fix this\", \"change the color here\", \"delete that\", \"make this red\", \"the selected one\", \"what I have selected\", etc. Returns an empty `selection` array if nothing is selected; that's informational, not an","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_errors","description":"Get errors and warnings from both the Godot Output panel and the Debugger > Errors tab. Returns file paths, line numbers, severity, stack traces, and which source each error came from. Debugger rows can appear a few frames after run_scene returns; pass wait_ms:300 when checking immediately after launch. If errors mention a missing method or property, use classdb_query to verify the correct API bef","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_godot_status","description":"Check if the Godot editor is connected to the MCP server. Also reports the plugin, server and Godot versions, and warns when the plugin and server versions differ.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_guide","description":"Read a short markdown guide from the server. Same content as the MCP resources/read protocol, exposed as a tool so it works in MCP clients that do not support resources (e.g. Claude Desktop, Cursor chat). Call with no args to list available guides: …. Call with {slug: \"...\"} to get the full markdown. Useful when a workflow is non-obvious (testing a running game, setting resources and property valu","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_input_map","description":"Return the full InputMap: built-in actions (ui_*, spatial_editor/*) plus all project-defined actions from project.godot. Each action maps to an object with \"events\" (array of key/mouse/gamepad bindings) and optionally \"deadzone\". Use this before configure_input_map to see current bindings and deadzones.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_node_groups","description":"Read the list of groups a node belongs to in a .tscn scene file.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_node_properties","description":"Get available properties for a Godot node type. Use this to discover what properties exist on a node type (e.g., anchors_preset for Control, position for Node2D).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_node_spatial_info","description":"Query computed 3D spatial data for a Node3D in a scene file. Returns local/global positions, scales, rotation quaternions, and subtree bounding boxes (AABB) when available. Use this before making precise 3D placement decisions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_performance_monitors","description":"Snapshot of Godot's Performance singleton from inside the RUNNING game: fps, frame/physics step times, static memory (current + peak), renderer draw calls / objects / primitives, and engine-wide object/node/orphan counts. REQUIRES the game to be running with the MCPRuntime autoload connected (run_scene with wait_for_runtime=true first). Use when: 1. After run_scene — verify the scene actually hits","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_project_settings","description":"Concise project settings summary: main_scene, window size/stretch, physics tick rate, and render basics.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_resource_info","description":"Inspect ANY Godot Resource. Two modes: \\u2022 path mode: pass {path: \"res://foo.png\"} for a resource on disk (.tres / .res / image / .glb / .ogg / .tscn / etc.) \\u2022 node mode: pass {scene_path, node_path, resource_property} to inspect a resource attached to a node WITHOUT having to save it as .tres first (e.g. the shape on a CollisionShape2D, the material on a MeshInstance3D, the stream on an A","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_runtime_log","description":"Return entries from the MCPRuntime in-game ring buffer. The buffer holds the last ~500 lines pushed via MCPRuntime.push_runtime_log(level, text) from your scripts plus internal connection events. For script prints/stdout use get_console_log; for runtime push_error / script errors use get_errors (it reads the Debugger > Errors tab \\u2014 runtime errors do NOT appear in get_console_log). Returns ent","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_runtime_status","description":"Combined editor + runtime status snapshot. Returns `playing`, `playing_scene`, `last_launched` (\"current\"|\"main\"|res-path), `uptime_ms` since the most recent run_scene, `runtime_helper_connected` (true once the in-game MCPRuntime autoload is talking to the MCP server), `godot_version` (e.g. \"4.5.0.stable\"), and `godot_version_info` (the full Engine.get_version_info() dict — `major`, `minor`, `patc","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_scene_node_properties","description":"Return the FULL property list of a single node in a .tscn file, including @export'd script vars and inherited properties — with current values, declared variant types, hint metadata, and a category grouping. Complements `read_scene` (which uses a curated subset of common properties for quick tree overviews) and `get_node_properties` (which returns class-level metadata, not a specific node's curren","write_action":false,"price_micros":0,"input_schema":null},{"name":"instance_scene","description":"Add an instance of another scene (.tscn) as a child node. This is how you compose scenes from reusable parts (like prefabs). The instance maintains a live reference to the source scene. Use this instead of add_node when you want to reuse an existing scene.","write_action":false,"price_micros":0,"input_schema":null},{"name":"is_playing","description":"Compatibility shim: returns {playing, scene}. For richer info (uptime, runtime helper connectivity, last-launched target) prefer get_runtime_status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_dir","description":"List files and folders under a Godot project path (e.g., res://). Returns arrays of files and folders in the specified directory.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_scripts","description":"List all GDScript files in the project with basic metadata.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_settings","description":"Browse Godot project settings by category. Returns values from the editor's in-memory state — this matches project.godot after a normal Godot save, but direct edits to project.godot on disk are not reflected until the editor restarts (rescan_filesystem does not help). Call without a category to see all available categories. Call with a category to see all settings with their current values, types,","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_signal_connections","description":"List signal connections involving a node. source=\"scene_file\" (default) reads connections persisted to a .tscn. source=\"runtime\" requires the game to be running and reads live connections from the SceneTree. Use the runtime mode to verify dynamically-connected signals (those connected from code in _ready, not in the editor).","write_action":false,"price_micros":0,"input_schema":null},{"name":"map_project","description":"Crawl the entire Godot project and build an interactive visual map of all scripts showing their structure (variables, functions, signals), connections (extends, preloads, signal connections), and descriptions. Opens an interactive browser-based visualization.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp_redo","description":"Re-apply the most recently undone MCP mutation(s). Use this proactively whenever you've over-undone — for example, you walked back several steps to inspect intermediate state, or you undid in error and want to recover the change without re-deriving its arguments.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp_undo","description":"Roll back the most recent MCP mutation(s). Use this proactively — not just when the user asks — any time you want to recover from a mistake, clean up after a partial failure, or try a different approach.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mcp_undo_history","description":"List the undo and redo stacks: tool name, args summary, files affected, and age in seconds for each entry. Use to decide how far to undo (then call mcp_undo with the chosen count) or to confirm a specific change is still on the stack.","write_action":false,"price_micros":0,"input_schema":null},{"name":"measure_node_distance","description":"Measure the world-space distance between two Node3D nodes in a scene file. Returns both the full 3D delta and the horizontal XZ distance.","write_action":false,"price_micros":0,"input_schema":null},{"name":"move_node","description":"Move a node to a different parent in a scene and optionally control its position among siblings.","write_action":false,"price_micros":0,"input_schema":null},{"name":"open_in_godot","description":"Open a file in the Godot editor at a specific line (side-effect only).","write_action":false,"price_micros":0,"input_schema":null},{"name":"query_runtime_node","description":"Read a live node in the running game. REQUIRES the game to be running with the MCPRuntime autoload connected. Returns class, path, script, groups and property values. By default (no `properties`) it returns everything that describes the node's current state: all script variables (health, score, ...) plus every stored property that differs from the class default (a Label's text, a body's velocity, ","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_file","description":"Read a text file from the Godot project, optionally a specific line range. Useful for reading GDScript files, scene files, or any text-based content.","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_scene","description":"Read and parse a scene file to get its full node structure and properties. Use this to understand a scene before editing. NOTE: `include_properties: true` returns a hand-picked subset (position, rotation, scale, size, offset, visible, modulate, z_index, text, collision_layer, collision_mask, mass) optimized for quick scene overviews. To see ALL properties on a specific node — including @export'd s","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_node","description":"Remove a node from an existing scene file.","write_action":true,"price_micros":0,"input_schema":null},{"name":"rename_file","description":"Rename or move a project file. By default also rewrites every literal reference to the old path in other text-format project files (.tscn, .tres, .gd, .cs, .gdshader, project.godot) and updates any matching `autoload/*` entry in ProjectSettings, so scenes and preloads keep working. When Godot exposes a reliable scene-dirty API, clean open scene tabs that referenced the renamed file are reloaded (c","write_action":false,"price_micros":0,"input_schema":null},{"name":"rename_node","description":"Rename a node in a scene.","write_action":false,"price_micros":0,"input_schema":null},{"name":"rescan_filesystem","description":"Trigger a full filesystem rescan in the Godot editor. Use after creating, deleting, or modifying files externally (e.g. from the terminal or another tool). The scan is asynchronous and returns immediately. If a scan is already in progress (often happens right after a batch of mutations), the call returns ok:true with already_scanning:true — the in-flight scan will pick up your recent disk changes,","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_scene","description":"Launch a scene in the Godot editor. By default the call BLOCKS until the editor flips to playing state (so the next get_errors / take_screenshot / send_input call sees a real game). The response includes started, runtime_connected, wait_for_started_ms, wait_for_runtime_ms, scene_path, and runtime_root. Use runtime_root (e.g. \"/root/Main\") as the prefix for query_runtime_node node_path arguments \\u","write_action":true,"price_micros":0,"input_schema":null},{"name":"save_resource_to_file","description":"Save a Resource currently held by a node (or sub-resource) to a standalone .tres file so it can be referenced by other scenes / shared / committed. The node's property is then re-pointed to the saved file. To change the file later, call set_node_properties with scene_path set to the .tres (this affects every scene that uses it). Works for any Resource subclass: Material, Mesh, Shape, Curve, Gradie","write_action":false,"price_micros":0,"input_schema":null},{"name":"scene_tree_dump","description":"Dump the scene tree of the scene currently open in the Godot editor (node names, types, and attached scripts) as an indented text block. Reflects unsaved edits (uses the live editor tree, not the .tscn on disk). All args are optional; with no args the entire tree is returned (existing behavior). Opt-in scoping / pagination (use these on large scenes to keep responses small): • subtree_root — start","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_project","description":"Search the Godot project for a substring and return file hits with line numbers. Useful for finding usages of functions, variables, or any text pattern.","write_action":false,"price_micros":0,"input_schema":null},{"name":"send_input","description":"Synthesize an InputEvent and dispatch it to the running game via Input.parse_input_event. REQUIRES the game to be running with the MCPRuntime autoload connected. Use this to drive automated tests: click buttons, press keys, fire input actions. For multi-step interactions, alternate send_input \\u2192 wait \\u2192 query_runtime_node / take_screenshot. Unknown key names, unknown actions and unknown ev","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_editor_selection","description":"Replace or extend the editor's Scene-dock selection. Two main uses: (1) after `add_node`, focus the user's gizmo on the freshly-created node so they can see/manipulate it immediately, and (2) draw the user's attention to a node the AI just modified or discovered (\"here is the offending node — selected for you in the Scene dock\"). Pre-validates every path against the live edited scene tree before m","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_node_groups","description":"Set, add, or remove a node's group memberships in a .tscn scene file. Groups persist to disk so the running game can call get_tree().get_nodes_in_group(name).","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_node_properties","description":"Set one or more properties on a node in a .tscn scene. This is THE tool for changing node properties, including resources. ALWAYS use it (or create_scene/add_node) to change scenes; never edit .tscn files as text. Values are read according to each property's type: \\u2022 numbers, bools, strings; enums by name (\"Nearest\", \"TEXTURE_FILTER_NEAREST\") or number \\u2022 Vector2/3: {x, y[, z]} or [x, y[, ","write_action":false,"price_micros":0,"input_schema":null},{"name":"setup_autoload","description":"Register, unregister, or list autoload singletons. Autoloads are scripts/scenes loaded automatically at project start.","write_action":false,"price_micros":0,"input_schema":null},{"name":"snap_node_to_grid","description":"Snap a Node3D position to a grid in local or global space. Useful for modular level building and keeping 3D scenes aligned.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_scene","description":"Stop the currently running scene in the Godot editor. Always stop the scene before editing code to avoid errors repeating every frame.","write_action":false,"price_micros":0,"input_schema":null},{"name":"take_screenshot","description":"Capture the current viewport of the running game and save it as a PNG. REQUIRES the game to be running with the MCPRuntime autoload connected (run_scene with wait_for_runtime=true first). Returns resource_path, absolute_path, width, height, and (optionally) base64_png. Default save location is res://addons/godot_mcp/cache/screenshots/.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_project_settings","description":"Update one or more Godot project settings. Pass a dictionary of setting paths to their new values. Use list_settings first to discover available setting paths, current values, and valid options for a category. For input action bindings, prefer configure_input_map — if you do pass input/* keys here, partial updates are merged safely (existing events are preserved).","write_action":true,"price_micros":0,"input_schema":null},{"name":"validate_script","description":"Validate a GDScript file for syntax errors using Godot's built-in parser. Good for ordinary project scripts after editing. For @tool/editor-plugin addon scripts this isolated parser path may return valid:false with diagnostics_available:false because dependencies and editor context are not fully loaded; in that case, use get_errors/get_console_log after enabling or reloading the addon for actionab","write_action":false,"price_micros":0,"input_schema":null},{"name":"wait","description":"Sleep server-side. Useful between input events to let the game process them. Capped at 30000ms / 30s. Pass either ms or seconds (ms wins if both given).","write_action":false,"price_micros":0,"input_schema":null},{"name":"write_file","description":"Write UTF-8 text content to any file in the project. Creates the file if missing; REFUSES to clobber an existing file unless overwrite=true. Parent directories are auto-created (override with create_dirs=false). Refuses to write to plugin source (anywhere under res://addons/godot_mcp/ except res://addons/godot_mcp/cache/) unless force=true. Refuses paths containing \"..\" or \".\" traversal segments (","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":74,"grade":"B","scanned_at":"2026-11-01T06:16:15.763Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-01T06:16:15.687Z","components":{"code":{"score":13,"max":25,"notes":["37 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 15 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.shell-concat","severity":"high","component":"code","title":"Shell command built from a string (injection risk)","evidence":"dist/index.js: …= 'win32') { const output = execSync(`netstat -ano | findstr :${port} | findstr LISTENING`, { encoding: …"}],"inputs":{"packages":[{"registryType":"npm","identifier":"godot-mcp-server","version":"0.6.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-10-17T14:02:51.365Z","repositoryUrl":"git+https://github.com/tomyud1/godot-mcp.git","weeklyDownloads":980}],"repo":{"found":true,"owner":"tomyud1","repo":"godot-mcp","archived":false,"pushedAt":"2026-10-17T14:01:05Z","stars":448,"forks":52,"openIssues":16,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/61199390?v=4","ownerCreatedAt":"2020-02-18T15:58:13Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/61199390?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":448,"forks":52,"downloadsWeek":980,"license":"MIT","lastPushAt":"2026-10-17T14:01:05.000Z","score":55}}}},"grade_history":[],"reviews":[]}