The "tool" keyword was removed in Godot 4: use @tool
By Eduardo Orellana · Updated
Put @tool on the first line instead of tool. In Godot 4 a script that runs in the editor starts with @tool, and the check for the editor is the method Engine.is_editor_hint(), no longer the property Engine.editor_hint.
What Godot is checking
GDScript 2.0 turned tool, export and onready into annotations. The parser recognises the old tool keyword so it can name the replacement, and stops: the script does not load.
@tool makes the script run inside the editor as well as in the game. Code that should run only in one of them checks Engine.is_editor_hint(), which the fixed run prints: false, because it ran as a game.
Reproduce it
A Godot 3 tool script in a Godot 4 project. The scene is one Node with this script.
tool
extends Node
func _ready():
print(Engine.editor_hint)
What Godot 4.7.2 prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
SCRIPT ERROR: Parse Error: The "tool" keyword was removed in Godot 4. Use the "@tool" annotation instead.
at: GDScript::reload (res://answers/tool-keyword-removed-in-godot-4/repro.gd:1)
ERROR: Failed to load script "res://answers/tool-keyword-removed-in-godot-4/repro.gd" with error "Parse error".
at: load (modules/gdscript/gdscript_resource_format.cpp:46)Fix it
The annotation on the first line, and the editor check as a method call.
@tool
extends Node
func _ready() -> void:
print("running in the editor: ", Engine.is_editor_hint())
What the fixed script prints
Godot Engine v4.7.2.stable.mono.official.ed1daf0bf - https://godotengine.org
running in the editor: falseVerified on Godot 4.7.2
Both scripts on this page were run headless on Godot 4.7.2 (4.7.2.stable.mono.official.ed1daf0bf) on 6 October 2026, and the output above is what Godot printed, unedited.
Where the check lives in Godot's source: [gdscript_parser.cpp line 1199, the message](https://github.com/godotengine/godot/blob/4.7.2-stable/modules/gdscript/gdscript_parser.cpp#L1199), [Engine.is_editor_hint in the class reference](https://github.com/godotengine/godot/blob/4.7.2-stable/doc/classes/Engine.xml#L231).
Questions
- Does the order of @tool and extends matter?
- @tool goes before extends at the top of the file, as in the fixed script, alongside class_name and @icon.
Related
- The "export" keyword was removed in Godot 4
- The "onready" keyword was removed in Godot 4
- Every verified Godot 4 answer
- How to wait in Godot 4: "yield" was removed, use await
- Spatial in Godot 4: Could not find base class "Spatial"
- Invalid call to function '…' in base '…'. Expected N argument(s) in Godot 4
- Invalid access to property or key on a base object of type 'null instance' in Godot 4
- KinematicBody2D in Godot 4: Could not find base class "KinematicBody2D"
Flockbay's agent reads Godot's debugger output and fixes errors like this one in your project, on the official Godot.
Download Flockbay free