io.github.Aureliolo/gdharness
NPM · GDHARNESS
A harness for driving a Godot 4 project from an agent: addons, runtime bridge, MCP server, CLI.
Available components
Last scanned (4 hours ago)
Scores higher than 69% of npm servers
Category Testing and QA
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security63
- No malware found by supply-chain analysis.Pass
- Known CVEs could not be checked: the version this server declares is not published in its registry.Unverified
- No install/post-install scripts declared.Pass
- Dependency health could not be checked: the version this server declares is not published in its registry.Unverified
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Aureliolo/gdharness). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability68
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 44204 tokens (~1381/item across 32 items; 31 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management88
- Stability check failed: the tool surface changed between 1.1.31 and 1.3.80: 0 tool removals, 7 breaking changes, 1 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 31 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 33 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Known CVEs: unverified → pass ▲ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Dependency health: unverified → pass ▲ functional
- Package version: 1.3.77 → 1.3.80 functional
- Package version: 1.3.77 → 1.3.79 functional
- Package version: 1.3.77 → 1.3.78 functional
- 4 Nov 26 +15
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Known CVEs: unverified → pass ▲ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Dependency health: unverified → pass ▲ functional
- Package version: 1.3.72 → 1.3.77 functional
- Package version: 1.3.72 → 1.3.76 functional
- Package version: 1.3.72 → 1.3.75 functional
- Package version: 1.3.72 → 1.3.74 functional
- Package version: 1.3.72 → 1.3.73 functional
- 3 Nov 26 −27
- Malware scan: pass → unverified ▼ security
- Known CVEs: pass → unverified ▼ security
- Dependency health: pass → unverified ▼ functional
- Package version: 1.3.67 → 1.3.72 functional
- Package version: 1.3.67 → 1.3.71 functional
- Package version: 1.3.67 → 1.3.70 functional
- Package version: 1.3.67 → 1.3.69 functional
- Package version: 1.3.67 → 1.3.68 functional
- 1 Nov 26 +15
- Stability: fail → unverified ▼ security
- Known CVEs: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Dependency health: pass → unverified ▼ functional
- Package version: 1.3.60 → 1.3.67 functional
- Package version: 1.3.60 → 1.3.66 functional
- Package version: 1.3.60 → 1.3.65 functional
- Package version: 1.3.60 → 1.3.64 functional
- Package version: 1.3.60 → 1.3.63 functional
- Package version: 1.3.60 → 1.3.61 functional
- 31 Oct 26 +12
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → pass ▲ functional
- Package version: 1.3.54 → 1.3.60 functional
- Package version: 1.3.54 → 1.3.59 functional
- Package version: 1.3.54 → 1.3.58 functional
- Package version: 1.3.54 → 1.3.57 functional
- Package version: 1.3.54 → 1.3.56 functional
- Package version: 1.3.54 → 1.3.55 functional
- 30 Oct 26 −16
- Malware scan: pass → unverified ▼ security
- Known CVEs: unverified → pass ▲ security
- Dependency health: unverified → pass ▲ functional
- Package version: 1.3.47 → 1.3.54 functional
- Package version: 1.3.47 → 1.3.53 functional
- Package version: 1.3.47 → 1.3.51 functional
- Package version: 1.3.47 → 1.3.50 functional
- Package version: 1.3.47 → 1.3.49 functional
- Package version: 1.3.47 → 1.3.48 functional
- 29 Oct 26 −9
- Known CVEs: pass → unverified ▼ security
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Dependency health: pass → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 1.3.44 → 1.3.47 functional
- Package version: 1.3.44 → 1.3.46 functional
- Package version: 1.3.44 → 1.3.45 functional
- 28 Oct 26 +14
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Known CVEs: pass → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Dependency health: pass → unverified ▼ functional
- Package version: 1.3.40 → 1.3.44 functional
- Package version: 1.3.40 → 1.3.43 functional
- Package version: 1.3.40 → 1.3.42 functional
- Package version: 1.3.40 → 1.3.41 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/gdharness@1.3.80
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Aureliolo/gdharness |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Aureliolo/gdharness/.github/workflows/release.yml@refs/tags/v1.3.80 |
| Rekor log index | 3692878113 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:7be98f78a984c1ec3191a7ba8fd6e7caeafc25869b936fd6322cbf3c8162dc0e40b5efa57f171335fbee54eba8b545e7ab5faf3f4fbfe7a4bf45f63a6 |
Background: How many MCP packages publish verified provenance →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
debug_breakpoint Breakpoints ~613
Sets, removes or lists breakpoints. A set on a script that is not there, past its last line, or on a line the engine never stops on, is refused, naming the next line it does stop on. The engine stops only where a statement starts, on a match branch, and on a member variable with a type or a value. So a blank or comment line, a func line, an else, a declaration and the later lines of a statement are refused. A remove takes any line, and with no editor connected answers removed false, saying why, when none was held there. Set them first, then editor_run, and the game stops where you asked. With the editor connected it goes through the editor's debug adapter. With none, it is held here. A game this server starts itself, which editor_run start does for a run given args, savesIn, env or silent, for a headless run of a project whose editor plays its games with a window, or with no editor, is handed every breakpoint held here as it starts, and one set while that game runs reaches it, and the set answers once the game has taken it, which it does between frames, so a call made after the answer stops there (runningGame says so). Such a game does not stop on a script error, so a run that meets one carries on past it: editor_output has the error with where it happened, and a breakpoint on that line stops the game before the line runs. The editor keeps a breakpoint set this way for one play, so every breakpoint this server holds is sent again before each play editor_run starts, and the start answer lists them under breakpoints. The set is also kept in the project, for the server that comes after a reconnect: a breakpoint stays until it is removed here, whichever server set it. Every answer lists the whole set under held, and the breakpoints the user set in the editor's own gutter under setInEditor. Setting one here never takes those away, and removing a line here clears it whoever set it. Godot clears every breakpoint in the editor when a debug session opens unless network/debu…
| Name | Type | Req | Description |
|---|---|---|---|
| line | integer | – | One-based line. Only for ops set, remove. |
| op | string | yes | What to do. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scriptPath | string | – | Script file inside the project, such as "scripts/player.gd". Only for ops set, remove. |
No output schema declared.
No examples provided.
debug_control Step the debugger ~566
Pauses, continues or steps the debugged game. A step waits for the game to stop again and answers with the stack where it ended up. One that has not stopped the game again within ten seconds answers heldAgain false and no stack. A game the editor plays is moved through the editor's debug adapter, which cannot pause or step out: it answers a pause by reporting the game stopped and leaving it running, and implements no stepOut, so hold such a game with a breakpoint and step over or into from there. A game this server started itself has its keeper as its debugger, which does both: pause breaks into the game wherever it is, a script spinning in a loop included, which is how a game hung on its first frame is asked where it is. For such a game a step that ends in gdharness's runtime addon, as one past a function's last line does when the addon's _process runs next, is stepped on to the game's own script as a pause is. Since the engine reports every stop the same way, a step that stops on a line holding a breakpoint says onBreakpoint under held, whether the step ended there or ran into it. Operations: pause: stop a game this server started where it is, answering with the stack. The game takes it between frames, and in a script every 2048 lines it runs, so a loop that sleeps between few lines can take seconds. The call waits thirty, and past that answers paused false with the request still standing. Stopped between frames, where no script runs, the game is stepped on to the next line of script it runs, and stopped in gdharness's runtime addon, an autoload whose _process runs first in every frame, on to the next line of the game's own script, for up to five seconds. One whose stack is still the addon's after them says so in a note. A pause that reaches a game a breakpoint has just stopped makes the engine print an error, which the run's output keeps as info with raisedBy debug_control pause; continue: resume after a breakpoint; step_over: run the current line; step_into: ru…
| Name | Type | Req | Description |
|---|---|---|---|
| op | string | yes | What to do. |
No output schema declared.
No examples provided.
debug_state Debugger state ~1,021
Where the debugged game is stopped: the stack trace, what is in scope at a frame with the values, or the debugger's console output so far, its last thousand lines, with any earlier ones counted under notShown. For a game this server started the output is what the game printed. The errors and warnings it reported, with where each happened, are in editor_output, which also has what it printed once it has ended, as its debugger ends with it. For a game this server started, its keeper's debugger answers: each frame names its script as the project spells it under script and on this machine under path, and held says which thread stopped and why. For a game the editor plays, the editor's debug adapter answers. A stop is reported by the editor's adapter only to the sessions connected when it happened, so a server that connected afterwards, which is every server after a reconnect, is shown a thread and no frames about a game still sitting at its breakpoint. That server asks the runtime instead: a held game accepts a connection and never answers, and the refusal then says held rather than running, and that the stack cannot be read from here. debug_control continue lets it go, and the next stop is one this session is told about, with its stack. A function that awaited is resumed with no caller below it, since the call that started it returned at the await, so its frame is the only one. A value inside an array or a dictionary is shown as the engine prints it: a String quoted, a StringName as &"name", a NodePath as ^"path" and a whole float with .0. In a game this server started, a typed array or dictionary is typed as declared, such as Array[String], and a list or a dictionary shows its first 20 entries and says how many more it holds. An evaluate such as items.slice(20, 40) reads the rest. Members lists the script's variables and not its constants, which an evaluate reads by name. The variables give an object as its class and instance id only, and evaluate reads into it: an e…
| Name | Type | Req | Description |
|---|---|---|---|
| expression | string | – | evaluate: a GDScript expression, as Godot's Expression class parses it: members of self by name, locals, autoloads and global classes, operators, indexing and calls, such as wave.spawned[0] or Ledger… |
| frameId | number | – | variables, evaluate: which frame, from a stack answer. Default the innermost. A frame the stack no longer holds is refused, and a scope whose values did not arrive in time answers variables null and… |
| op | string | – | What to do. |
No output schema declared.
No examples provided.
editor_capture Capture the editor's view of a scene ~451
A picture of a scene as the editor's 2D or 3D view draws it, including what its @tool scripts draw under Engine.is_editor_hint(). No game and no headless engine runs that branch, so runtime_capture cannot show it. The editor opens the scene, shows its 2D or 3D view for a few frames and captures it. It then returns to the scene and view it showed before, and closes the scene again if it was not open. The view is the editor's own, at its zoom and scroll for that scene, and in 3D with its grid and gizmos. A scene open with unsaved changes is captured as the editor holds it. Other calls to the editor wait for the capture. Needs a connected editor that draws: a visible one, or a hidden one on Windows. A hidden editor on Linux or macOS is headless and is refused. The tool reference in the gdharness skill, and the site, say what every field of the answer means.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | – | Scale the picture to this height. Given alone, the width keeps the picture's proportions. |
| inline | boolean | – | Send the picture back in the answer. Default true, as a JPEG when that is smaller than the PNG and the picture has no transparency. false sends none and needs outputPath. |
| outputPath | string | – | Also save the picture as a lossless PNG at this absolute path. The answer says where. Refused unless it ends in .png, its directory exists, it is outside the project, and no file is there already. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scenePath | string | yes | Scene file inside the project, such as "scenes/main.tscn" or "res://scenes/main.tscn". |
| view | string | – | Which of the editor's views draws the scene. Default 3d for a scene whose root is a Node3D, and 2d otherwise. |
| width | integer | – | Scale the picture to this width. Given alone, the height keeps the picture's proportions. |
No output schema declared.
No examples provided.
editor_classes Engine classes ~506
The engine's ClassDB, with the classes the project's scripts declare beside it: find classes, read one in full, or walk an inheritance tree. The project's classes are read from the scripts on disk, so one written a moment ago is there before any scan. query and inheritance answer them under project_classes, project_children and project_descendants, each with its path, what it extends and whether it is abstract. info reads engine classes only, and a project class is read in full by script_info structure. Operations: query: classes matching a filter or category, the engine's and the project's; info (needs className): methods, properties, signals and enums of one class, or one member of it by name. Each property of a class that can be made carries default, the value a new one holds; inheritance (needs className): ancestors and descendants of one class, an engine class or one a project script declares. Default query.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | query: limit to one family. Only for op query. |
| className | string | – | info, inheritance: the class. Only for ops info, inheritance. |
| filter | string | – | query: a substring of the class name. Only for op query. |
| includeInherited | boolean | – | info: also name every member the class inherits, under inherited: one entry per ancestor, nearest first, with the names of the methods, properties, signals and enums it declares. The class's own memb… |
| instantiableOnly | boolean | – | query: leave out abstract classes: an engine class that cannot be instantiated, and a project class that is @abstract or built on an engine class that cannot be. A class extending an @abstract one is… |
| member | string | – | info: one member by name, a method, property, signal, enum or constant, with its signature and which class declares it, looked for on the class and every ancestor. The whole of Control is seventy tho… |
| op | string | – | What to do. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
No output schema declared.
No examples provided.
editor_launch Open, restart or close the editor, or bind its debug adapter again ~1,181
Opens the Godot editor on a project, or restarts or closes the one already connected, or binds its debug adapter again. close saves open scenes, quits the editor and waits for its process to go, which is the only way to end a hidden one short of killing it. An editor this server opened that has not connected yet has nothing of this server's to save, so close stops its process instead. open answers once the process has started, and the editor dials in after its import. A call needing the editor made before then waits for the one this server opened, for as long as a restart waits, and is refused naming it if it has not arrived. open refuses while an editor of the project is already running and has not reached this server, naming its pid, rather than putting a second on the project. The editor is an ordinary visible one on the desktop in use, and on Windows it is shown without being activated, so opening or reopening it does not take the keyboard from whatever the user is typing in. hidden: true opens it out of sight instead. On Windows it gets a desktop of its own, shared by the games it plays, and still draws its views for editor_capture. On Linux and macOS it is headless, so editor_capture refuses it. A hidden editor serves the bridge, the language server and the debug adapter as a visible one does. A game a visible editor plays opens as a window on the desktop in use. An editor goes on serving the addon it read at startup, so restart is what puts a gdharness upgrade into effect, and nothing else here restarts one. It saves open scenes on the way out. An editor a server opened is started again by the server, hidden or visible and silent or not as it was started unless hidden or silent says otherwise, once the old one has gone: it waits 90 seconds for that, or GDHARNESS_EDITOR_RESTART_TIMEOUT_MS, and an old editor still running after it is not replaced, since the new one would find its ports held. One opened by hand restarts itself, which only one with a window can…
| Name | Type | Req | Description |
|---|---|---|---|
| hidden | boolean | – | Open the editor out of sight, with the games it plays: on a desktop of its own on Windows, and headless elsewhere. Default false on open: one visible editor, shown without taking the focus. On restar… |
| op | string | – | What to do. |
| projectPath | string | – | Absolute path to the project directory, the one holding project.godot. Only for op open. |
| silent | boolean | – | Open the editor with no sound out of the machine, started with --audio-driver Dummy, so a tool script, a preview or a scene playing in its viewport is heard by nobody. Default true on open, and on re… |
No output schema declared.
No examples provided.
editor_output Game and editor output ~1,283
What the project started by editor_run has printed, as entries with a severity: the errors and warnings the engine reported, each with where it happened, and everything else as info. For a run the editor plays the reports come from the game itself, through the runtime addon, since the editor's debugger relays what a game prints and not what it reports. A played game without the runtime addon answers here with its prints alone, with errorsUnread true and no clean, since what it raised reaches nothing here. A run answers with counts and a verdict: clean is true when no error was reported, and warnings, counted beside it, do not make it false. heldAt is three answers: null for a run this server knows is not held, running or over, an object for one it knows is held at a breakpoint, whether the adapter said so or the runtime did by accepting a connection and never answering, and absent with heldUnknown beside it for a server that connected to the debugger after the stop and has no runtime to ask, since the adapter reports a stop only to the sessions connected when it happened. A run that has quit still answers here, with running false and its exit code, until the next one starts. A run ended by a signal has no exit code, and exitSignal names the signal instead. A run this server started also answers with transcript, the file both its streams are written to: uncapped, written while the run is going, and the thing to read or tail for a long run rather than the engine's own log, which every engine start rotates away. Read the file for output and this answer for state: endedBy says whether gdharness ended the run, and a transcript that has stopped growing is a run between prints rather than a run that is over. running is asked of the operating system whenever there is a process to ask about, which is every run this server started and every editor-played run whose game announced its runtime. For an editor-played run that never announced, there is no process id here and runni…
| Name | Type | Req | Description |
|---|---|---|---|
| before | integer | – | How many lines above a repeated group to carry with it, counting only lines that are not themselves part of a group. Default 3. The line that explains a wall of identical errors is the last ordinary… |
| contains | string | – | Only entries mentioning this text, matched against everything the run has printed rather than against the entries this answer would otherwise carry: a line is found however much was printed after it. |
| cpu | boolean | – | Also answer with cpuSeconds, the processor time the run has used. Default false, because asking costs a subprocess. Worth it when elapsedMs is climbing and nothing is being printed: processor time st… |
| limit | integer | – | The most entries to answer with, newest kept. Identical entries come back as one, at the first of them, with times saying how many were printed, so the limit counts distinct entries. Default 200, and… |
| op | string | – | What to do. |
| projectPath | string | – | The project whose output you mean to read. It picks nothing, since this reads the one run or editor this server holds, and a call naming another project than that one's is refused rather than answere… |
| severity | string | – | The least severe entry to include. Default info, which is everything. |
| sinceLastCall | boolean | – | Only entries this has not already answered with at this severity. Default false. Measured per severity floor and not across them, so polling for errors leaves the rest of the output for a later read… |
No output schema declared.
No examples provided.
editor_rescan Rescan the project ~1,439
Makes the running editor scan the project filesystem, so files written outside it are picked up. A scan or an import the editor is already running is waited out first rather than scanned over, which would start a second import over it. The scan the editor runs on its own, when its window takes the focus or files change under it, is a change-detecting walk rather than an unconditional reparse. A file another engine has already imported reads as settled there and the walk does not look inside it. Its class_name then stays out of the list the editor resolves against, however often the editor scans on its own. Any class in that state is named under unseenByEditor, which no check on disk can see. Calling it again is the cure, with no change to the declaring script. editor_launch restart also does it and costs a window, and project_import refresh_classes does not: it rewrites the cache and does not touch what the editor is holding. The walk also passes over a file whose .uid alone changed, so the editor keeps the old UID and every engine reading its cache warns of a duplicate. Before scanning, each file whose .uid names a UID the editor does not hold for it is read again and named under uidsReread, and files on disk naming one UID between them are named under uidsDuplicatedOnDisk, which reading again cannot settle. A class the scan brings in is named under broughtIn, and every script naming it is reloaded in the editor and named under dependentsReloaded: what the editor compiled from them while it could not see the class stays compiled that way after the scan, and a script extending a new base class went on reporting "Could not find base class" until reloaded. One that would not reload is named under dependentsNotReloaded and the call is not ok, as it is not when the script named in reloadScript was not reloaded. A script that fails to compile is tried again once the scripts it is compiled against that the editor holds behind their files are reloaded, which are named und…
| Name | Type | Req | Description |
|---|---|---|---|
| listMembers | boolean | – | With reloadScript: also answer the whole member lists, heldBeforeReload and reloadedMethods for the methods, heldConstantsBeforeReload and reloadedConstants for the constants, each with what the scri… |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| reloadScript | string|array | – | A script to recompile in the editor after the scan, or a list of them recompiled in that order, for the half a scan does not reach: a script the editor has loaded keeps the copy it built, that copy i… |
| timeoutMs | integer | – | How long to wait for the scan. Default 30000. |
No output schema declared.
No examples provided.
editor_run Run the game ~4,123
The run: starting the project, stopping it, or booting it once to see whether it comes up clean. start keeps it running and collecting output until it quits or is stopped, windowed where there is a display and headless where there is not, unless headless says otherwise. Only runtime_capture needs the window. A run that quits on its own is kept, so a scene that prints an answer and quits is start, then editor_output until running is false. What runs is a scene: a SceneTree script is not an entry point here, so put the script on the root of a scene of its own and name that in scene. args hands the game its own flags, the ones it reads with OS.get_cmdline_user_args(), and a run carrying any is started by this server rather than by the editor. check boots it headless for a few frames, waits for it to quit, and answers with the verdict: whether it came up, and every error and warning it printed on the way. start and check both wait first for a scan the open editor is running and for the class cache it writes just after, since a game booted in between resolves no global class, as does every other engine this server starts on the project. waitedForEditorScanMs says how long, and scanNote says when a scan ran past thirty seconds and the game started during it. Then whatever changed on disk since it was imported is imported, and named under importedFirst. A start waits for the game to become something the runtime_* tools can talk to and says which it is under runtime: listening with the port it took, or why not, so the first call after a start does not have to be made twice. One server holds one run: a start ends that run first when it is of the same project, and is refused while it is of another. When it is not listening, mayYetAnnounce says whether that is final: false is a runtime that is not coming, true is a game still on its way up, which editor_status will see and runtimeWaitMs waits longer for, and the note then says what a runtime_* call naming no projectPath meets…
| Name | Type | Req | Description |
|---|---|---|---|
| andChildren | boolean | – | stop: also end what the game started for itself, with OS.create_process or otherwise, such as a bench's workers and whatever those started in turn. Only the processes under the run's, to any depth, t… |
| args | array | – | The game's own arguments, what OS.get_cmdline_user_args() answers, such as ["--level=2"]. The separator is added here, so a flag the engine reads goes to the game instead, and the answer says so unde… |
| callersOf | string | – | profile: also answer, under callers, where the project's scripts name this function in code: its name, or Class.name for the functions of one class. Each place has its script, line, the named functio… |
| engineArgs | array | – | The engine's own flags, before the separator, such as ["--verbose"] or ["--max-fps", "60"], a value going as the next entry. Only those that change what the engine logs, draws for debugging, checks o… |
| env | object | – | Environment variables for this run alone, as a map of strings, over the server's own environment. Like savesIn, a run carrying any is started by this server rather than played by the editor. Names be… |
| executable | string | – | start: an exported build to run instead of the project, as a path inside the project such as export/windows/game.exe, so what a player runs can be measured. It takes args, engineArgs, savesIn, env, h… |
| frames | integer | – | check: frames to run before quitting. Default 3. Only for op check. |
| graceful | boolean | – | stop, and a start that ends the run going before it: ask the game to close first, the way a player's close asks it, so its own handling of a close runs, which a game keeping a crash mark needs to tak… |
| headless | boolean | – | start: force a window or no window. The editor plays a game headless only when the project's editor/run/main_run_args holds --headless, so a headless start of a project whose editor plays with a wind… |
| limit | integer | – | profile: how many functions to answer with, those with the most self time. Default 30. Only for op profile. |
| mark | boolean | – | profile: answer as usual and set the run's mark at these totals, so a later profile with since: "mark" answers for one action, a press or a commit, apart from the boot and everything before it. The m… |
| op | string | – | What to do. |
| pid | integer | – | stop: a game of this project that no server here is holding, by its process id as editor_status lists it under runtimes: one a server before a reconnect started and left no note for, or one started s… |
| profile | boolean | – | start: profile the run's GDScript with the engine's own script profiler from its start, for editor_run profile to answer which functions took the time. A run this server starts dials the process that… |
| projectPath | string | – | Absolute path to the project directory, the one holding project.godot. stop, wait, profile: optional, the project whose run is meant. A run of another project is refused rather than touched. |
| runtimeWaitMs | integer | – | start: how long to wait for the game to announce its runtime before answering. Default 5000, or half as long again as the slowest of the last five boots of the same scene when that is more, up to 600… |
| savesIn | string | – | An absolute directory for this run's user://, so a game that saves writes nowhere near the copy somebody plays: opening a save writes the one being left, and a game that autosaves writes on its own.… |
| scene | string | – | A scene to run instead of the main scene. Only for ops start, check. |
| silent | boolean | – | start: run the game with no sound out of the machine, by starting the engine with --audio-driver Dummy: every stream still plays and every playback position still advances, so what is playing can sti… |
| since | string | – | profile: "mark" answers only what was added after the mark that mark: true set in this run: per function the calls and self and total milliseconds since it, with the functions that added no call left… |
| suites | string|array | – | start: gdUnit4 suites to play instead of a scene, a suite file or a test directory inside the project or a list of them, as project_test's path takes them, though always whole: an entry naming one ca… |
| timeoutMs | integer | – | check: how long to give the boot before it is called hung. Default 60000. wait: how long to wait for the run to end before answering anyway. Default 600000. Only for ops check, wait. |
| visible | boolean | – | start: on Windows, show the window on the desktop in use. By default a windowed run this server starts goes on a desktop of its own, where it renders and runtime_capture works but the window never sh… |
No output schema declared.
No examples provided.
editor_status Editor status ~379
Whether the editor addon is connected, which Godot answers, whether the editor is playing something, and which games with the runtime addon are reachable, of this project and of every other on the machine. Read connected with mayYetConnect: the editor dials this server and backs off between tries, so for the first half-minute after a server starts false means not reached yet as often as no editor. mayYetConnect true is worth waiting out, false is final, and editorCannotConnect, restartInterrupted, restartUnderway, closedHere and editorsNotYetConnected say why. An editor that has connected and not yet greeted reports nothing about itself, and every other call made in that window waits up to ten seconds for it to settle. playingInEditor null means unanswered rather than nothing playing: processActive and runtimes do not depend on the editor answering. game.run names the run editor_output and editor_run stop answer for, and stays named after it ends. addonIsStale, on a connected editor and on each running game (absent with neither), says it runs addon code other than what this server ships, and staleNote says which half moves: the project, by a gdharness upgrade it spells out to run in a shell, the editor by a restart, or this server by a reconnect. A false editor.lspListening or editor.dapListening comes with serversNote: editor_launch rebind binds the debug adapter again in place, and editor_launch restart the language server. editor.scan says whether the editor is scanning, which editor_run waits out before starting a game. A game announced in a protocol this server does not speak is listed under unreadable, during an upgrade that moves the protocol, until the halves match. The tool reference in the gdharness skill, and the site, say what every field of the answer means.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
project_dependencies Project dependencies ~945
What a resource depends on, or what depends on it.
| Name | Type | Req | Description |
|---|---|---|---|
| depth | integer | – | forward: how many levels to follow, 1 being what the file loads itself. Default unlimited, which follows every class_name use too and can reach most of a project, about a megabyte of answer. A depth… |
| direction | string | – | forward: what this resource loads or names. Each file named by its path carries kind, as reverse words it: ext_resource, extends, preload, load, include, or path for a path only written in a string,… |
| fileTypes | array | – | reverse: extensions to look in, plus "godot" for project.godot, "cfg" for plugin.cfg and export_presets.cfg, and "import" for import sidecars. Default all of tscn, tres, gd, gdshader, gdshaderinc, go… |
| includeBuiltin | boolean | – | forward: include the engine's own res://. resources. Default false. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| resourcePath | string | yes | File inside the project, such as "sprites/hero.png" or "materials/steel.tres". |
No output schema declared.
No examples provided.
project_export Export ~1,217
Export presets and exports. add_preset writes a preset to export_presets.cfg with the keys the editor's Project > Export writes for a new one and every option a new preset of its platform shows, each at its default, and makes it the platform's runnable preset when the platform has none. set_preset changes a preset's export path, its resource filter and the files it lists, its include and exclude filters, its custom features and its platform's options, and answers under changed what each held before and holds now, and under unchanged what already held the value given, with saved false when that is all of it, since the file is then not written. Nothing is written when any of it is refused. The option names are the exporter's own, as the Export dialog's Options tab shows them by their paths, such as binary_format/embed_pck, and a name the platform does not have is refused with the nearest it has, or all of them when none is near. An option the dialog shows only while another is on, such as codesign/identity behind codesign/enable, is taken when the preset has that one on or the same call turns it on, and otherwise refused naming what shows it. A secret option, such as a signing password, is written to .godot/export_credentials.cfg, where the editor keeps secrets out of the committed file, and its value is never answered. A file an option names that is not there is written and listed under missing_files, or for a secret its option under secretsNamingNoFile. remove_preset takes a preset out, and when it was its platform's runnable preset the next of that platform becomes it, under runnableNow, which is null when the platform has no other. A secret it held is taken out with it. It answers where this engine's export templates belong and whether the preset's platform has them, since an export needs them. list says the same for every preset. An editor open on the project does not see a preset added this way until it restarts. run first imports whatever changed on disk since…
| Name | Type | Req | Description |
|---|---|---|---|
| customFeatures | string | – | set_preset: the custom feature tags the export carries, comma-separated, or empty for none. Only for op set_preset. |
| debug | boolean | – | run: a debug export. Default false. Only for op run. |
| excludeFilter | string | – | set_preset: the files to leave out, as comma-separated patterns such as "*.txt", or empty for none. Only for op set_preset. |
| exportFilter | string | – | set_preset: what the preset exports: every resource, the scenes listed in files and what they use, the resources listed, or every resource but those listed. What a scene or a resource uses is what th… |
| files | array | – | set_preset: the files the filter lists, as res:// paths. Each must be in the project, and for scenes each must be a scene. Only for op set_preset. |
| includeFilter | string | – | set_preset: the non-resource files to export too, as comma-separated patterns such as "*.json, data/*", or empty for none. Only for op set_preset. |
| op | string | yes | What to do. |
| options | object | – | set_preset: platform options by name, such as {"binary_format/embed_pck": true, "debug/export_console_wrapper": "No"}. An enum takes the name the dialog shows or its number, and is written as the num… |
| outputPath | string | – | Where the export is written, inside the project. The directory is created if it is not there: Godot's command-line exporter refuses a missing one with "The given export path doesn't exist", which rea… |
| pack | boolean | – | run: export the resources alone, as a .pck or a .zip by outputPath, which needs no export templates and runs with an engine of the same version. A pack is a release export, so debug is refused beside… |
| platform | string | – | add_preset: the platform the preset exports for. Only for op add_preset. |
| preset | string | – | Preset name from export_presets.cfg. add_preset: the name of the new one. Only for ops run, add_preset, set_preset, remove_preset. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
No output schema declared.
No examples provided.
project_import Asset imports ~1,170
The import pipeline: what needs importing, how a resource is imported, reimports, UIDs, and the global class list the editor and the engine read. Operations: status: which resources are outdated or failed, or one resource with resourcePath, each with its reason and a status the summary counts: needs_reimport (out of date, or a file the engine imports that has never been imported), failed, up_to_date, missing_source, or not_imported (a file the engine does not import at all, with why). Judged by content, with the checks the editor makes before a reimport: a sidecar changed since its import (as setting an option without a reimport leaves it), a sidecar with no uid or written for another file, an output under .godot/imported that is gone (missing_outputs) or changed, and a source whose hash differs from the one its import recorded or has no record. Beyond the editor, a glTF scene whose import does not depend on an image it names, because it was built before that image was imported (imported_without). A scene whose import runs an import script is not judged on images. failed is an import that failed, which the editor never tries again on its own. Without resourcePath, a sidecar whose source is gone is listed as missing_source; options (needs resourcePath): the import options of one resource; set_options (needs resourcePath, options): change import options in the sidecar, then apply them with a reimport of that resource; reimport: reimport what status says is outdated or failed, one resource with resourcePath, or what is current as well with force. Through the open editor when one serves the project, so it reloads what it holds, waiting for it to finish, and otherwise through the engine's own import pass. The editor scans first, since its reimport passes over a file it has not taken in, such as one an installer has just written, and what that scan imported is not imported again unless force asks. Either takes in every file that is behind, not only the one asked for. Whe…
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | reimport: reimport even what is current. Default false. Only for op reimport. |
| includeUpToDate | boolean | – | status: list resources that are current as well. Default false. Only for op status. |
| op | string | yes | What to do. |
| options | object | – | set_options: import options keyed as the .import file spells them, {"compress/mode": 1}. A dictionary option whose keys are numbers, a font's opentype_features or any option already holding number ke… |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| reimport | boolean | – | set_options: reimport afterwards, answered under reimport as project_import reimport answers. Default true. Only for op set_options. |
| resourcePath | string | – | File inside the project, such as "sprites/hero.png" or "materials/steel.tres". Only for ops status, options, set_options, uid, reimport. |
| timeoutMs | integer | – | reimport, set_options: how long to wait for the editor to finish reimporting. Default 300000. Only for ops reimport, set_options. |
No output schema declared.
No examples provided.
project_info Project info ~436
What a project is: its name and main scene from project.godot, the Godot that answers, and how many scenes, scripts and assets (images, fonts, sound, models, video and shaders) it holds, other counting every remaining file, leaving out the .import and .uid files the engine writes beside others, the addons gdharness installed and any folder holding a .gdignore, with optional sections on top.
| Name | Type | Req | Description |
|---|---|---|---|
| addonClasses | array | – | For classes: the addons, by their folder under res://addons, whose classes are listed by name and script like the project's own, rather than counted under inAddons. Default none. Addon classes can ou… |
| detail | string | – | full adds what to do about it to every validation finding. Default summary. |
| include | array | – | Extra sections: registered autoloads, the classes the project's scripts declare with class_name, each with its script, read from the files (those an addon declares counted per addon under inAddons, u… |
| preset | string | – | For validation: the export preset to validate against. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
No output schema declared.
No examples provided.
project_search Search the project ~317
Searches text or a regular expression across project files and returns file paths with line numbers, one entry per line that holds the query, however often it holds it. total_matches counts those lines. Skipped: names starting with a dot, node_modules, any directory holding a .gdignore (named under not_searched when the search passed one) and the addons gdharness installed. A path naming one of those folders, or a place inside one, is searched as asked, and note says the whole-project search steps over it. Each line is searched on its own, so a query holding a line break is refused.
| Name | Type | Req | Description |
|---|---|---|---|
| caseSensitive | boolean | – | Default false. |
| fileTypes | array | – | Extensions to search, such as ["gd", "tscn"]. Default: every text file. When none of the files searched has one of them, note says so and names the extensions there are. |
| maxResults | integer | – | How many matching lines to answer. Default 100. Past it truncated is true, and the summary still counts the whole search. |
| path | string | – | A folder or file inside the project to search, such as "res://src". Default: the whole project. One that is not there is refused, naming the project's folders. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| query | string | yes | The text or pattern to find. |
| regex | boolean | – | Read the query as a regular expression. Default false. |
No output schema declared.
No examples provided.
project_settings Project settings ~1,911
Reads or writes project.godot (settings, autoloads, the main scene, input actions and plugins) and the audio bus layout, default_bus_layout.tres unless audio/buses/default_bus_layout names another. project_info include lists the autoloads, input actions and audio buses as the project holds them. A write with an editor open on the project is handed to the editor, which takes the settings the write names from the file (named under editorAdopted), even one the file already held, or reloads the bus layout, so it does not save the old values back over them. An enabled plugin's code still loads on the editor's next start, and enable_plugin notes a script it would not load. add_autoload refuses a name the editor's Autoload tab refuses: not an identifier, a keyword, a built-in type, an engine class or a class_name of the project. A global constant's name, such as KEY_A, is not checked. add_input_action on an existing action, a ui_ one included, replaces its events, and its deadzone when one is given. A set of the value the setting already holds, in the same type, writes nothing. unset takes a setting's line out of project.godot, and on one the file does not set it writes nothing. Every write changes only the lines of the settings it names and keeps every other line as the file had it, in its place. A setting res://override.cfg or the project_settings_override file sets is one a run lays over project.godot and the editor does not. Operations: get: read one setting, or every setting under prefix; set (needs setting, value): write one setting; unset (needs setting): take a setting out of project.godot, so the engine default holds; add_autoload (needs name, path): register an autoload singleton; remove_autoload (needs name): unregister an autoload; set_main_scene (needs scenePath): choose the scene the game starts in; add_input_action (needs actionName, events): register an input action and its events, or rebind one that exists; remove_input_action (needs actionName): remove a…
| Name | Type | Req | Description |
|---|---|---|---|
| actionName | string | – | Input action name, such as "jump". Only for ops add_input_action, remove_input_action. |
| busIndex | number | – | Audio bus index. Only for ops set_audio_bus_effect, set_audio_bus_volume, set_audio_bus_send. |
| busName | string | – | Audio bus name. Only for ops add_audio_bus, remove_audio_bus, rename_audio_bus. |
| deadzone | number | – | Input actions: analogue deadzone, 0 to 1. Default: the deadzone of the action being rebound, or 0.5 for a new one. Only for op add_input_action. |
| effectIndex | number | – | Slot on the bus for the effect: the effect there is replaced, and one past the last adds one. Any other slot is refused. Only for op set_audio_bus_effect. |
| effectType | string | – | Effect class, such as "AudioEffectReverb". Only for op set_audio_bus_effect. |
| enabled | boolean | – | add_autoload: Godot 4 loads every autoload in the list, so false is refused. Use global: false to keep the name out of the global scope, or remove_autoload to stop it loading. set_audio_bus_effect: w… |
| events | array | – | The events that trigger the action, each bound to every device, as the editor binds them. A read names device only on an event bound to one device. Only for op add_input_action. |
| from | string | – | get: where to read. Default disk, which starts a short-lived engine and reads project.godot, needs no editor and is what an automatic check can reproduce. editor asks the open editor instead, which c… |
| global | boolean | – | Autoloads: make the name a global variable, the * in project.godot and the editor's "Global Variable" column. Default true. The autoload loads either way. Only for op add_autoload. |
| name | string | – | Autoload name. add_autoload on a name already registered replaces its entry, as the editor's Add does, and answers action updated with old_path, the path it held, which no longer loads. Only for ops… |
| newBusName | string | – | rename_audio_bus: the name the bus takes. Every bus sending to it is sent to the new name (named under resent), and every scene and resource line giving a node the old bus is rewritten (named under r… |
| op | string | yes | What to do. |
| parentBusIndex | number | – | Audio buses: the bus to send to. Default 0, Master. The new bus goes right after it, so every later bus moves one along, and the answer lists them all. Only for op add_audio_bus. |
| path | string | – | Autoload script or scene inside the project. Only for op add_autoload. |
| pluginName | string | – | Folder name under addons/. Only for ops enable_plugin, disable_plugin. |
| prefix | string | – | get: answer with every setting whose name starts with this, and the type the engine registers for each, a typed array or dictionary with what it holds as project.godot writes it (Dictionary[String, b… |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scenePath | string | – | Scene file inside the project, such as "scenes/main.tscn" or "res://scenes/main.tscn". Only for op set_main_scene. |
| sendTo | string | – | set_audio_bus_send: the name of the bus to send to, one before this bus, as the editor offers them. A later bus, the bus itself or a name the layout does not have is refused. Only for op set_audio_bu… |
| setting | string | – | Setting path, such as "display/window/size/viewport_width". Only for ops get, set, unset. |
| value | – | – | The value to write, fitted to the type the setting is registered as, the way scene_node set fits a property. Engine types may be written as their fields, {"x": 1, "y": 2}, or tagged, {"_type": "Vecto… |
| volumeDb | number | – | Bus volume in decibels. Only for op set_audio_bus_volume. |
No output schema declared.
No examples provided.
project_test Run tests ~1,482
Runs the project's gdUnit4 suites in one engine and answers with every case that did not pass, with where it is and what its assertion said. The class list is rebuilt first, so a suite written a moment ago is found. What changed on disk since it was imported is then imported before any suite runs. On Windows and Linux the run gets a user:// of its own, away from a player's saves. On macOS the engine reads user:// off HOME, so it writes where the player keeps theirs. The run is headless unless a suite in it needs a window as gdharness test reads it, and then has one, on a desktop of its own on Windows. A run that found nothing to run is never called a pass, and names the path it looked in. A script that does not load stops gdUnit4 before any suite runs, and an autoload that does not compile stops the run at once. A client sending a progress token is told as each suite finishes, and at least every twenty seconds. A run whose every case passed is still not called passed when it printed a script error no case failed on. gdUnit4 fails a case only on the script errors its logger sees, and it cannot see a stack overflow. Needs gdUnit4 under addons/gdUnit4. The tool reference in the gdharness skill, and the site, say what every field of the answer means.
| Name | Type | Req | Description |
|---|---|---|---|
| engineArgs | array | – | The engine's own flags for the run, such as ["--verbose"], a value going as the next entry. Only those that change what the engine logs, draws for debugging, checks on the GPU, which renderer draws,… |
| failFast | boolean | – | Stop each suite at its first failing case. Default false: every case runs. With it on, the counts cover only what ran. notRun counts the cases left. Each run after a fix then finds the next failure.… |
| ignore | array | – | Suites, cases or rows to leave out, as "suite_name", "suite_name:test_name", or "suite_name:test_name:N" for one row of a parameterised case, N being the zero-based index gdUnit4 reports the row unde… |
| path | string|array | – | A test directory or suite file inside the project, or a list of them, all run on one engine: a named set of suites boots once rather than once per suite. An entry given twice, or a suite inside a dir… |
| printed | string | – | Also answer with every line the run printed that contains this, under printed, whether it passed or not: a suite that prints a marker beside the numbers it measured carries them back without failing… |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| tests | array | – | Run only these cases of the suites under path, each "test_name" or "suite_name:test_name", the suite by its file name without .gd or its res:// path. Only the suites holding them run, with their othe… |
| timeoutMs | integer | – | How long the run may take before it is killed, counted from the engine starting it: the class rebuild and any import before it are outside the limit, and tookMs counts them. Default 600000. A run kil… |
No output schema declared.
No examples provided.
resource_edit Edit resources ~2,696
Resource files: read one, create any ClassDB resource as .tres, change one, write a shader, build a TileSet, or set a Theme colour or font size. A material is a create with resourceType StandardMaterial3D, ShaderMaterial or CanvasItemMaterial. read answers with the properties the file sets, in the form modify takes, with resourceType the engine class and scriptClass the class_name of its script when it declares one, and a Theme lists its items there as `Button/colors/font_color`, so a style box, a font or a constant is set through modify by that name, as `Button/styles/normal` given the res:// path of a StyleBox. A Curve, Curve2D or Curve3D reads as the inspector shows it (point_count, point_0/position and the rest), not as the _data list the file stores, wherever it is built in. create and modify answer each property given under properties as the file holds it once saved, in the same form. A property given its default is left out of a .tres file and named under notStored. loadsAs gives, as it loads, a value given that the resource's own script changes as the file loads. A create or modify whose properties made the engine change others, as a Gradient given more colours than offsets gives each new point an offset of 0, names each of those under alsoChanged with what it held before and holds now. A modify can drop a line the engine does not load, such as a shader parameter whose uniform was renamed. In a .tres file, alsoSaved lists each other property of the main resource that the save changed, added or dropped, as {property, was, saved} in the file's own text. An added entry has no was, a dropped one no saved. Embedded resources and values that read the same are not listed. read of a shader says whether it compiles under compiles, with compileErrors as create_shader gives them. A property holding a resource takes its res:// path. A file never imported is refused with the reimport that imports it. move takes any file of the project, a script or an image as much as a…
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | create_shader: the shader source, written as given. The answer says whether it compiles under compiles, and names each error the engine raised compiling it under compileErrors, with its line. Default… |
| color | object|string | – | set_theme_color: r, g and b from 0 to 1, with a optional and opaque by default, or an html code such as "#ff8000" or "#ff800080". Only for op set_theme_color. |
| colorName | string | – | set_theme_color: such as "font_color". Only for op set_theme_color. |
| controlType | string | – | Theme ops: the theme type, a Control or Window class such as "Button", or the name of a type variation, which can be any name. A name that is no such class is set as a variation and answered with a n… |
| fontSizeName | string | – | set_theme_font_size: such as "font_size". Only for op set_theme_font_size. |
| includeDefaults | boolean | – | read: include properties still at their default. Default false. Only for op read. |
| item | string | – | remove_theme_item: the item to take out, its kind and name as the file writes them, such as `colors/font_color` or `styles/normal`. Without it, every item of controlType goes, and the type with them,… |
| newPath | string | – | move: where it goes, inside the project, and for a file with the extension it has. A file goes with its .import and .uid, and a directory with everything in it. Every path naming what moved in a scen… |
| op | string | yes | What to do. |
| preview | boolean | – | move: answer with what would move and change, and write nothing. A move that would be refused is refused here too, with the same reason. Default false. Only for op move. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| properties | object | – | Properties to set, keyed by Godot property name. Vectors, colours and the like may be written as {"x": 1, "y": 2} or tagged {"_type": "Vector2", "x": 1, "y": 2}, which is the form a read answers with… |
| resourcePath | string | yes | File inside the project, such as "sprites/hero.png" or "materials/steel.tres". move: a directory too. read: also a resource kept inside a scene or resource file, by the path a read answers a property… |
| resourceType | string | – | create: the resource class, such as "PhysicsMaterial" or "StandardMaterial3D", or a class_name a project script declares, which the resource is made as with that script attached. With no editor open,… |
| script | string | – | create: a script to attach, for custom resources. Only for op create. |
| shaderType | string | – | create_shader. Only for op create_shader. |
| size | number | – | set_theme_font_size: pixels, a whole number of 1 or more. Only for op set_theme_font_size. |
| sources | array | – | Atlas sources, one per texture. A wholly transparent cell gets no tile, and the answer lists those cells as leftBlank. A strip at the right or bottom that no whole tile reaches is described in notInA… |
No output schema declared.
No examples provided.
runtime_capture Capture the screen ~840
A picture of the running game: the whole screen, one region or node of it at full resolution, or one viewport, as an image. The whole screen is the game's window, with the game's own dialogs and popups laid over it where they sit, also when a project opens them as windows of their own (subwindows not embedded). One of its windows lying outside the game's window, or minimised, is not in it, and viewport captures a shown one by its path. Needs the game running with a window. A capture asked for before the game's first frame is drawn waits for that frame, since the game announces itself before it and the viewport holds nothing it drew until then. Operations: screenshot: the screen; viewport: one viewport's texture. Default screenshot.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | – | Scale the image to this height. Given alone, the width keeps the picture's proportions. |
| inline | boolean | – | Send the picture back in the answer. Default true, as a JPEG when that is smaller than the PNG and the picture has no transparency (the text says so, with both sizes), since every picture an answer c… |
| nodePath | string | – | screenshot: capture only where this node is drawn, as runtime_inspect rect answers it: a Control's rectangle, what a 3D node's geometry covers, or what a Sprite2D draws. A node with a position and no… |
| op | string | – | What to do. |
| outputPath | string | – | Also save the picture as a lossless PNG at this absolute path, for somebody to open later or a script to compare. The answer says where. Refused unless it ends in .png, its directory exists, it is ou… |
| pid | number | – | Which game, when several are running from one project, such as a bench and its workers: its process id, as editor_status lists under runtimes. Without it the game this server started or plays is the… |
| projectPath | string | – | Which game, when more than one is running: the project directory it was started from. A call naming neither projectPath nor pid goes to the game this server started or is playing, named under answere… |
| region | object | – | screenshot: capture only this rectangle of the window, at the game's own pixels: x, y, width and height in window pixels, or the window rectangle runtime_inspect rect answers, passed as it came. A re… |
| viewportPath | string | – | viewport: the Viewport node. Default the root viewport. A Window of the game that is hidden or minimised has nothing drawn to it, and is refused naming which. Only for op viewport. |
| width | integer | – | Scale the image to this width. Given alone, the height keeps the picture's proportions. |
| zoom | integer | – | Enlarge the picture this many times, each pixel made a square of pixels rather than blended with its neighbours, so a thin line or a corner can be read. Not with width or height. Default 1. |
No output schema declared.
No examples provided.
runtime_input Send input to the game ~3,493
Input to the running game: a whole click on a Control or a 3D node named by path or by the words on it, an item chosen out of a menu, typing into the focus, or a raw action, key, mouse button, mouse motion or drag, touch or finger drag. All of it works headless, where the viewport is the project's window size and the GUI only takes what is inside it. On gdharness's own desktop, where a windowed run goes, Windows refuses to say where the pointer is: every pointer answer there carries pointer_on_hidden_desktop, and the run's first pointer_note says why it matters: get_mouse_position() on the root window, and what derives from it, reads nonsense, while what reads the event itself (the control under it, hover, tooltips, input handlers) gets the injected position. A native window no real pointer has entered gets no hover from Godot, so the runtime supplies it there and the answers say hover_supplied. Operations: click: press and release on a Control, a frame apart, named by nodePath or by says (found under nodePath when both are given), or on a 3D node where it is drawn. A control hidden in a ScrollContainer is scrolled to first. A RichTextLabel link is pressed where its words are drawn. A disabled button, a control that does not process and one mouse_behavior_recursive turned off are refused, since the press would do nothing. By says, a reachable one is picked over it; choose (needs nodePath): take an item out of a menu, by its words or its place in the list: the menu is opened, the item found as it stands then and pressed through the engine's own path, which needs no window and not ui_accept's binding. A disabled or hidden button in front of the menu is refused, and so is a press the menu did not take; action (needs action): press an action, or hold it; key (needs keycode): press a key, or hold it. Not for a menu a click has opened: an OptionButton or PopupMenu pops up as a window of its own that a key never reaches, so arrows move nothing and Enter closes it unchosen…
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | action: the InputMap action name. A Viewport never hands an action to a shortcut, so the buttons whose Shortcut holds the action are sent it as their Shortcut too, and pressed as by the key bound to… |
| alt | boolean | – | key: hold Alt with it. Default false. Only for op key. |
| axis | string|number | – | joypad_motion: the stick or trigger axis, by name (left_x, left_y, right_x, right_y, trigger_left, trigger_right) or by its JoyAxis number. Only for op joypad_motion. |
| button | string|number | – | click, mouse_click, mouse_drag: left, right, middle, wheel_up or wheel_down, or a button number. Default left. joypad_button: the controller button, by name (a, b, x, y, back, guide, start, left_stic… |
| ctrl | boolean | – | key: hold Ctrl with it. Default false. Only for op key. |
| device | number | – | joypad_button, joypad_motion: which controller, counting from 0. Default 0. Only for ops joypad_button, joypad_motion. |
| doubleClick | boolean | – | click, mouse_click: default false. A double click is sent as one arrives from the system: a whole click, then a second press marked double_click and its release, so a button presses twice, as a playe… |
| frames | integer | – | mouse_drag, touch_drag: how many process frames the stroke takes, one motion each, as a real mouse or finger sends one a frame. A hand takes about 20 to 60 for a stroke across a screen. Only for ops… |
| holdFrames | integer | – | action, key, mouse_click, joypad_button, touch: hold a whole press down for this many process frames and then let go, both inside the game, so a pour, a charge or a long press runs to a set length. A… |
| index | number | – | click: which of several controls saying the words, counting from 0 in the order a refusal lists them, best matches first. choose: the item to take, by where it is in the list, when text will not do.… |
| keycode | string|number | – | key: the key name, such as "Space" or "A", or its Godot keycode. Only for op key. |
| nodePath | string | – | click: the Control to click, at its centre, at x and y in its own space when those are given, or at the middle of the part on screen when no scroll brings its centre into view (said under pressed_on)… |
| op | string | yes | What to do. |
| pid | number | – | Which game, when several are running from one project, such as a bench and its workers: its process id, as editor_status lists under runtimes. Without it the game this server started or plays is the… |
| pressed | boolean | – | action, key, mouse_click, joypad_button, touch: leave it out and the press is a whole one, down and up a frame apart. true holds it down, false lets go of one being held, a finger lifted at x and y.… |
| projectPath | string | – | Which game, when more than one is running: the project directory it was started from. A call naming neither projectPath nor pid goes to the game this server started or is playing, named under answere… |
| relativeX | number | – | mouse_motion: the movement the event carries. Left out, it is the distance from where the last injected pointer event put the pointer, and none for the first. That is what a control that drags reads.… |
| relativeY | number | – | mouse_motion: as relativeX. Only for op mouse_motion. |
| replace | boolean | – | text: true writes over what the field already says, which is what filling one in means. Default false types at the caret, so a field reading 2.1 typed "0.3" at reads 2.10.3. The answer says what the… |
| says | string | – | click: the words on the control to click, matched the way runtime_inspect find matches says (a plain word is contained in the text, a pattern with * or ? is a glob over it, and | separates alternativ… |
| shift | boolean | – | key: hold Shift with it. Default false. Only for op key. |
| strength | number | – | action: 0 to 1. Default 1. Only for op action. |
| text | string | – | text: what to type. A newline is Enter and a tab is Tab, a space is a space, and "" with replace empties the field. choose: the item to take, by what it says as drawn, which in a game with translatio… |
| toX | number | – | mouse_drag, touch_drag: where the release is, in window pixels or nodePath's own space. Only for ops mouse_drag, touch_drag. |
| toY | number | – | mouse_drag, touch_drag: as toX. Only for ops mouse_drag, touch_drag. |
| value | number | – | joypad_motion: where the axis is, -1 to 1: down and right are positive on a stick, and a trigger runs 0 to 1. The axis stays there until another motion moves it, as a stick held over does. Send 0 to… |
| via | array | – | mouse_drag, touch_drag: points the stroke passes through on the way, in order, each [x, y] in the space x and y are in. The motions are spread along the whole stroke by distance. Default none: a stra… |
| x | number | – | click: with y, the point to press in the control's own space instead of its centre, for a control that draws its parts itself. Not with a 3D node, nor with says finding an item the control draws. mou… |
| y | number | – | click, mouse_click, mouse_motion, mouse_drag, touch, touch_drag: as x. Only for ops click, mouse_click, mouse_motion, mouse_drag, touch, touch_drag. |
No output schema declared.
No examples provided.
runtime_inspect Inspect the running game ~2,638
Questions about the running game: what is written on the screen, the scene tree, the nodes matching a query, where one node is on screen, what one property reads, the performance metrics, or what it tells a screen reader. Needs the game running with the runtime addon. Operations: tree: the live scene tree, with current_scene giving the path of the scene the game is showing and the file it was loaded from, or null when it shows none; text: every line of text under nodePath, the values in its fields included, in reading order, leaving out what is hidden and everything under it, and a control drawn wholly outside the viewport or scrolled out of a ScrollContainer, which the player cannot read. Every line reads as drawn: rich text without tags, text only as far as it is typed out, a translation rather than its key, an upper-case label in capitals and a secret field as its mask. Tab titles, menu bar titles, list items, a tree's column titles and rows, and an open menu's items and the titles of its separators read a line each. A line drawn as a copy under a node saying the same words, as an outline or a glow is, reads once, counted under copies; find: the paths of every node matching className, script, namePattern, group or says, with property read off each, hidden ones included unless includeHidden says otherwise. With it false, a control drawn wholly outside the viewport or a ScrollContainer is left out too. A match drawn under a matching node drawing the same words, as an outline or a glow copy is, names that node under copyOf (a name given only for a screen reader is not drawn, so a node holding one is never what a copy copies), and the answer counts the rest under distinct; rect (needs nodePath): one node's rectangle or position, in canvas and in window pixels, and for a Control whether it is in view, with drawn_over naming what a pointer at its centre would reach instead, such as a dialog over the screen. Canvas is the node's own viewport. window is where it is draw…
| Name | Type | Req | Description |
|---|---|---|---|
| className | string | – | find: a native class, matching its subclasses too, or a class_name. Only for op find. |
| depth | integer | – | tree: levels to descend, 0 for the node alone. Default 3. A node at the last level that has children answers children_not_shown with their count instead of children. Only for op tree. |
| group | string | – | find: a group the node is in. Only for op find. |
| includeHidden | boolean | – | text: read hidden nodes as well, and controls drawn outside the viewport or scrolled out of a ScrollContainer, for checking that something is not showing. Default false. find: default true, since a f… |
| includeProperties | boolean | – | tree: include every stored property of each node. Default false, and one row of a form answered seventy-six thousand characters with it. properties names the few that are wanted. Only for op tree. |
| limit | integer | – | find: the most nodes to answer with, default 100. text: the most lines, default 500, with omitted saying how many lines that left behind. accessibility: the most elements below the windows, depth fir… |
| metrics | array | – | metrics: which to read. Default all. Only for op metrics. |
| namePattern | string | – | find: a case-insensitive glob on the node name, such as "Enemy*", or several separated by | the way says takes them, such as "Enemy*|Boss", with \| for a bar in a name. Matched against the whole name… |
| nodePath | string | – | tree, find, text: where to start, default /root. rect: the node to place. property: the node to read, or an engine singleton by name as runtime_invoke takes them, "Engine" with property "get_frames_d… |
| op | string | – | What to do. |
| pid | number | – | Which game, when several are running from one project, such as a bench and its workers: its process id, as editor_status lists under runtimes. Without it the game this server started or plays is the… |
| projectPath | string | – | Which game, when more than one is running: the project directory it was started from. A call naming neither projectPath nor pid goes to the game this server started or is playing, named under answere… |
| properties | array | – | tree: the properties to read off each node, by name, so the text of every label and button under a panel is one call: a node that has not got one leaves it out. Colons read through what a node holds,… |
| property | string | – | property: which one to read, or a constant the node's script or a script it extends declares. find: read this one off every node matched, so a panel of labels is one call rather than one per label. C… |
| says | string | – | accessibility: only the elements whose name, value or value_text says these words, matched as find matches them, with what they hold. find: part of what the node has written on it as drawn, the way t… |
| script | string | – | find: the script file the node carries. Only for op find. |
| timeoutMs | integer | – | How long to wait for the answer before answering pending with a requestId, which runtime_invoke op result collects the reply by. Default 10000, or GDHARNESS_RUNTIME_TIMEOUT_MS. accessibility defaults… |
No output schema declared.
No examples provided.
runtime_invoke Set or call in the running game ~2,757
Sets a property or calls a method on a node, or on one of the engine singletons nodePath names, in the running game. Needs the game running with the runtime addon. The answer carries elapsed_usec, how long the call or the write took inside the game, measured around it there: the round trip to the game is a second or more, so timing from outside measures that instead. A method that awaits is answered with the value it returns once it ends, and awaited true. elapsed_usec then runs to its end, and one that outlasts timeout is collected with op result. Errors the engine reported while a called method ran, or while a setter ran on a write, come back under errors and warnings under warnings, and a write a setter kept from changing anything is refused with what it reported, the first 20 of each, with errors_not_shown and warnings_not_shown counting the rest. A script error ends the function it is raised in, which then returns the default of its return type, 0, "" or null, so one that ended the called method itself is named under ended_by_error_at, and result is not a value the method returned. A method declared to return an enum has its result named under result_named, such as PROCESS_MODE_INHERIT, and an Error as the engine words it, such as Unavailable for 2. A call that takes longer than timeoutMs is not cancelled: the answer is pending: true with a requestId, the call goes on and does everything it was asked, and op result with that requestId collects its reply once it comes. A game this server started that its debugger holds is said so, with where, before a call and under heldAt, the object editor_output gives, when a call reached a breakpoint. Operations: set (needs nodePath, property, value): set a property, on a node or on an object it holds; call (needs nodePath, method): call a method, on a node or on an object it holds, and return its result; result (needs requestId): collect the reply to a set or call whose wait ran out, by the requestId it answered with.
| Name | Type | Req | Description |
|---|---|---|---|
| args | array | – | call: the arguments, fitted to the method's parameter types. An RID is passed as the {"_type": "RID", "id": ...} a read answers it with, such as a viewport's for RenderingServer's render timing. A wh… |
| method | string | – | call: which one to call. Colons call through what a node holds, "_game:run:advance", the same way a property is written through them, a list or a map is stepped into by index or key, "_game:run:roste… |
| nodePath | string | – | Absolute node path, such as "/root/Main/Player", or the name of an engine singleton: Engine, Performance, RenderingServer, AudioServer, PhysicsServer2D, PhysicsServer3D, NavigationServer2D, Navigatio… |
| op | string | yes | What to do. |
| pid | number | – | Which game, when several are running from one project, such as a bench and its workers: its process id, as editor_status lists under runtimes. Without it the game this server started or plays is the… |
| projectPath | string | – | Which game, when more than one is running: the project directory it was started from. A call naming neither projectPath nor pid goes to the game this server started or is playing, named under answere… |
| properties | boolean|array | – | call: read the object the call answered with in the same answer, under result_properties: true for every variable its script declares, or a list of names, each a colon path walked from that object th… |
| property | string | – | set: which one to write. Colons write through what a node holds, "_game:run:day", and a number or a key steps into a list or a map on the way, "_game:run:roster:0:name", a negative number counting fr… |
| requestId | integer | – | result: the requestId a pending answer gave. Only for op result. |
| timeoutMs | integer | – | set, call: how long to wait for the answer before answering pending with a requestId, which does not stop the call. Default 10000, or GDHARNESS_RUNTIME_TIMEOUT_MS. Give a longer one for a call known… |
| value | – | – | set: the value, fitted to the property's type. A whole number of 2^53 or more, such as a 64-bit seed or a resource uid, is written as its digits, {"_type": "int", "value": "9007199254740993"}, the fo… |
No output schema declared.
No examples provided.
runtime_wait Wait in the running game ~1,863
Lets the running game get on with it and answers when something has happened: a number of frames, a signal, a property reaching a value, or words appearing on a screen. Records a signal or a property from before the call that sets it off, so a change over before the next call arrives is still seen. Needs the game running with the runtime addon. Operations: frames (needs frames): let frames pass; signal: wait for a signal and answer with what it carried; watch (needs nodePath): start recording a signal, or a property every frame, and answer at once with a watch. Arm it before the call meant to set the signal off or start the change, then collect it, a signal with signal and the watch and a property with recorded. A client can run a call sent beside a wait only after the wait answers, so a wait sent with the call misses it; recorded (needs watch): answer what a watch of a property recorded since it was armed, at once: changes holds the reading at arming and every later one that differed, each with the frame, elapsed_ms and game_time it was read at, and calls every runtime_invoke set or call and runtime_input sent while it recorded, each with the frame of the last reading before it ran. A property that changes every frame, such as the position of something moving, records one change a frame up to 1000, an answer of tens of thousands of characters. For the moment it crosses a value, until with compare answers that alone; until: wait for a property to read as a value, or for words to appear under a node, and answer with what it found. One already true when asked answers at once, with frames 0. The tool reference in the gdharness skill, and the site, say what every field of the answer means.
| Name | Type | Req | Description |
|---|---|---|---|
| compare | string | – | until, with a property: how what the property reads stands to value before the wait is met. Default ==. != waits for it to read as anything else. >=, <=, > and < put a number in order, met on the fir… |
| frames | integer | – | frames: how many to let pass, 1 to 600. More than that is refused. Only for op frames. |
| includeHidden | boolean | – | until, with says: count words on a hidden node too, and on one drawn outside the viewport or scrolled out of a ScrollContainer. Default false, since a wait for words is a wait for them to be shown, a… |
| nodePath | string | – | signal, watch, until: the node, by its path from the root, such as "/root/Main/Player". Needed for a signal without a watch, a watch of either kind and a property. For says, it defaults to /root, the… |
| op | string | yes | What to do. |
| pid | number | – | Which game, when several are running from one project, such as a bench and its workers: its process id, as editor_status lists under runtimes. Without it the game this server started or plays is the… |
| projectPath | string | – | Which game, when more than one is running: the project directory it was started from. A call naming neither projectPath nor pid goes to the game this server started or is playing, named under answere… |
| property | string | – | watch: record this property every frame from now until recorded collects it, read as until reads it, which is how a tween or an animation shorter than the gap between two calls is seen partway: arm t… |
| says | string | – | until: wait for these words to appear anywhere under nodePath, or anywhere in the game when no nodePath is given, instead of for a property, which is how a panel that rebuilds its labels is waited on… |
| signal | string | – | signal, watch: the signal name. watch takes it or property, not both. Only for ops signal, watch. |
| timeoutMs | integer | – | signal, until: how long to wait before answering anyway, 1 to 120000. Default 5000. Only for ops signal, until. |
| value | – | – | until: the value to wait for, fitted to the property's type and compared at the precision the property keeps, so -1.1 meets a 32-bit float holding -1.10000002. A value the property would have to cut… |
| watch | integer | – | signal: the watch an earlier watch of a signal answered, in place of nodePath and signal. Answers at once, with fired_before_wait, when the signal fired after the watch was armed, and otherwise waits… |
No output schema declared.
No examples provided.
scene_animation Animations ~1,859
Animations in an AnimationPlayer and states in an AnimationTree state machine. The player and the tree are nodes, so scene_node add puts one in the scene first, and the animation a player plays on load is its autoplay property, which scene_node set sets. read answers with every track of an animation in the shape add_track takes, so a track read off one animation can be added to another. add_track on a path the animation already has a track of that type for adds the keys to that track, as the editor keys a property it already animates, answering existingTrack true and keysAdded beside keys, the track's count. A key at a time that track already has a key at is refused unless replaceKeys is true, which is how one key's value is changed. A key add_track writes past the animation's end, where it never plays, is written and named under pastLength. remove_track takes out every track of the type, nodePath and property given, with its keys. A method track given a method loses only the keys calling it, and goes once none is left. read_states gives each state that plays an animation animationFound, and animationMissing saying why when the player lacks it. remove clears the player's autoplay when it named the animation and names under statesPlayingNothing the states that played it, which stay in their trees playing nothing until remove_state takes them out. Every state machine has Start and End, which cannot be added or removed. A transition from Start sets the state it begins in. read and read_states need no editor: one serving the project answers and says whether it holds unsaved changes to the scene, and with none a headless engine reads the file without running the scene's scripts. The ops that write go through the editor when one serves the project. With none, a headless engine runs the editor's own tool and the answer says so under writtenBy. That engine runs every script of the file, where the editor runs only tool scripts, so what a script changes as the file loads is…
| Name | Type | Req | Description |
|---|---|---|---|
| advanceCondition | string | – | connect_states: the condition parameter that advances it, set as parameters/conditions/<name> on the AnimationTree. Taken only with advanceMode auto, since the engine checks a condition on no other.… |
| advanceMode | string | – | connect_states: auto advances by itself, on its advanceCondition when it has one. enabled is taken only by travel() on the playback, and disabled never. Default auto for a transition with advanceCond… |
| animTreePath | string | – | The AnimationTree node. Only for ops read_states, add_state, remove_state, connect_states, disconnect_states. |
| animationName | string | – | The animation in the player. A name before a slash is the library it is in, as moves/walk. read: the one to answer with whole, its tracks a list. Without it, read lists them, each with the number of… |
| fromState | string | – | connect_states and disconnect_states: the state the transition leaves. Only for ops connect_states, disconnect_states. |
| length | number | – | create and set: seconds, more than 0. create: default 1. set: a key past the new end is kept, as the editor keeps it, and named under pastLength, since it never plays. Only for ops create, set. |
| loopMode | string | – | create: default none. Only for ops create, set. |
| newName | string | – | rename: the animation's new name in the library it is in. The player's autoplay and every state of the scene's AnimationTrees that plays it are renamed with it, named under autoplay and statesFollowe… |
| op | string | yes | What to do. |
| playerNodePath | string | – | The AnimationPlayer node. Only for ops read, create, add_track, remove_track, set, rename, remove. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| replaceKeys | boolean | – | add_track: true puts a keyframe at a time the track already has a key at in that key's place, and names each key replaced under keysReplaced, its time and the value it held (a method key's method and… |
| scenePath | string | yes | Scene file inside the project, such as "scenes/main.tscn" or "res://scenes/main.tscn". |
| stateMachinePath | string | – | A nested state machine, by the names of the states that lead to it. Default the root. Only for ops read_states, add_state, remove_state, connect_states, disconnect_states. |
| stateName | string | – | add_state: the state to add. It goes right of the rightmost state in the editor's graph, answered under position. remove_state: the state to take out, with every transition leaving or reaching it, na… |
| step | number | – | create and set: keyframe snap in seconds, 0 or more. create: default 0.1. Only for ops create, set. |
| times | array | – | remove_track: the times in seconds of the keys to remove, keeping the rest of the track. A track left with no key goes too. A time no key is at refuses the call, naming the times the keys are at. To… |
| toState | string | – | connect_states and disconnect_states: the state it arrives at. Only for ops connect_states, disconnect_states. |
| track | object | – | add_track: the track to add. remove_track: the track to take out, found by its type, nodePath and property as read answers them. Its keyframes are not needed. Only for ops add_track, remove_track. |
| transitionType | string | – | connect_states: default immediate. Only for op connect_states. |
No output schema declared.
No examples provided.
scene_create Create or save a scene ~872
Creates a scene file where none is, saves one, or saves a copy under a new path. create makes a folder the path names that is not there, and names it under madeFolder. Its answer names the root's type and name, and under script the script the root carries. A save of a scene open in the editor saves the editor's copy, unsaved changes included. The call goes through the editor when one serves the project. With none, a headless engine runs the editor's own tool. The answer's writtenBy (readBy for a read) names the editor or the engine. That engine runs every script of the file, where the editor runs only tool scripts, so what a script changes as the file loads or as a property is set is put back before anything is saved, and a file where that cannot be done, such as a scene whose script does not compile, is refused and nothing is written. A class_name the project's class list lacks is put in it first, and classesRebuiltFirst names it. Each file the written one refers to is named by its uid, as the editor names it, except a file the project's uid cache has no uid for yet (one made since the project was last scanned), which is named by path and listed under namedByPath with the call that scans it. A running editor of the project that has not yet reached this server is waited for. A scene is saved as the engine holds it once the file has loaded, and one property can set others as it loads, as anchors_preset gives a centred Control both its grow directions, so a scene not last saved by an editor can gain, change or lose lines the call did not ask for, on any node the file held, the one it names among them: alsoSaved lists each as {node, property, was, saved}, was left out where the file set nothing and saved where it now sets nothing. What a set itself moved on its node is under alsoChanged rather than here, and neither a node the call adds nor the format lines (header uid, load_steps, unique_id) are listed. The scene loads as it did. Only its text changed. Operations: cr…
| Name | Type | Req | Description |
|---|---|---|---|
| inherits | string | – | create: a scene for the new one to inherit, such as "parts/crate.tscn", as the editor's New Inherited Scene makes one. Its root is an instance of that scene, so changes there reach it, and scene_node… |
| newPath | string | – | save_as: where the copy goes. Only for op save_as. |
| op | string | – | What to do. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| rootNodeName | string | – | create: the root node name. Default the class name, as the editor names a new root, or with inherits the name of that scene's root. Only for op create. |
| rootNodeType | string | – | create: the root node class, an engine class or a class_name a project script declares, which the root is made as with that script attached. Default Node. The answer names the root as scene_node get… |
| scenePath | string | yes | Scene file inside the project, such as "scenes/main.tscn" or "res://scenes/main.tscn". |
| script | string | – | create: a script to attach to the root. Only for op create. |
No output schema declared.
No examples provided.
scene_node Scene nodes ~3,042
One node in a scene file: add, read, set, duplicate, reparent or delete it, save it as a scene of its own, paint TileMap cells, or bake a navigation region. Any ClassDB node type or script class can be added, and another scene is instanced by an add with instancePath. A set with properties {"name": "Boss"} renames a node, and answers nodePath as its new path. A rename or a reparent carries the node paths naming the node, as the editor's rename does: NodePath values on nodes (in arrays, dictionaries, built-in resources, %unique paths) and the tracks its players' animations hold, saving a library kept in a .tres of its own, and answers each rewrite under retargeted and each path it left under notRetargeted. The move is followed into every other .tscn that instances or inherits this scene at any depth: the editable children, values, added nodes and connections named by the old path are rewritten, and that scene's node paths and tracks are carried as above. A delete rewrites no path, and answers under stillNaming what named the deleted node and now names nothing. A property holding a Resource takes the res:// path of one. A write is refused while the editor holds unsaved changes to the scene. A node this scene inherits takes values of this scene's own, and so does a node inside an instance of another scene once that instance's editableChildren is true. Neither can be moved, renamed, copied or deleted, since the other scene makes it again on load. The call goes through the editor when one serves the project. With none, a headless engine runs the editor's own tool. The answer's writtenBy (readBy for a read) names the editor or the engine. That engine runs every script of the file, where the editor runs only tool scripts, so what a script changes as the file loads or as a property is set is put back before anything is saved, and a file where that cannot be done, such as a scene whose script does not compile, is refused and nothing is written. A class_name the project's cl…
| Name | Type | Req | Description |
|---|---|---|---|
| addGroups | array | – | add and set: groups to put the node in, saved in this scene's file as the editor's Groups dock saves them. One it is in already is kept as it is. Only for ops add, set. |
| cells | array | – | Cells to place. Only for op set_tilemap_cells. |
| editableChildren | boolean | – | set: on an instance of another scene, whether its children are editable here, as the editor's Editable Children makes them. True lets scene_node set give the nodes inside that instance values of this… |
| includeDefaults | boolean | – | get: include properties still at their default. Default false. Only for op get. |
| index | integer | – | add, duplicate and reparent: where the node goes among the parent's children, 0 for first. Default last, except for a copy under the original's own parent, which goes right after it. Child order is d… |
| instancePath | string | – | add: a scene to instance as the new node instead of a class, such as "ui/panel.tscn". It is saved as an instance of that file, the way the editor's Instantiate Child Scene saves one, so changes to th… |
| keepGlobalTransform | boolean | – | reparent: whether the node stays where it is drawn, its transform worked out again under the new parent, as the editor's reparent and Node.reparent keep it. A Control keeps its position only. A Node3… |
| layer | number | – | set_tilemap_cells: the layer of a TileMap. Default 0. A TileMapLayer is one layer. Only for op set_tilemap_cells. |
| newName | string | – | duplicate: the copy's name. The copy has the nodes under the original and their connections, as the editor's Duplicate makes it: each connection keeps its flags, binds and unbinds, and one between tw… |
| newParentPath | string | – | reparent: the new parent, which may be the one it has, to move it among its siblings. In the scenes the move is followed into, the parent_id_path, from_uid_path and to_uid_path saved beside each rewr… |
| newScenePath | string | – | save_branch: where the new scene goes, such as "props/crate.tscn". A path with no extension gets .tscn. An existing file is refused. Only for op save_branch. |
| nodeName | string | – | add: the new node's name. Only for op add. |
| nodePath | string | – | Node path from the scene root, such as "Player/Sprite2D". "." is the root. Only for ops get, set, duplicate, reparent, delete, save_branch, set_tilemap_cells, bake_navigation. |
| nodeType | string | – | add: the node class, such as "CharacterBody2D", or a class_name a project script declares, which the node is made as with that script attached. Give this or instancePath. The answer names the node ma… |
| op | string | yes | What to do. |
| parentNodePath | string | – | add: where the node goes. Default the root. duplicate: where the copy goes. Only for ops add, duplicate. |
| placeholder | boolean | – | add, with instancePath, or set, on an instance this scene places: whether it is saved as the editor's Load as Placeholder saves it, as `instance_placeholder` in the file. A game then gets an Instance… |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| properties | object | – | Properties to set, keyed by Godot property name. Vectors, colours and the like may be written as {"x": 1, "y": 2} or tagged {"_type": "Vector2", "x": 1, "y": 2}, which is the form a read answers with… |
| removeGroups | array | – | set: groups to take the node out of. One it is not in is refused, and so is one another scene puts it in (the scene that makes it, instances it or is inherited here), which only that scene can take i… |
| scenePath | string | yes | Scene file inside the project, such as "scenes/main.tscn" or "res://scenes/main.tscn". |
No output schema declared.
No examples provided.
scene_signal Scene signals ~1,202
Signal connections in a scene file. Each connection answers with its flags as the number and as flagNames. persist is on every connection, since a scene saves no other kind. A connection carries binds, the values passed after the signal's own, and unbinds, how many of the signal's own are dropped first, as the editor's connect dialog offers them. Each is answered only when there is one. A connect of a pair already connected says alreadyConnected, with flagsBefore, bindsBefore and unbindsBefore when it changed them, and keeps the binds and unbinds it had unless the call gives new ones. A connect to a method the target does not have is still written, as the editor's own dialog allows, since the method may be written next. methodFound false says so, and until the method exists the signal fails each time it is emitted. That holds only without binds and unbinds: the engine makes a connection that binds or unbinds arguments only to a method its target has, and a scene loads without one aimed elsewhere, so such a connect is refused. A file can hold one already, written by hand or before its method was renamed: the engine loads the scene without it and a save drops it, so every tool that writes a .tscn puts it back as the file held it and says so under unmadeConnections, a write to a binary .scn holding one is refused, and a disconnect takes it out. One whose method cannot take what the signal passes, with its binds and unbinds (too few or too many arguments, an object where the method takes a value or the reverse, or an engine class unrelated to the one it takes), is written too, and answers argumentsFit false with misfit saying why. list gives each connection its methodFound, and misfit when it has one. list marks editable false on a connection a scene this one instances or inherits makes, on its own root as well as inside it, and names that scene under madeIn. Only that scene can change it, so a disconnect of one is refused. The call goes through the editor when one ser…
| Name | Type | Req | Description |
|---|---|---|---|
| binds | array | – | connect: the values passed to the method after the signal's own, written as a read answers them. [] takes them off. Default: those the connection already has. Only for op connect. |
| flags | number | – | connect: Object.ConnectFlags added together: deferred 1, persist 2, one_shot 4, reference_counted 8, append_source_object 16. Persist is added either way. A read can also name inherited, 32, on a con… |
| methodName | string | – | The method on that node, called when it emits. Only for ops connect, disconnect. |
| nodePath | string | – | list: only connections involving this node. Only for op list. |
| op | string | yes | What to do. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scenePath | string | yes | Scene file inside the project, such as "scenes/main.tscn" or "res://scenes/main.tscn". |
| signalName | string | – | The signal it emits, such as "pressed". Only for ops connect, disconnect. |
| sourceNodePath | string | – | The node that emits. Only for ops connect, disconnect. |
| targetNodePath | string | – | The node whose method is called. Only for ops connect, disconnect. |
| unbinds | integer | – | connect: how many of the signal's own arguments are dropped, from the end, before the binds are added. 0 takes it off. Default: what the connection already has. Only for op connect. |
No output schema declared.
No examples provided.
scene_tree Scene tree ~557
The nodes of a scene file: names, classes and hierarchy, with properties when asked. type is the engine class, and a node whose script declares a class_name names it under scriptClass, as scene_node get does. A node that instances another scene names that file under instanceOf, and the nodes listed under it come from that file rather than this one. Its editableChildren says whether this scene, or a scene it inherits, keeps values of its own for them (scene_node set editableChildren). One saved as a placeholder answers placeholder true, with InstancePlaceholder as its type, as a game loads it (scene_node set placeholder). The root of a scene inheriting another names the scene it inherits under inherits, and every node that scene or one further down makes names its file under inheritedFrom. This file holds only the values it changes on them. A node in any group answers groups, sorted, from this file and every scene it comes from. Needs no editor: one serving the project answers and says whether it holds unsaved changes to the scene, and with none a headless engine reads the file without making its nodes, so no script of theirs runs (autoloads still start once it has answered, as in every headless call). For the nodes of a game that is running, runtime_inspect tree.
| Name | Type | Req | Description |
|---|---|---|---|
| depth | integer | – | How many levels to descend, 0 being the root alone. Default: all. A node at the last level that has children of its own lists none and says how many under childrenNotListed. |
| includeDefaults | boolean | – | List every stored property, defaults included, which turns includeProperties on when it is left out: a Control has about a hundred, so ten Controls answer about 57,000 characters. Default false. |
| includeProperties | boolean | – | Include each node's properties: what the file sets and every value that differs from a new node of its class and script, with defaultsLeftOut counting the defaults left out. On a node another scene m… |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scenePath | string | yes | Scene file inside the project, such as "scenes/main.tscn" or "res://scenes/main.tscn". |
No output schema declared.
No examples provided.
script_diagnostics Script diagnostics ~934
Errors and warnings for a script, or for several, from the editor's language server, and whether each is clean. With no editor of this project open, so no language server of it to ask, a short headless engine compiles the scripts instead and the answer says checkedBy: engine rather than language server. A class declared on disk that the class cache lacks is put in it first, and classesRebuiltFirst names those classes. The engine answers every error that stops a script compiling, up to its first syntax error, with its line and no column (a method or property another class lacks is not one, since GDScript checks a method only on self and a property only named bare: the object may be a subclass that has it, so it fails at run time instead), dependenciesWithErrors naming the other scripts that failed while it loaded, typesMissingFromTheClassCache naming a class the project declares that the engine could not resolve because the class cache lacks it, with staleAnalysis saying what rewrites the cache, and the warnings at the levels the project sets, which a second engine reports by raising each warning set to warn as an error for that run only, each at its line with no column, warnings being null when that engine could not answer. A script with a syntax error is checked for no warnings until it parses. Of several scripts, a language server that stops answering partway leaves the rest to the engine, and checkedBy then says language server, then engine, with checkedByLanguageServer counting the scripts it answered. Each diagnostic carries its severity (error or warning), its message, and where it is as the editor shows it: line and column counted from 1, and endLine and endColumn just past its end. Diagnostics are checked against the project's own files, and the two that the files disprove are named rather than passed on: a member the class cache's file declares, or a project class it extends does, a method, property, constant, static function or enum member, comes back und…
| Name | Type | Req | Description |
|---|---|---|---|
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scriptPath | string|array | yes | A script inside the project, a folder, or a list of either, such as "scripts/player.gd" or ["scripts/economy", "ui/shop.gd"]. A folder is its .gd files at any depth, skipping what the engine skips an… |
No output schema declared.
No examples provided.
script_edit Edit scripts ~1,450
Creates a GDScript file, or adds functions, variables and signals to one. Every declaration written carries a type. Both load what they wrote under the project's own warning settings and answer with parses. The engine's reasons for a refusal come back under engine_messages. parses is false for a script that fails only because a script it depends on does, and dependencies_with_errors names those. create answers with the extends and class_name the engine read (class_name null for a script declaring none), and writes the .uid beside the script as the editor does, answering it under uid. A script declaring a class_name is put in the project's class list, with registered saying whether it is there, and an editor serving the project scans for it, so it resolves the class at once (editorRescanned). A class_name another script or an engine class holds, or an extends naming no class, is refused with nothing written. modify makes every addition or none, refuses with nothing changed additions that would stop a script that parses from parsing, giving the engine's reasons, and answers with the line each one is on in the file written. With an editor serving the project it reloads the script there too, so the editor's answers read what was written, and editorReloaded says so (editorNote when it could not, or when a script tab holds unsaved edits that saving would write over the file). rename renames a class or a member wherever the engine uses it and writes every file or none. A new name already taken is refused with nothing written, a member's included when a class inheriting it already uses the name in code, as a local or a parameter. changed lists each file with its changed lines as they now read, and leftAlone lists every other whole-word occurrence of the old name with what the tokenizer makes of it (code, string, comment, doc, nodePath, scene, text, or ignored for a file under a .gdignore directory, which is never changed) and, where it is not plain, why. The reasons are a…
| Name | Type | Req | Description |
|---|---|---|---|
| className | string | – | create: a class_name for the script. Not with content. Only for op create. |
| content | string | – | create: the whole file, written as given, instead of a template, className and extends. Only for op create. |
| extends | string | – | create: the base class. Default the class the template is written for, or Node with no template. Not with content. Only for op create. |
| modifications | array | – | Additions to make, in order. A name the script already declares at the top level, or one the call adds twice, refuses the call before anything is written. Only for op modify. |
| newName | string | – | rename: the new name. Only for op rename. |
| newScriptPath | string | – | rename: also move the declaring script here, with its .uid beside it, rewriting every string that names it by path in the same style it was written (res:// or relative), and the relative paths in the… |
| op | string | yes | What to do. |
| preview | boolean | – | rename: answer with what would change and what would be left alone, and write nothing. Default false. Only for op rename. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scriptPath | string | yes | Script file inside the project, such as "scripts/player.gd". |
| symbol | string | – | rename: what to rename, declared by the script at scriptPath: its class_name, or a method, variable, constant, signal, enum, enum value or inner class at its top level. A class_name is renamed from t… |
| template | string | – | create: a starting shape. resource is written for a Resource and the others for a Node. An extends outside that class is refused. Only for op create. |
No output schema declared.
No examples provided.
script_info Script info ~768
What a script contains: its structure from the file, or symbols, completions and hover text from the editor's language server. It reads .gd files only, and answers what a script uses rather than what uses it: project_search finds where a class, a member or a signal is named. symbols, completion and hover name under unseenByEditor each class the project declares that the editor cannot see yet, with unseenNote: the language server reads such a class as nothing, so a completion after self. in a script extending one comes back empty. editor_rescan brings it in. Operations: structure: functions (each parameter's default the source text after its =, so = null reads "null", and null for a parameter with none), variables (static ones marked is_static, and one written with := has the type of a literal or built-in constructor it is given, marked inferred, as a constant always does), signals, constants, enums (each with its members under values and their numbers under numbers, counted on from the last whole number the file gives, as the engine counts, and left out from one given an expression), inner_classes (each with its name, line and extends, and its own members in these same fields), class_name, extends and line_count, read from the file, and dependencies: the paths it loads or preloads as written, by a constant it declares too, and the paths it or an inner class extends by, then the scripts declaring each project class_name its code uses, which classes_used names with the class. autoloads_used names each autoload the code uses by its global name, with the autoload's script, which the project loads rather than this script, so it is not under dependencies. A member or inner class with a ## documentation comment directly above it carries the comment's text as doc, and the script's own, the ## block above class_name or extends or one followed by a blank line before any member, comes back as class_doc; symbols: document symbols from the language server, each with its kind, t…
| Name | Type | Req | Description |
|---|---|---|---|
| character | integer | – | completion, hover: the column, counted from 1 as the editor shows it, with a tab counted as one. symbols gives each name at the line and column hover is asked at. Only for ops completion, hover. |
| includeInherited | boolean | – | structure: also list what the script inherits, walking extends through the project's other scripts. Each such member carries inherited_from, the file declaring it, and the answer gains inherits_from,… |
| line | integer | – | completion, hover: the line, counted from 1 as the editor shows it. Only for ops completion, hover. |
| op | string | – | What to do. |
| projectPath | string | yes | Absolute path to the project directory, the one holding project.godot. |
| scriptPath | string | yes | Script file inside the project, such as "scripts/player.gd". |
No output schema declared.
No examples provided.
How do I install the io.github.Aureliolo/gdharness MCP server?
io.github.Aureliolo/gdharness runs locally as an npm package, launched with npx -y gdharness. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · gdharness
claude mcp add aureliolo-gdharness -- npx -y gdharness
What is the io.github.Aureliolo/gdharness MCP server?
io.github.Aureliolo/gdharness is an MCP server listed in the public MCP registry as io.github.Aureliolo/gdharness. A harness for driving a Godot 4 project from an agent: addons, runtime bridge, MCP server, CLI. This page covers its npm package (gdharness).
Is the io.github.Aureliolo/gdharness MCP server safe to use?
io.github.Aureliolo/gdharness scores 81 out of 100 on VerifyMCP. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.Aureliolo/gdharness MCP server expose?
io.github.Aureliolo/gdharness exposes 31 tools: project_info, project_settings, project_search, project_dependencies, project_import, and 26 more. Their descriptions and schemas cost roughly 44,011 tokens of context every time the server is loaded.
Is the io.github.Aureliolo/gdharness MCP server still maintained?
io.github.Aureliolo/gdharness is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.Aureliolo/gdharness MCP server under?
io.github.Aureliolo/gdharness declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.