godot_create_shader
Create shader files in Godot projects using starter templates or custom code to implement visual effects for game development.
Instructions
Create a .gdshader file inside the Godot project, either from a starter template or explicit shader code.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_path | Yes | Path to the Godot project directory or its project.godot file. | |
| shader_name | Yes | Human-friendly shader name or filename, for example 'Water Ripple' or 'water_ripple.gdshader'. | |
| folder | No | Project-relative folder where the shader should be saved. | shaders |
| shader_type | No | Shader type for the generated template, such as canvas_item, spatial, particles, sky, or fog. | canvas_item |
| shader_code | No | Optional explicit shader source. When omitted, a starter template is generated. | |
| overwrite | No | Whether to replace an existing shader file with the same normalized name. |
Implementation Reference
- src/godot_mcp/godot.py:1065-1112 (handler)The handler function `create_shader` inside `GodotController` class responsible for creating the .gdshader file.
def create_shader( self, project_path: str, shader_name: str, folder: str = "shaders", shader_type: str = "canvas_item", shader_code: str | None = None, overwrite: bool = False, ) -> dict[str, Any]: project_dir = ensure_project_path(project_path) final_shader_name = shader_name.strip() if not final_shader_name: raise GodotError("`shader_name` is required.") final_shader_type = shader_type.strip().lower() if not re.fullmatch(r"[a-z_][a-z0-9_]*", final_shader_type): raise GodotError("`shader_type` must be a valid Godot shader type name.") normalized_folder = normalize_project_subdir(folder) shader_dir = project_dir / normalized_folder if normalized_folder else project_dir shader_dir.mkdir(parents=True, exist_ok=True) filename_base = final_shader_name[:-9] if final_shader_name.lower().endswith(".gdshader") else final_shader_name filename = f"{snake_case_name(filename_base, default='shader')}.gdshader" shader_path = (shader_dir / filename).resolve() existed_before = shader_path.exists() if existed_before and not overwrite: raise GodotError( f"Shader already exists at {shader_path}. Pass `overwrite=true` to replace it." ) shader_source = shader_code if shader_code is not None else _default_shader_source(final_shader_type) if not shader_source.endswith("\n"): shader_source += "\n" shader_path.write_text(shader_source, encoding="utf-8") relative_shader_path = shader_path.relative_to(project_dir) return { "project_path": str(project_dir), "shader_name": shader_name, "shader_path": str(shader_path), "shader_resource_path": f"res://{relative_shader_path.as_posix()}", "shader_type": final_shader_type, "created_from_template": shader_code is None, "known_shader_type": final_shader_type in KNOWN_SHADER_TYPES, "created": not existed_before, } - src/godot_mcp/server.py:293-337 (registration)Registration of the `godot_create_shader` tool in the MCP server.
name="godot_create_shader", description="Create a `.gdshader` file inside the Godot project, either from a starter template or explicit shader code.", input_schema={ "type": "object", "properties": { "project_path": { "type": "string", "description": "Path to the Godot project directory or its project.godot file.", }, "shader_name": { "type": "string", "description": "Human-friendly shader name or filename, for example 'Water Ripple' or 'water_ripple.gdshader'.", }, "folder": { "type": "string", "description": "Project-relative folder where the shader should be saved.", "default": "shaders", }, "shader_type": { "type": "string", "description": "Shader type for the generated template, such as canvas_item, spatial, particles, sky, or fog.", "default": "canvas_item", }, "shader_code": { "type": "string", "description": "Optional explicit shader source. When omitted, a starter template is generated.", }, "overwrite": { "type": "boolean", "description": "Whether to replace an existing shader file with the same normalized name.", "default": False, }, }, "required": ["project_path", "shader_name"], "additionalProperties": False, }, handler=lambda args: self.controller.create_shader( project_path=args["project_path"], shader_name=args["shader_name"], folder=args.get("folder", "shaders"), shader_type=args.get("shader_type", "canvas_item"), shader_code=args.get("shader_code"), overwrite=bool(args.get("overwrite", False)), ), ),