{"ok":true,"site":{"host":"flow-studio-app.netlify.app","url":"https://flow-studio-app.netlify.app/","type":"live","desc":"Use the Godot Engine editor directly in your web browser, without having to install anything.","tools":[{"name":"godot_get_session_status","kind":"answer","impl":"imperative","description":"Returns live diagnostics for Godot WebEditor runtime, WebMCP native discovery, session revision, and WebGL health","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_restore_project_session","kind":"act","impl":"imperative","description":"Restores the persisted authoritative project into a fresh Godot Editor process after a page reload without changing scene revision or undo history","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_list_saved_projects","kind":"act","impl":"imperative","description":"Lists the projects kept in this browser, newest first. Every acknowledged persist writes a row keyed by project name, so a project you stopped working on can be returned to instead of being overwritten by the next one. Reports name, main scene, revision, file count, and when it was last saved.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_open_saved_project","kind":"act","impl":"imperative","description":"Opens a project kept in this browser by name, replacing the editor with it. The current project is persisted to the library first, so switching away never loses it. Restores that project's files, main scene, and revision; undo history is session state and does not travel with the library row.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"project_name":{"type":"string","description":"A name from godot_list_saved_projects"}},"required":["project_name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_import_asset","kind":"act","impl":"imperative","description":"Imports a binary asset - image, font, audio (.wav/.ogg/.mp3), or model (.glb/.gltf) - into the RUNNING Godot editor and makes it loadable, without restarting. Supply the bytes as content_base64, or a public http(s) url to fetch (the server fetches it, because this page is cross-origin isolated and cannot; the URL must end in an importable extension and must not resolve to a private address). The asset becomes a real project file: it survives editor restarts and is included in godot_export_zip. Place an imported model into a scene with godot_node_instance. Reports what Godot confirmed - that it sees the file, its size on disk, and whether it imported into a loadable resource - rather than assuming the write succeeded.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"Project-relative or res:// path, for example sfx/pickup.wav. Omit it when passing a url and the file name from the url is used."},"content_base64":{"type":"string","description":"Base64 of the raw file bytes. Give this or url, not both.","maxLength":7000000},"url":{"type":"string","description":"http(s) URL of an asset to fetch and import. Fetched by the server, not the browser, and only from a public address; the URL must end in an importable extension."},"reimport":{"type":"boolean","default":true,"description":"Ask Godot to import it into a loadable resource"}},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_get_user_focus","kind":"answer","impl":"imperative","description":"Reports what the human is currently pointed at in the editor: which nodes they have selected, which workspace they are in, which script is open and at what line, and which scene is being edited. Use it to resolve a pronoun - \"make this taller\", \"rename that\" - instead of asking which node was meant. Reports selection_count 0 rather than guessing when nothing is selected, and is read-only: it never changes the selection or the workspace.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_adopt_open_project","kind":"act","impl":"imperative","description":"Adopts the project Godot currently has open into this browser's project library, without restarting the editor. Use it when the editor is holding a project the bridge did not create - one made through Godot's own project manager - which otherwise cannot be listed, reopened, or persisted. Reads the open project's text files back out of the editor filesystem and publishes them as the active project. Binary assets are named in skipped_files rather than carried, because the bridge's project model is text; the WebMCP addon itself is never adopted.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"project_name":{"type":"string","description":"Overrides the name; defaults to the project's own application/config/name"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_get_operation_status","kind":"answer","impl":"imperative","description":"Returns status and final results for long-running authoring operations that outlive a browser tool-call deadline","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"operation_id":{"type":"string","description":"Specific operation ID; omit to inspect the active and recent operations"},"after_sequence":{"type":"integer","description":"Return immediately if operation sequence is newer than this value"},"wait_ms":{"type":"integer","minimum":0,"maximum":15000,"default":5000,"description":"Max ms to wait for a change before returning"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_author_3d_runner","kind":"act","impl":"imperative","description":"Transactionally authors the complete Neon Skyrail 3D runner with chase camera, elevated skyrail, 8 coral hazards, 11 energy pulses, and Dawn Gate","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"project_name":{"type":"string","default":"neon_skyrail_3d"},"idempotency_key":{"type":"string","description":"Unique mutation key"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_synthesize_audio_suite","kind":"act","impl":"imperative","description":"Procedurally synthesizes a 6-piece 16-bit PCM sound suite in the browser, with duration, loudness and MIT licence metadata. By default this only returns previews: pass import_into_project to write them into the project as ordinary .wav files, imported by Godot like any other asset, plus an sfx_library.gd convenience wrapper. They appear in the FileSystem dock, load() returns an AudioStreamWAV, and they can be assigned to an AudioStreamPlayer in the Inspector. Reports per-file what Godot confirmed - that it imported and is loadable - rather than what was written.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"import_into_project":{"type":"boolean","default":false,"description":"Also write the suite into the running editor and import it"},"directory":{"type":"string","default":"sfx","description":"Project-relative folder for the imported files"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_semantic_playtest_step","kind":"act","impl":"imperative","description":"Executes a semantic playtest action (steer_left, steer_right, jump, boost, observe_state, restart_playtest) and returns structured telemetry","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["steer_left","steer_right","jump","boost","observe_state","restart_playtest"]},"step_duration_ms":{"type":"number","default":200}},"required":["action"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_get_game_telemetry","kind":"answer","impl":"imperative","description":"Reads project-owned runtime telemetry emitted as godot-game-telemetry events; never substitutes simulated state for custom games","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"default":10}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_export_zip","kind":"act","impl":"imperative","description":"Packages the active project and an explicit per-file provenance manifest into a standard downloadable ZIP archive","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"project_name":{"type":"string"},"provenance":{"type":"object","description":"Optional map of project paths to source/license/author/url metadata","additionalProperties":{"type":"object","properties":{"source":{"type":"string"},"license":{"type":"string"},"author":{"type":"string"},"url":{"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_begin_project_upload","kind":"act","impl":"imperative","description":"Begins a transport-safe staged custom-project upload; send each file through bounded sequential chunks before committing","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"project_name":{"type":"string"}},"required":["project_name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_upload_project_file_chunk","kind":"act","impl":"imperative","description":"Appends one bounded UTF-8 or base64 chunk to a staged project file using an exact decoded-byte offset","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"upload_id":{"type":"string"},"path":{"type":"string"},"encoding":{"type":"string","enum":["utf8","base64"],"default":"utf8"},"offset":{"type":"integer","minimum":0},"content":{"type":"string","maxLength":700000},"final":{"type":"boolean","default":false}},"required":["upload_id","path","offset","content"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_upload_project_chunk_batch","kind":"act","impl":"imperative","description":"Atomically appends up to four transport-safe project chunks in one call, with a 2 MiB decoded batch limit","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"upload_id":{"type":"string"},"chunks":{"type":"array","minItems":1,"maxItems":4,"items":{"type":"object","properties":{"path":{"type":"string"},"encoding":{"type":"string","enum":["utf8","base64"],"default":"utf8"},"offset":{"type":"integer","minimum":0},"content":{"type":"string","maxLength":700000},"final":{"type":"boolean","default":false}},"required":["path","offset","content"],"additionalProperties":false}}},"required":["upload_id","chunks"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_get_project_upload_status","kind":"answer","impl":"imperative","description":"Inspects staged project upload progress without returning uploaded contents","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"upload_id":{"type":"string"}},"required":["upload_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_abort_project_upload","kind":"act","impl":"imperative","description":"Removes one staged project upload and all of its persisted chunks without changing the active Godot project","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"upload_id":{"type":"string"}},"required":["upload_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_commit_project_upload","kind":"act","impl":"imperative","description":"Validates and transactionally boots a completed staged project through the same acknowledged custom-project authoring path","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"upload_id":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["upload_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_create_project","kind":"act","impl":"imperative","description":"Creates a Godot project from a built-in template or an explicit file set, and REPLACES the running editor to open it. Because that takes several seconds it may return {status: 'pending', operation_id} instead of a result - poll godot_get_operation_status until it reports succeeded before calling any other tool, or the next call will be refused while the editor is being torn down. Audio is never staged into a project: add it afterwards with godot_synthesize_audio_suite, and other assets with godot_import_asset.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"project_name":{"type":"string","default":"echoes_of_the_orbital_garden"},"template":{"type":"string","enum":["orbital_garden","neon_skyrail_3d","arcade_2d","custom"],"default":"orbital_garden","description":"orbital_garden is a 3D sanctuary with a CharacterBody3D player and camera; neon_skyrail_3d is a 3D endless runner; arcade_2d is a side-on 2D scene with a CharacterBody2D runner, ground and camera; custom requires files."},"files":{"type":"object","description":"Custom dictionary of file paths to source strings/buffers to write into res://"},"idempotency_key":{"type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_inspect_project_files","kind":"act","impl":"imperative","description":"Inspects the authoritative in-memory project manifest and optionally returns selected text source files for revision-safe editing","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"},"maxItems":64},"include_content":{"type":"boolean","default":false}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_inspect_scene_graph","kind":"act","impl":"imperative","description":"Returns the durable authored Godot scene graph so collaborators can verify which visible objects are editable in the 3D editor, rather than runtime-only script output","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_apply_file_transaction","kind":"act","impl":"imperative","description":"Revision-checked atomic project edit. Eligible GDScript-only writes use the running editor hot channel; deletes and other project-file edits replace the editor. It commits only after the applicable acknowledgement and records an undo snapshot.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expected_revision":{"type":"integer","minimum":1},"label":{"type":"string"},"operations":{"type":"array","minItems":1,"maxItems":64,"items":{"type":"object","properties":{"kind":{"type":"string","enum":["write","delete"]},"path":{"type":"string"},"content":{"type":"string"}},"required":["kind","path"],"additionalProperties":false}},"idempotency_key":{"type":"string"}},"required":["expected_revision","operations"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_apply_script_patch","kind":"act","impl":"imperative","description":"Revision-checked GDScript creation or exact-patch editing applied to the RUNNING Godot editor without replacing it. Copies candidate bytes into the live editor filesystem, has Godot refresh and recompile the script on a deferred editor frame, and publishes only after Godot acknowledges the path, source hash, and compilation. A compile failure restores the previous bytes and leaves the revision untouched. It never launches the game or restarts the editor. With workspace follow enabled it opens the Script workspace at the changed lines; with follow disabled it preserves the current workspace and only reveals the file in the FileSystem dock. Reports changed line ranges, before/after hashes, compilation result, diagnostics, persistence, navigation, and preview freshness as independent facts.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expected_revision":{"type":"integer","minimum":1},"path":{"type":"string","description":"res:// path of the .gd script to create or edit."},"content":{"type":"string","description":"Complete script source. Use for creation or full replacement; mutually exclusive with patches."},"patches":{"type":"array","minItems":1,"maxItems":32,"description":"Exact search/replace patches applied to the existing script source.","items":{"type":"object","properties":{"find":{"type":"string","minLength":1},"replace":{"type":"string"},"expected_occurrences":{"type":"integer","minimum":1,"maximum":100,"default":1}},"required":["find","replace"],"additionalProperties":false}},"attach_to_node_path":{"type":"string","description":"Optional scene-relative node path to attach the script to through the editor UndoRedo stack."},"attach_scene_path":{"type":"string","description":"Scene whose authoritative .tscn source records the attachment. Defaults to the main scene."},"label":{"type":"string"},"idempotency_key":{"type":"string"}},"required":["expected_revision","path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_apply_text_patch","kind":"act","impl":"imperative","description":"Applies exact revision-checked search/replace patches to project text files, then delegates to the same acknowledged editor/runtime transaction and undo path","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"expected_revision":{"type":"integer","minimum":1},"label":{"type":"string"},"patches":{"type":"array","minItems":1,"maxItems":32,"items":{"type":"object","properties":{"path":{"type":"string"},"find":{"type":"string","minLength":1},"replace":{"type":"string"},"expected_occurrences":{"type":"integer","minimum":1,"maximum":100,"default":1}},"required":["path","find","replace"],"additionalProperties":false}},"idempotency_key":{"type":"string"}},"required":["expected_revision","patches"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_undo_transaction","kind":"act","impl":"imperative","description":"Restores the exact project snapshot captured by the most recent acknowledged authoring transaction. Hot GDScript transactions undo through the running editor without a restart; transactions that changed other project files may replace the editor.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"undo_id":{"type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_select_node_live","kind":"act","impl":"imperative","description":"Selects a node in the live Godot Editor scene dock through the WebMCP editor command channel. Fails explicitly when the channel is unavailable; never fabricates selection success.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string"}},"required":["node_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_transform_node_live","kind":"act","impl":"imperative","description":"Transforms a node in the live Godot Editor through the editor command channel and its UndoRedo stack. Viewport-only: it does not rewrite the .tscn text — use godot_node_transform for a transform that persists to source.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string"},"translation":{"type":"array","items":{"type":"number"},"description":"Absolute position [X, Y, Z]"},"rotation":{"type":"array","items":{"type":"number"},"description":"Rotation in degrees [Pitch, Yaw, Roll]"},"scale":{"type":"array","items":{"type":"number"}},"relative":{"type":"boolean","default":false}},"required":["node_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_connect_signal_live","kind":"act","impl":"imperative","description":"Connects a signal on the live scene - Area3D body_entered to a handler, Timer timeout to a callback - through Godot's own undo stack, and records it in the scene source as a [connection] entry. The target method must already exist on the receiving node's script: a connection to a missing method is refused by name here, because Godot would accept it and then only warn at load. Applied without restarting the editor.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"from_node":{"type":"string","description":"Node emitting the signal"},"signal":{"type":"string","description":"Signal name, for example body_entered"},"to_node":{"type":"string","default":".","description":"Node whose script has the handler (defaults to the scene root)"},"method":{"type":"string","description":"Method on to_node to call"}},"required":["from_node","signal","method"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_inspect_property_live","kind":"answer","impl":"imperative","description":"Reads a live Inspector property from the edited scene through the editor command channel. Omit `property` to list the editable property names of the node.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string"},"property":{"type":"string"}},"required":["node_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_generate_audio_fx","kind":"act","impl":"imperative","description":"Synthesizes procedural 16-bit WAV sound effects (laser, explosion, pickup) and writes them to res://<filename>.wav","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"type":{"type":"string"},"duration":{"type":"number"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_switch_mode","kind":"act","impl":"imperative","description":"Switches the visible Godot main-screen workspace. Reports which workspace the editor is actually showing afterwards, read back from the visible editor control, rather than echoing the request - a switch that did not take says so.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"mode":{"type":"string","enum":["2D","3D","Script","Game","AssetLib"],"description":"Which main-screen editor to show"}},"required":["mode"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_open_scene","kind":"act","impl":"imperative","description":"Opens a res:// scene in the live Godot Editor through the editor command channel. This changes the edited scene only; use godot_apply_file_transaction to change project.godot run/main_scene.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"scene_path":{"type":"string"}},"required":["scene_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_set_property","kind":"act","impl":"imperative","description":"Sets one property on a node in the edited scene - light energy, camera fov, a body's mass, gravity_scale, visible - through Godot's own undo stack, and reads the value back from the node afterwards. Primitives, Vector2/Vector3 and Color only: a property that holds a resource is refused by name, because setting one blind is how a scene ends up looking right and being wrong. Use godot_node_material for materials and godot_node_transform for position, rotation and scale. This edits the EDITOR scene; it does not reach into a running game.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string","description":"Path or name of the node"},"property":{"type":"string","description":"Property name as Godot spells it, for example light_energy"},"value":{"description":"Number, boolean, string, [x, y], [x, y, z], or a #rrggbb colour"}},"required":["node_path","property"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_run_game","kind":"act","impl":"imperative","description":"Runs the project in the WebGL Game viewport","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_stop_game","kind":"act","impl":"imperative","description":"Stops the running game and returns to the editor","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_send_input","kind":"transact","impl":"imperative","description":"Dispatches a keyboard event to the game canvas and reports any subsequent project-owned telemetry without claiming unverified gameplay acknowledgement","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"key":{"type":"string","description":"DOM KeyboardEvent name, used as both `key` and `code`: ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Space, Enter, KeyW, KeyA, KeyS, KeyD. Godot's default ui_* actions are the arrow keys and Space."},"pressed":{"type":"boolean"},"duration_ms":{"type":"integer","minimum":20,"maximum":5000},"await_telemetry":{"type":"boolean","default":true},"target":{"type":"string","enum":["auto","editor","game"],"default":"auto","description":"Which Godot canvas to address. 'auto' follows the visible tab."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_send_input_sequence","kind":"transact","impl":"imperative","description":"Schedules a bounded timeline of keyboard down/up edges in one call for chords, diagonals, jumps, dodges, and other coordinated controls","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"events":{"type":"array","minItems":1,"maxItems":32,"items":{"type":"object","properties":{"at_ms":{"type":"integer","minimum":0,"maximum":10000},"key":{"type":"string","description":"DOM KeyboardEvent name, used as both `key` and `code`: ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Space, Enter, KeyW, KeyA, KeyS, KeyD. Godot's default ui_* actions are the arrow keys and Space."},"pressed":{"type":"boolean"}},"required":["at_ms","key","pressed"],"additionalProperties":false}},"target":{"type":"string","enum":["auto","editor","game"],"default":"auto","description":"Which Godot canvas to address. 'auto' follows the visible tab."}},"required":["events"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_get_input_sequence_status","kind":"answer","impl":"imperative","description":"Returns planned and actual dispatch timing for one coordinated keyboard sequence, or recent sequences when no ID is supplied","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"sequence_id":{"type":"string"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_capture_viewport","kind":"act","impl":"imperative","description":"Captures the pixel buffer of the editor viewport or the running playtest canvas as a base64 PNG data URL","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"target":{"type":"string","enum":["auto","editor","game"],"default":"auto","description":"Which Godot canvas to address. 'auto' follows the visible tab."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_send_pointer","kind":"transact","impl":"imperative","description":"Dispatches mouse/pointer input at Godot canvas coordinates and reports dispatch geometry without claiming unverified gameplay acknowledgement","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["move","down","up","click","wheel"]},"x":{"type":"number","minimum":0},"y":{"type":"number","minimum":0},"button":{"type":"string","enum":["left","middle","right"],"default":"left"},"delta_y":{"type":"number","default":0},"target":{"type":"string","enum":["auto","editor","game"],"default":"auto","description":"Which Godot canvas to address. 'auto' follows the visible tab."}},"required":["action","x","y"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_start_recording","kind":"act","impl":"imperative","description":"Starts a real MediaRecorder capture of the visible Godot game canvas; optionally auto-stops and persists after a bounded duration","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"fps":{"type":"integer","minimum":10,"maximum":60,"default":30},"mime_type":{"type":"string","description":"Optional MediaRecorder MIME override, for example video/webm or video/webm;codecs=vp8,opus"},"duration_ms":{"type":"integer","minimum":500,"maximum":60000,"description":"Optional in-page auto-stop duration for precise persistence without a second Browser round trip"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_stop_recording","kind":"act","impl":"imperative","description":"Stops the active canvas recording, persists the WebM blob in IndexedDB, and exposes a durable download link in the viewport","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_list_recordings","kind":"act","impl":"imperative","description":"Lists recordings persisted for this deployed origin and restores a visible download link for the newest artifact","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_get_logs","kind":"answer","impl":"imperative","description":"Retrieves engine logs and stdout telemetry","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"limit":{"type":"number","default":50}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_diagnose_session","kind":"answer","impl":"imperative","description":"Diagnoses current-generation Godot logs and recovery state into structured platform, project-source, persistence, lifecycle, and fatal-engine issues. Reports ownership, impact, evidence, and only remedies the agent can safely perform; read-only and never mutates the project.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"since_ms":{"type":"number","minimum":0,"description":"Optional lookback window in milliseconds. Omit to inspect the full current editor generation."}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_camera_focus","kind":"act","impl":"imperative","description":"Transient viewport-only framing: selects a node, dispatches Godot's own spatial_editor/focus_selection so the editor camera eases to it, and anchors the on-page focus reticle to the node's projected screen position. Reports what it measured, not what it attempted: status is 'framed' only when the viewport pose actually changed, 'dispatched_unconfirmed' when the shortcut was delivered but the camera did not move (Godot only advances camera interpolation while rendering, so a backgrounded tab reports this), 'overlay_only' without the editor plugin, or 'yielded' during the 750 ms cooldown after user input. target_reached additionally requires the node to project inside the frame. Never mutates scene JSON, advances scene_revision, creates an undo entry, triggers autosave, or survives a project reload. Yields to the user for 750 ms after any pointer, wheel, or key input on the viewport.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string","description":"Node name or scene-relative path to frame"}},"required":["node_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_camera_follow","kind":"act","impl":"imperative","description":"Enables or disables automatic camera follow for this browser session. When enabled, a geometry change (node added, moved, or deleted) queues exactly one coalesced framing move; material-only changes never move the camera. The preference is stored in sessionStorage and is also exposed as the Auto follow control in the page rail.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Omit to read the current preference without changing it"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_workspace_follow","kind":"act","impl":"imperative","description":"Enables or disables visible workspace following for this browser tab, and chooses how strongly a script edit follows. In mode 'file' (the default) a script edit never takes the screen: the changed file is revealed in the FileSystem dock and the current workspace is preserved. In mode 'script' a script edit also opens the Script workspace at the changed lines. 3D node changes switch to the 3D workspace and select the edited node in both modes. The state is persisted in sessionStorage and mirrored by the Follow agent control.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Omit to read the current preference without changing it"},"mode":{"type":"string","enum":["file","script"],"description":"'file' reveals the edited script in the FileSystem dock and leaves the workspace alone; 'script' opens the code at the changed lines"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_spawn","kind":"act","impl":"imperative","description":"Adds a 3D mesh node with position, rotation, scale, and material to the live scene. This is visual geometry only: it has no collision, so nothing stands on it and nothing collides with it. Use godot_node_body for floors, walls, solid props and trigger volumes, and godot_node_instance to place an imported model. Applied through the editor command channel without restarting the engine when the WebMCP editor plugin is present; otherwise falls back to a full editor restart. Reports the measured elapsed time and which channel was used.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Unique name of the 3D node"},"parent_path":{"type":"string","default":".","description":"Parent node path (defaults to root .)"},"mesh_type":{"type":"string","enum":["box","cylinder","sphere","torus","prism","capsule","plane"],"default":"box"},"size":{"type":"array","items":{"type":"number"},"description":"Vector3 dimensions [x, y, z] for box/prism"},"radius":{"type":"number","description":"Radius for sphere/cylinder/capsule"},"height":{"type":"number","description":"Height for cylinder/capsule/prism"},"inner_radius":{"type":"number","description":"Inner radius for torus"},"outer_radius":{"type":"number","description":"Outer radius for torus"},"position":{"type":"array","items":{"type":"number"},"description":"3D position coordinates [X, Y, Z]"},"rotation":{"type":"array","items":{"type":"number"},"description":"3D rotation in degrees [Pitch, Yaw, Roll]"},"scale":{"type":"array","items":{"type":"number"},"description":"3D scale factors [sx, sy, sz]"},"material":{"type":"object","properties":{"albedo_color":{"type":"string","description":"Hex color (e.g. #538dda) or rgba string"},"metallic":{"type":"number","minimum":0,"maximum":1},"roughness":{"type":"number","minimum":0,"maximum":1},"emission":{"type":"string","description":"Hex emissive color"},"emission_energy":{"type":"number","description":"Emissive energy multiplier"}},"additionalProperties":false}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_spawn_2d","kind":"act","impl":"imperative","description":"Adds a 2D node to the live scene: a coloured rect, a label, a polygon, a line, or a sprite from an imported texture. Positions are in pixels with +Y downward, which is Godot's 2D convention and the opposite of the 3D tools. Use godot_node_body_2d for anything that needs collision. Applied through the editor command channel without restarting the engine. Requires a 2D scene open - create one with the arcade_2d template or godot_open_scene.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Unique name of the node"},"node_type":{"type":"string","enum":["rect","label","polygon","line","sprite"],"default":"rect"},"parent_path":{"type":"string","default":".","description":"Parent node path (defaults to root .)"},"position":{"type":"array","items":{"type":"number"},"description":"Pixel position [x, y], +Y downward"},"rotation":{"type":"number","description":"Rotation in degrees"},"scale":{"type":"array","items":{"type":"number"},"description":"Scale factors [sx, sy]"},"size":{"type":"array","items":{"type":"number"},"description":"Pixel size [w, h], for rect"},"color":{"type":"string","description":"Hex colour, for rect / polygon / line"},"text":{"type":"string","description":"Text, for label"},"width":{"type":"number","description":"Stroke width, for line"},"points":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Points [[x, y], ...] for polygon and line"},"texture":{"type":"string","description":"res:// path of an imported texture, for sprite"}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_body_2d","kind":"act","impl":"imperative","description":"Adds a 2D physics body with a collision shape - and by default a matching coloured rect - to the live scene. Static for level geometry, rigid for something that falls, character for something a script drives, area for a trigger. Positions are in pixels with +Y downward. The body, its collider and its rect are created in one undo action. Applied through the editor command channel without restarting the engine.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Unique name of the body node"},"body_type":{"type":"string","enum":["static","rigid","character","area"],"default":"static"},"shape":{"type":"string","enum":["rect","circle","capsule"],"default":"rect"},"parent_path":{"type":"string","default":".","description":"Parent node path (defaults to root .)"},"size":{"type":"array","items":{"type":"number"},"description":"Pixel size [w, h], for a rect shape"},"radius":{"type":"number","description":"Radius in pixels, for circle and capsule"},"height":{"type":"number","description":"Height in pixels, for capsule"},"mass":{"type":"number","default":1,"description":"Mass, for body_type rigid"},"visible_rect":{"type":"boolean","default":true,"description":"Set false for an invisible collider or trigger"},"color":{"type":"string","description":"Hex colour of the rect"},"position":{"type":"array","items":{"type":"number"},"description":"Pixel position [x, y], +Y downward"},"rotation":{"type":"number","description":"Rotation in degrees"},"scale":{"type":"array","items":{"type":"number"},"description":"Scale factors [sx, sy]"}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_body","kind":"act","impl":"imperative","description":"Adds a physics body with a collision shape - and, by default, a matching visible mesh - to the live 3D scene. This is what a floor, a wall, a solid prop or a pickup trigger needs: godot_node_spawn creates visual geometry only, so nothing stands on it and nothing collides with it. Choose static for level geometry, rigid for something that falls and is pushed, character for something a script drives, area for a trigger volume that detects overlap without blocking. The body, its collider and its mesh are created in one undo action and move together as one node. Applied through the editor command channel without restarting the engine when the plugin is present.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Unique name of the body node"},"body_type":{"type":"string","enum":["static","rigid","character","area"],"default":"static","description":"static = immovable level geometry; rigid = simulated, falls and is pushed; character = script-driven; area = trigger volume that detects overlap without blocking"},"parent_path":{"type":"string","default":".","description":"Parent node path (defaults to root .)"},"mesh_type":{"type":"string","enum":["box","sphere","capsule","cylinder","plane"],"default":"box","description":"Shape of both the collider and the visible mesh. prism and torus are not offered: they have no analytic collision shape."},"size":{"type":"array","items":{"type":"number"},"description":"Vector3 dimensions [x, y, z] for box; [width, depth] for plane"},"radius":{"type":"number","description":"Radius for sphere/capsule/cylinder"},"height":{"type":"number","description":"Height for capsule/cylinder"},"thickness":{"type":"number","default":0.2,"description":"Slab thickness for a plane floor. A zero-thickness floor lets fast bodies tunnel through it."},"mass":{"type":"number","default":1,"description":"Mass, for body_type rigid"},"visible_mesh":{"type":"boolean","default":true,"description":"Set false for an invisible collider or trigger volume"},"position":{"type":"array","items":{"type":"number"},"description":"3D position coordinates [X, Y, Z]"},"rotation":{"type":"array","items":{"type":"number"},"description":"3D rotation in degrees [Pitch, Yaw, Roll]"},"scale":{"type":"array","items":{"type":"number"},"description":"3D scale factors [sx, sy, sz]"},"material":{"type":"object","properties":{"albedo_color":{"type":"string","description":"Hex color (e.g. #538dda) or rgba string"},"metallic":{"type":"number","minimum":0,"maximum":1},"roughness":{"type":"number","minimum":0,"maximum":1},"emission":{"type":"string","description":"Hex emissive color"},"emission_energy":{"type":"number","description":"Emissive energy multiplier"}},"additionalProperties":false}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_instance","kind":"act","impl":"imperative","description":"Places an imported model or saved scene into the live 3D scene as a child node: a .glb or .gltf imported with godot_import_asset, or a .tscn already in the project. Use this for anything that came from an asset file - godot_node_spawn only builds Godot's own primitive meshes and cannot place a model. The instantiated node moves, rotates and scales like any other node via godot_node_transform, and its own sub-nodes belong to the imported scene, so they are reported rather than editable from here. Applied through the editor command channel without restarting the engine when the plugin is present.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Unique name for the new node in this scene"},"scene_path":{"type":"string","description":"res:// path of the model or scene to instantiate, for example res://models/crystal.glb"},"parent_path":{"type":"string","default":".","description":"Parent node path (defaults to root .)"},"position":{"type":"array","items":{"type":"number"},"description":"3D position coordinates [X, Y, Z]"},"rotation":{"type":"array","items":{"type":"number"},"description":"3D rotation in degrees [Pitch, Yaw, Roll]"},"scale":{"type":"array","items":{"type":"number"},"description":"3D scale factors [sx, sy, sz]"}},"required":["name","scene_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_transform","kind":"act","impl":"imperative","description":"Translates, rotates, or scales a 3D node in the live editor scene. Applied through the editor command channel without restarting the engine when the WebMCP editor plugin is present; otherwise falls back to a full editor restart.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string","description":"Path or name of the node in the scene tree"},"position":{"type":"array","items":{"type":"number"},"description":"New position coordinates [X, Y, Z]"},"rotation":{"type":"array","items":{"type":"number"},"description":"New rotation angles in degrees [Pitch, Yaw, Roll]"},"scale":{"type":"array","items":{"type":"number"},"description":"New scale factors [sx, sy, sz]"},"relative":{"type":"boolean","default":false,"description":"If true, offsets existing transform instead of setting absolute values"}},"required":["node_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_material","kind":"act","impl":"imperative","description":"Updates the albedo, metallic, roughness, and emissive properties of a 3D node material. Applied through the editor command channel without restarting the engine when the WebMCP editor plugin is present; otherwise falls back to a full editor restart. Material changes never move the camera.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string","description":"Path or name of the node"},"albedo_color":{"type":"string","description":"Albedo color hex or rgb"},"metallic":{"type":"number","minimum":0,"maximum":1},"roughness":{"type":"number","minimum":0,"maximum":1},"emission":{"type":"string","description":"Emission color hex"},"emission_energy":{"type":"number","description":"Emission energy multiplier"}},"required":["node_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"godot_node_delete","kind":"transact","impl":"imperative","description":"Removes a 3D node from the live scene tree. Applied through the editor command channel without restarting the engine when the WebMCP editor plugin is present; otherwise falls back to a full editor restart.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"node_path":{"type":"string","description":"Path or name of the node to remove"}},"required":["node_path"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]}],"category":"Developer Tools","favicon":"/favicons/flow-studio-app.netlify.app.png","apiSurface":"spec","toolCount":57}}