Beckett — MCP for Godot
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BECKETT_PORT | No | Port for the MCP server (default 8770) | 8770 |
| BECKETT_TOKEN | No | Optional bearer token for authentication | |
| BECKETT_READONLY | No | Set to 1 to enable read-only mode | |
| BECKETT_ALLOWLIST | No | Comma-separated list of allowed paths or patterns | |
| BECKETT_CONFIRM_DESTRUCTIVE | No | Set to 1 to require confirmation for destructive actions |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| apply_templateA | Instantiate a bundled (or project) template into res:// in one call â copies its files and, if the template declares a main_scene, sets and opens it. Generic: a template can be a game starter, a UI screen, a settings menu, a test harness. Project templates under res://.beckett/templates/ override bundled ones. Call with no 'template' to list what's available. |
| attach_scriptA | Attach a script (res:// path) to a node in the open scene (undoable). |
| batch_executeA | Run several tool calls in one request, in order. steps = [{tool, args}]. Stops at the first failure (stop_on_error, default true). When a step fails, scene edits made by the batch are rolled back via the editor undo history (rollback, default true) â file/resource writes are not. Use to collapse multi-step authoring (create node â set props â attach script) into one atomic call. |
| build_csharpA | Compile-check a C#/.NET Godot project with |
| call_methodA | Invoke a method on a resolved object. args = a positional array. Returns the result as JSON. |
| connect_signalA | Connect a node's signal to a method on another node, persisted into the scene (undoable). from/to = node path/name in the open scene. |
| create_nodeA | Create a node of the given class and add it to the open scene (undoable). parent = a node path/name (default: scene root). |
| create_resourceA | Create a Resource of the given class and save it to a res:// path (.tres). Optional 'properties' dict sets initial values. |
| delete_nodeB | Remove a node from the open scene (undoable). |
| describe_classA | List a class's properties and methods (with signatures) so you know exactly what to set_property / call_method. The discovery key for full domain coverage. |
| describe_objectA | Dump a live object's properties as JSON. target = a res:// path, a node name/path in the open scene, or a class name (falls back to describe_class). |
| disconnect_signalA | Disconnect a previously connected signal (undoable). |
| duplicate_nodeA | Duplicate a node (with its children) under the same parent (undoable). Optional 'name' for the copy. |
| find_classesA | Search classes by name substring â engine classes AND your project's own types (GDScript class_name + C# [GlobalClass]). Optional 'base' restricts to subclasses (e.g. base=Node2D). The discovery entry point â pair with describe_class. |
| find_methodsA | Search methods by name substring, optionally restricted to a class (incl. inherited). Any result is invokable via call_method. |
| find_nodesA | Find LIVE nodes in the RUNNING game by type and/or name; returns their paths to feed into runtime_call/runtime_get_property/runtime_set_property. 'class' matches native classes AND custom class_name scripts (is_class alone misses custom nodes â they read as @Node@NN). name=substring on the node name. path=scope root (default scene root). recursive=true. max=cap (default 100). |
| game_logsA | Read the RUNNING game's captured output off the runtime channel (real-time, no file logging): runtime SCRIPT errors WITH stack traces, push_error/push_warning, and print(). This is the play->see-error->fix signal â the blind spot logs_read (file-based) can't reliably cover. level=error (default: errors+script+shader) | warning (adds warnings) | all (adds print/stderr). limit=newest N (default 100), filter=substring, clear=true empties the buffer after reading. |
| get_godot_versionA | Return the running Godot engine version info. |
| get_performance_monitorsA | Profiling: read Performance monitors (fps, frame time, memory, object/node counts, draw calls, video mem, physics). target=game (default when a play session is connected) samples the RUNNING game; target=editor samples the editor. |
| get_play_stateA | Report whether a scene is playing and whether the runtime channel to the game is connected. |
| get_project_settingA | Read a ProjectSettings value by its property path (e.g. application/run/main_scene). Pass it as 'setting' ('name' is also accepted). |
| get_project_statisticsA | Project overview: file/script/scene/resource counts, total GDScript lines, autoloads, main scene, input-action count, Godot version. Read-only static scan. |
| get_remote_treeA | Dump the live scene tree of the RUNNING game (runtime counterpart of get_scene_tree). SCOPE IT to stay under token limits â a full game tree blows the budget. path=subtree root (name, relative, or absolute /root/...); depth=levels (-1=all); max_nodes (default 250); max_children per node (default 50); collapse=true groups runs of identical leaf siblings (e.g. '8x CPUParticles2D'). Returns {tree, node_count, truncated?}. |
| get_scene_treeA | Return the node tree of the scene currently open in the editor (name/class/script, nested). |
| instance_sceneA | Instantiate a packed scene (res://*.tscn) as a child in the open scene (undoable). |
| list_dirC | List entries (dirs + files) of a res:// directory. |
| list_signalsA | List a node's signals and their current connections (target node + method). |
| logs_readA | Tail Godot's log FILE (the editor session and any played game log here). For the RUNNING game's errors/stack traces/prints in REAL TIME, prefer game_logs (runtime channel, no file needed) â this file reader is a fallback and needs file logging enabled (off by default; the result tells you how). Optional: level='error'|'warning', 'filter' substring, 'lines' (default 200), 'path' to override. |
| monitor_propertiesA | Sample a node's property in the running game over several frames (detect movement/changes). Returns the sample series. |
| move_nodeB | Reorder a node within its parent to a new child index (undoable). |
| open_sceneB | Open a scene by res:// path in the editor (makes it the edited scene). |
| play_sceneA | Play a scene in the editor. 'scene' (res://) plays a specific scene; current=true plays the open scene; otherwise the project's main scene. Then wait_until condition=play_started, and logs_read for errors. |
| read_fileA | Read a text file by res:// (or user://) path. |
| read_scriptB | Read a script/text file from res://. |
| rename_nodeB | Rename a node in the open scene (undoable). |
| reparent_nodeA | Move a node under a new parent in the open scene (undoable). |
| runtime_get_propertyA | Read a property of a node in the RUNNING game. Address by path (node path/name) OR a live selector: class (native or custom class_name) / name / text [+ nth, default 0]. The selector resolves fresh each call â no need to re-fetch volatile @Node@NN paths. Returns the value plus the 'resolved' path that matched. |
| save_sceneA | Save the scene currently open in the editor. Pass 'path' (res://) to save-as. |
| screenshotA | Capture an image the agent can see (inline PNG). target=game (default) screenshots the RUNNING game via the runtime channel; target=editor captures the 2D editor viewport. region=[x,y,w,h] in pixels crops to that rect (clamped) to save tokens â screenshot full once to learn the size, then crop. |
| script_patchA | Surgically edit an existing res:// file without rewriting it whole. edits = an ordered array; each item is {find, replace[, all]} (find must match EXACTLY once unless all:true), {append: text}, or {prepend: text}. Atomic + safe: nothing is written if any anchor is missing/ambiguous or (for .gd) the result fails to compile. Prefer this over write_script for small changes. |
| search_filesA | Search file contents under res:// for a substring (or regex with regex=true). Returns file:line matches. |
| set_project_settingA | Set a ProjectSettings value and persist project.godot. The property path goes in 'setting' ('name' is also accepted); e.g. set application/run/main_scene to res://main.tscn. |
| set_propertyB | Set a property on a resolved object (undoable). value is coerced to the property's type (vectors accept "x y z" or [x,y,z]). |
| set_resourceA | Assign a resource to a node's property (undoable). Use 'resource' (res:// path to load) OR 'class' (mint a new inline sub-resource of that class). e.g. set Sprite2D.texture from a path, or a fresh RectangleShape2D on CollisionShape2D.shape. |
| stop_sceneA | Stop the running play session. |
| validate_scriptA | Parse/compile GDScript WITHOUT writing it. Pass 'content' (source) or 'path' (res://). Returns whether it compiles â use before write_script to catch hallucinated APIs. |
| wait_for_nodeA | Block until a node appears in the RUNNING game (by path/name) or timeout. Use after play_scene to sync before driving. |
| wait_untilA | Wait for a condition. Blocks the editor at most ~1.5 s per call â longer would stall the editor's own game-launch pipeline and background jobs (they need main-thread frames). If not met yet it answers 'not yet': just call it again. condition = play_started | play_stopped | game_connected | seconds:N | file_exists:res://path. |
| write_fileA | Write a text file under res:// (or user://), path-traversal guarded. Refreshes the editor filesystem. |
| write_scriptA | Write a GDScript (or other text, e.g. .cs) file under res://. GDScript is validated first by default â refuses code that doesn't compile; non-.gd files (C#, configâ¦) are written as-is (use build_csharp to compile-check C#). Set validate=false to force. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/beckettlab/beckett-godot-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server