Tool tree
gradeNot graded
get_project_stateAnswer
Overview of the whole pixel art project: palette with indices, all sprites (ids, names, sizes, kinds, frame counts), which sprite/frame is on the human's screen, and tilemap info. Call this first to ground yourself.
View tool JSON
{
"name": "get_project_state",
"kind": "answer",
"impl": "imperative",
"description": "Overview of the whole pixel art project: palette with indices, all sprites (ids, names, sizes, kinds, frame counts), which sprite/frame is on the human's screen, and tilemap info. Call this first to ground yourself.",
"inputSchema": {
"type": "object",
"properties": {}
}
}read_spriteAnswer
Read one frame of a sprite as ASCII art rows plus a color legend, so you can see exactly what the human is drawing. '.' = transparent; other characters use the 64-symbol palette alphabet returned in the legend.
View tool JSON
{
"name": "read_sprite",
"kind": "answer",
"impl": "imperative",
"description": "Read one frame of a sprite as ASCII art rows plus a color legend, so you can see exactly what the human is drawing. '.' = transparent; other characters use the 64-symbol palette alphabet returned in the legend.",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string",
"description": "Sprite id. Defaults to the active sprite."
},
"frameIndex": {
"type": "number",
"description": "Zero-based frame index."
},
"layerId": {
"type": "string",
"description": "Layer id. Defaults to the first layer."
}
}
}
}set_pixelsAction
Paint specific pixels on a sprite frame. Each valid requested pixel is applied in order, one cell at a time on the page. Use fill_region or flood_fill for bulk areas.
View tool JSON
{
"name": "set_pixels",
"kind": "act",
"impl": "imperative",
"description": "Paint specific pixels on a sprite frame. Each valid requested pixel is applied in order, one cell at a time on the page. Use fill_region or flood_fill for bulk areas.",
"inputSchema": {
"type": "object",
"properties": {
"pixels": {
"type": "array",
"maxItems": 4096,
"description": "List of pixel changes, applied one cell at a time, e.g. [{\"x\":3,\"y\":4,\"color\":\"#38b764\"}]",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"color": {
"description": "Color to paint. Use a palette index (number), a hex string like '#38b764' (auto-added to the palette), 'transparent', or null to erase.",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"x",
"y",
"color"
]
}
},
"spriteId": {
"type": "string",
"description": "Defaults to the active sprite."
},
"frameIndex": {
"type": "number",
"description": "Defaults to the active frame."
},
"allFrames": {
"type": "boolean",
"description": "Apply the same change to every frame."
},
"layerId": {
"type": "string",
"description": "Layer id. Defaults to the first layer."
}
},
"required": [
"pixels"
]
}
}fill_regionAction
Fill a rectangular region of a sprite frame with one color. Great for blocking in base shapes quickly.
View tool JSON
{
"name": "fill_region",
"kind": "act",
"impl": "imperative",
"description": "Fill a rectangular region of a sprite frame with one color. Great for blocking in base shapes quickly.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -256,
"maximum": 256
},
"y": {
"type": "number",
"minimum": -256,
"maximum": 256
},
"width": {
"type": "number",
"minimum": -256,
"maximum": 256
},
"height": {
"type": "number",
"minimum": -256,
"maximum": 256
},
"color": {
"description": "Color to paint. Use a palette index (number), a hex string like '#38b764' (auto-added to the palette), 'transparent', or null to erase.",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "null"
}
]
},
"spriteId": {
"type": "string"
},
"frameIndex": {
"type": "number"
},
"allFrames": {
"type": "boolean"
},
"layerId": {
"type": "string"
}
},
"required": [
"x",
"y",
"width",
"height",
"color"
]
}
}flood_fillAction
Bucket-fill: starting at x,y, replace all connected pixels of the same color with the new color (transparent counts as a color). Fails clearly if the start pixel is out of bounds.
View tool JSON
{
"name": "flood_fill",
"kind": "act",
"impl": "imperative",
"description": "Bucket-fill: starting at x,y, replace all connected pixels of the same color with the new color (transparent counts as a color). Fails clearly if the start pixel is out of bounds.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"color": {
"description": "Color to paint. Use a palette index (number), a hex string like '#38b764' (auto-added to the palette), 'transparent', or null to erase.",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "null"
}
]
},
"spriteId": {
"type": "string"
},
"frameIndex": {
"type": "number"
},
"layerId": {
"type": "string"
}
},
"required": [
"x",
"y",
"color"
]
}
}clear_frameAction
Erase every pixel of one sprite frame, making it fully transparent.
View tool JSON
{
"name": "clear_frame",
"kind": "act",
"impl": "imperative",
"description": "Erase every pixel of one sprite frame, making it fully transparent.",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string"
},
"frameIndex": {
"type": "number"
},
"layerId": {
"type": "string"
}
}
}
}transform_spriteAction
Apply a geometric transform to a sprite. Ops: flip_h, flip_v, rotate_90 (clockwise), rotate (RotSprite-style nearest-neighbor angle in degrees), shift (wrap-around move by dx/dy), outline (adds outlineColor around silhouettes). Applies to all frames unless frameIndices given.
View tool JSON
{
"name": "transform_sprite",
"kind": "act",
"impl": "imperative",
"description": "Apply a geometric transform to a sprite. Ops: flip_h, flip_v, rotate_90 (clockwise), rotate (RotSprite-style nearest-neighbor angle in degrees), shift (wrap-around move by dx/dy), outline (adds outlineColor around silhouettes). Applies to all frames unless frameIndices given.",
"inputSchema": {
"type": "object",
"properties": {
"op": {
"type": "string",
"enum": [
"flip_h",
"flip_v",
"rotate_90",
"rotate",
"shift",
"outline"
]
},
"dx": {
"type": "number",
"description": "shift only: horizontal offset"
},
"dy": {
"type": "number",
"description": "shift only: vertical offset"
},
"angle": {
"type": "number",
"description": "rotate only: clockwise angle in degrees; keeps the sprite dimensions"
},
"color": {
"description": "outline only: outline color (defaults to palette index 0)",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "null"
}
]
},
"frameIndices": {
"type": "array",
"items": {
"type": "number"
},
"description": "Which frames; omit for all."
},
"spriteId": {
"type": "string"
},
"layerId": {
"type": "string"
}
},
"required": [
"op"
]
}
}replace_colorAction
Swap every occurrence of one palette color for another across a sprite (or the whole project if no spriteId). Accepts palette indices or hex strings.
View tool JSON
{
"name": "replace_color",
"kind": "act",
"impl": "imperative",
"description": "Swap every occurrence of one palette color for another across a sprite (or the whole project if no spriteId). Accepts palette indices or hex strings.",
"inputSchema": {
"type": "object",
"properties": {
"from": {
"description": "Color to replace.",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "null"
}
]
},
"to": {
"description": "Replacement color ('transparent'/null erases).",
"anyOf": [
{
"type": "number"
},
{
"type": "string"
},
{
"type": "null"
}
]
},
"spriteId": {
"type": "string",
"description": "Scope to one sprite; omit for all sprites."
},
"layerId": {
"type": "string",
"description": "Scope to one layer; omit for all layers."
}
},
"required": [
"from",
"to"
]
}
}add_palette_colorAction
Add a new hex color to the shared project palette and get its index back.
View tool JSON
{
"name": "add_palette_color",
"kind": "act",
"impl": "imperative",
"description": "Add a new hex color to the shared project palette and get its index back.",
"inputSchema": {
"type": "object",
"properties": {
"hex": {
"type": "string",
"description": "e.g. '#ffcd75'"
}
},
"required": [
"hex"
]
}
}set_palette_alphaAction
Set the selected palette entry's opacity from 0 to 1 without changing its color index.
View tool JSON
{
"name": "set_palette_alpha",
"kind": "act",
"impl": "imperative",
"description": "Set the selected palette entry's opacity from 0 to 1 without changing its color index.",
"inputSchema": {
"type": "object",
"properties": {
"index": {
"type": "number"
},
"alpha": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"index",
"alpha"
]
}
}move_palette_colorAction
Reorder a palette entry while remapping all pixel indices so the artwork keeps its appearance.
View tool JSON
{
"name": "move_palette_color",
"kind": "act",
"impl": "imperative",
"description": "Reorder a palette entry while remapping all pixel indices so the artwork keeps its appearance.",
"inputSchema": {
"type": "object",
"properties": {
"fromIndex": {
"type": "number"
},
"toIndex": {
"type": "number"
}
},
"required": [
"fromIndex",
"toIndex"
]
}
}set_active_spriteAction
Switch the human's editor view to a given sprite (and optionally frame). Use this to show them something you made or want them to review.
View tool JSON
{
"name": "set_active_sprite",
"kind": "act",
"impl": "imperative",
"description": "Switch the human's editor view to a given sprite (and optionally frame). Use this to show them something you made or want them to review.",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string"
},
"frameIndex": {
"type": "number"
}
},
"required": [
"spriteId"
]
}
}add_frameAction
Add a new animation frame to a character sprite, copying an existing frame by default so it can be nudged into the next pose.
View tool JSON
{
"name": "add_frame",
"kind": "act",
"impl": "imperative",
"description": "Add a new animation frame to a character sprite, copying an existing frame by default so it can be nudged into the next pose.",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string"
},
"copyFrameIndex": {
"type": "number",
"description": "Frame to duplicate. Defaults to the last frame."
},
"layerId": {
"type": "string",
"description": "Layer id. Defaults to the selected layer."
}
}
}
}delete_frameSensitive Action
Delete one animation frame from a sprite. Requires confirm:true. Refuses to delete a sprite's last remaining frame.
View tool JSON
{
"name": "delete_frame",
"kind": "transact",
"impl": "imperative",
"description": "Delete one animation frame from a sprite. Requires confirm:true. Refuses to delete a sprite's last remaining frame.",
"inputSchema": {
"type": "object",
"properties": {
"frameIndex": {
"type": "number",
"description": "Zero-based frame to delete"
},
"spriteId": {
"type": "string"
},
"layerId": {
"type": "string",
"description": "Layer id. Defaults to the selected layer."
},
"confirm": {
"type": "boolean",
"description": "Must be true to perform the deletion"
}
},
"required": [
"frameIndex",
"confirm"
]
}
}link_frameAction
Link two cels on one layer so future pixel edits stay synchronized across both frames.
View tool JSON
{
"name": "link_frame",
"kind": "act",
"impl": "imperative",
"description": "Link two cels on one layer so future pixel edits stay synchronized across both frames.",
"inputSchema": {
"type": "object",
"properties": {
"frameIndex": {
"type": "number",
"description": "Zero-based cel to link"
},
"targetIndex": {
"type": "number",
"description": "Zero-based cel to link it with"
},
"spriteId": {
"type": "string"
},
"layerId": {
"type": "string",
"description": "Layer id. Defaults to the selected layer."
}
},
"required": [
"frameIndex",
"targetIndex"
]
}
}unlink_frameAction
Detach one cel from its linked group so it can be edited independently.
View tool JSON
{
"name": "unlink_frame",
"kind": "act",
"impl": "imperative",
"description": "Detach one cel from its linked group so it can be edited independently.",
"inputSchema": {
"type": "object",
"properties": {
"frameIndex": {
"type": "number"
},
"spriteId": {
"type": "string"
},
"layerId": {
"type": "string",
"description": "Layer id. Defaults to the selected layer."
}
},
"required": [
"frameIndex"
]
}
}add_layerAction
Create an empty animation layer above the selected layer. It starts with matching cels so it can be painted immediately.
View tool JSON
{
"name": "add_layer",
"kind": "act",
"impl": "imperative",
"description": "Create an empty animation layer above the selected layer. It starts with matching cels so it can be painted immediately.",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string",
"description": "Sprite id; defaults to the active sprite."
},
"name": {
"type": "string",
"description": "Layer name; defaults to Layer."
},
"aboveLayerId": {
"type": "string",
"description": "Insert above this layer; defaults to the top."
}
}
}
}duplicate_layerAction
Copy a layer, including every cel, and place the copy directly above it.
View tool JSON
{
"name": "duplicate_layer",
"kind": "act",
"impl": "imperative",
"description": "Copy a layer, including every cel, and place the copy directly above it.",
"inputSchema": {
"type": "object",
"properties": {
"layerId": {
"type": "string"
},
"spriteId": {
"type": "string"
}
},
"required": [
"layerId"
]
}
}delete_layerSensitive Action
Delete a layer after explicit confirmation. A sprite must keep at least one layer.
View tool JSON
{
"name": "delete_layer",
"kind": "transact",
"impl": "imperative",
"description": "Delete a layer after explicit confirmation. A sprite must keep at least one layer.",
"inputSchema": {
"type": "object",
"properties": {
"layerId": {
"type": "string"
},
"spriteId": {
"type": "string"
},
"confirm": {
"type": "boolean"
}
},
"required": [
"layerId",
"confirm"
]
}
}move_layerAction
Move a layer one slot up or down in the stack. Direction 1 moves toward the top.
View tool JSON
{
"name": "move_layer",
"kind": "act",
"impl": "imperative",
"description": "Move a layer one slot up or down in the stack. Direction 1 moves toward the top.",
"inputSchema": {
"type": "object",
"properties": {
"layerId": {
"type": "string"
},
"direction": {
"type": "number",
"enum": [
-1,
1
]
},
"spriteId": {
"type": "string"
}
},
"required": [
"layerId",
"direction"
]
}
}set_layer_propertiesAction
Update a layer name, visibility, lock, opacity, or blend mode.
View tool JSON
{
"name": "set_layer_properties",
"kind": "act",
"impl": "imperative",
"description": "Update a layer name, visibility, lock, opacity, or blend mode.",
"inputSchema": {
"type": "object",
"properties": {
"layerId": {
"type": "string"
},
"spriteId": {
"type": "string"
},
"name": {
"type": "string"
},
"visible": {
"type": "boolean"
},
"locked": {
"type": "boolean"
},
"opacity": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"blendMode": {
"type": "string",
"enum": [
"normal",
"multiply",
"screen",
"overlay"
]
}
},
"required": [
"layerId"
]
}
}set_animation_previewAction
Control playback mode, tagged range, speed, and onion-skin display without changing sprite pixels.
View tool JSON
{
"name": "set_animation_preview",
"kind": "act",
"impl": "imperative",
"description": "Control playback mode, tagged range, speed, and onion-skin display without changing sprite pixels.",
"inputSchema": {
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"forward",
"reverse",
"ping_pong"
]
},
"tagId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"fps": {
"type": "number",
"minimum": 1,
"maximum": 30
},
"playing": {
"type": "boolean"
},
"onion": {
"type": "boolean"
},
"onionMode": {
"type": "string",
"enum": [
"tint",
"red_blue"
]
}
}
}
}set_canvas_optionsAction
Set zoom, grid, pixel-perfect stroke, shading ink, tiled preview, and dither brush options. The default canvas is a 256x256 logical grid displayed at 1px per cell; zoom in for detailed editing.
View tool JSON
{
"name": "set_canvas_options",
"kind": "act",
"impl": "imperative",
"description": "Set zoom, grid, pixel-perfect stroke, shading ink, tiled preview, and dither brush options. The default canvas is a 256x256 logical grid displayed at 1px per cell; zoom in for detailed editing.",
"inputSchema": {
"type": "object",
"properties": {
"zoom": {
"type": "number",
"minimum": 1,
"maximum": 16
},
"showGrid": {
"type": "boolean"
},
"pixelPerfect": {
"type": "boolean"
},
"shadingMode": {
"type": "boolean"
},
"tiledMode": {
"type": "boolean"
},
"brushMode": {
"type": "string",
"enum": [
"solid",
"checker",
"dots"
]
}
}
}
}add_frame_tagAction
Create a named animation section over a range of frames, such as idle or walk.
View tool JSON
{
"name": "add_frame_tag",
"kind": "act",
"impl": "imperative",
"description": "Create a named animation section over a range of frames, such as idle or walk.",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string"
},
"name": {
"type": "string"
},
"from": {
"type": "number"
},
"to": {
"type": "number"
},
"color": {
"type": "string"
}
},
"required": [
"name"
]
}
}delete_frame_tagSensitive Action
Delete a named animation section after explicit confirmation.
View tool JSON
{
"name": "delete_frame_tag",
"kind": "transact",
"impl": "imperative",
"description": "Delete a named animation section after explicit confirmation.",
"inputSchema": {
"type": "object",
"properties": {
"tagId": {
"type": "string"
},
"spriteId": {
"type": "string"
},
"confirm": {
"type": "boolean"
}
},
"required": [
"tagId",
"confirm"
]
}
}rename_spriteAction
Rename an existing sprite (e.g. after giving an untitled sprite an identity).
View tool JSON
{
"name": "rename_sprite",
"kind": "act",
"impl": "imperative",
"description": "Rename an existing sprite (e.g. after giving an untitled sprite an identity).",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string"
},
"name": {
"type": "string",
"maxLength": 128,
"description": "New name (non-empty)"
}
},
"required": [
"spriteId",
"name"
]
}
}add_spriteAction
Create a new empty sprite (character, item, or tile for the tileset). It becomes the active sprite so the human sees it immediately. Character sprites default to 4 empty animation frames and items/tiles default to 1; pass frameCount to choose another count. Optionally copy dimensions/content from an existing sprite.
View tool JSON
{
"name": "add_sprite",
"kind": "act",
"impl": "imperative",
"description": "Create a new empty sprite (character, item, or tile for the tileset). It becomes the active sprite so the human sees it immediately. Character sprites default to 4 empty animation frames and items/tiles default to 1; pass frameCount to choose another count. Optionally copy dimensions/content from an existing sprite.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 128
},
"width": {
"type": "number",
"description": "1-256 logical pixels, typically 16, 32, 64, 128, or 256"
},
"height": {
"type": "number",
"description": "1-256 logical pixels, typically 16, 32, 64, 128, or 256"
},
"kind": {
"type": "string",
"enum": [
"character",
"item",
"tile"
],
"description": "'tile' adds it to the tileset for map painting."
},
"copyFromId": {
"type": "string",
"description": "Clone pixels from this sprite id if sizes match."
},
"frameCount": {
"type": "number",
"minimum": 1,
"maximum": 32,
"description": "Animation frame count. Defaults to 4 for characters and 1 for items/tiles."
}
},
"required": [
"name",
"width",
"height",
"kind"
]
}
}get_tilemapAnswer
Read the tilemap grid as ASCII rows where each token maps to a tileset sprite via the returned legend. Maps with more than 64 tiles use two-character tokens and return tokenWidth: 2.
View tool JSON
{
"name": "get_tilemap",
"kind": "answer",
"impl": "imperative",
"description": "Read the tilemap grid as ASCII rows where each token maps to a tileset sprite via the returned legend. Maps with more than 64 tiles use two-character tokens and return tokenWidth: 2.",
"inputSchema": {
"type": "object",
"properties": {}
}
}ensure_tilemapAction
Create the project tilemap (or resize it, preserving overlapping cells) so tiles can be placed. Cols/rows are clamped to 2-64; default to 12x9 when unsure. No-ops with ok:true if the map already has these dimensions.
View tool JSON
{
"name": "ensure_tilemap",
"kind": "act",
"impl": "imperative",
"description": "Create the project tilemap (or resize it, preserving overlapping cells) so tiles can be placed. Cols/rows are clamped to 2-64; default to 12x9 when unsure. No-ops with ok:true if the map already has these dimensions.",
"inputSchema": {
"type": "object",
"properties": {
"cols": {
"type": "number",
"minimum": 2,
"maximum": 64,
"description": "Map width in tiles (2-64)"
},
"rows": {
"type": "number",
"minimum": 2,
"maximum": 64,
"description": "Map height in tiles (2-64)"
}
},
"required": [
"cols",
"rows"
]
}
}place_tileAction
Put one tileset sprite at a map coordinate. Pass tileId=null or 'empty' to clear the cell.
View tool JSON
{
"name": "place_tile",
"kind": "act",
"impl": "imperative",
"description": "Put one tileset sprite at a map coordinate. Pass tileId=null or 'empty' to clear the cell.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"tileId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"x",
"y"
]
}
}fill_tilesAction
Fill a rectangular region of the tilemap with one tileset sprite. Pass tileId=null or 'empty' to clear the area.
View tool JSON
{
"name": "fill_tiles",
"kind": "act",
"impl": "imperative",
"description": "Fill a rectangular region of the tilemap with one tileset sprite. Pass tileId=null or 'empty' to clear the area.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"minimum": -64,
"maximum": 64
},
"y": {
"type": "number",
"minimum": -64,
"maximum": 64
},
"width": {
"type": "number",
"minimum": -64,
"maximum": 64
},
"height": {
"type": "number",
"minimum": -64,
"maximum": 64
},
"tileId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"x",
"y",
"width",
"height"
]
}
}critique_artworkAction
Run the built-in pixel-art tutor analysis on a sprite: color discipline, value contrast, outline strength, noise, centering, symmetry, animation readiness. Returns a score, stats and findings with concrete tips. Use it to give the human structured feedback before/after you edit.
View tool JSON
{
"name": "critique_artwork",
"kind": "act",
"impl": "imperative",
"description": "Run the built-in pixel-art tutor analysis on a sprite: color discipline, value contrast, outline strength, noise, centering, symmetry, animation readiness. Returns a score, stats and findings with concrete tips. Use it to give the human structured feedback before/after you edit.",
"inputSchema": {
"type": "object",
"properties": {
"spriteId": {
"type": "string",
"description": "Defaults to the active sprite."
}
}
}
}export_projectAction
Serialize the entire project (palette, sprites, frames, tilemap) as JSON that can be re-imported via the import_project tool, the Sprites > Project file > Import button, or a share permalink.
View tool JSON
{
"name": "export_project",
"kind": "act",
"impl": "imperative",
"description": "Serialize the entire project (palette, sprites, frames, tilemap) as JSON that can be re-imported via the import_project tool, the Sprites > Project file > Import button, or a share permalink.",
"inputSchema": {
"type": "object",
"properties": {}
}
}import_projectAction
Replace the current project with one previously exported via export_project (or a project file). The JSON is sanitized and validated; the human sees the imported project immediately.
View tool JSON
{
"name": "import_project",
"kind": "act",
"impl": "imperative",
"description": "Replace the current project with one previously exported via export_project (or a project file). The JSON is sanitized and validated; the human sees the imported project immediately.",
"inputSchema": {
"type": "object",
"properties": {
"json": {
"type": "string",
"description": "Full project JSON string"
}
},
"required": [
"json"
]
}
}new_canvasAction
Replace the current project with a fresh blank 256x256 logical canvas (one empty character sprite, default palette, no tilemap). Defaults to 4 empty animation frames; pass frameCount to choose another count. Requires confirm:true. The human sees the blank canvas immediately; use this to start a new drawing together.
View tool JSON
{
"name": "new_canvas",
"kind": "act",
"impl": "imperative",
"description": "Replace the current project with a fresh blank 256x256 logical canvas (one empty character sprite, default palette, no tilemap). Defaults to 4 empty animation frames; pass frameCount to choose another count. Requires confirm:true. The human sees the blank canvas immediately; use this to start a new drawing together.",
"inputSchema": {
"type": "object",
"properties": {
"confirm": {
"type": "boolean",
"description": "Must be true to clear the current project"
},
"frameCount": {
"type": "number",
"minimum": 1,
"maximum": 32,
"description": "Optional animation frame count; defaults to 4."
}
},
"required": [
"confirm"
]
}
}start_tutorialAction
Open the step-by-step guided tour overlay (shared with the room, so following humans see the same step) and jump to a step. Use it to walk the human through the whole app, then guide them to a first project together with your drawing tools.
View tool JSON
{
"name": "start_tutorial",
"kind": "act",
"impl": "imperative",
"description": "Open the step-by-step guided tour overlay (shared with the room, so following humans see the same step) and jump to a step. Use it to walk the human through the whole app, then guide them to a first project together with your drawing tools.",
"inputSchema": {
"type": "object",
"properties": {
"step": {
"type": "number",
"description": "Zero-based step index. Defaults to 0 (the beginning)."
}
}
}
}tutorial_gotoAction
Jump the shared guided-tour overlay to a given step (0-based). Pair each step with a live demo using your drawing tools.
View tool JSON
{
"name": "tutorial_goto",
"kind": "act",
"impl": "imperative",
"description": "Jump the shared guided-tour overlay to a given step (0-based). Pair each step with a live demo using your drawing tools.",
"inputSchema": {
"type": "object",
"properties": {
"step": {
"type": "number",
"description": "Zero-based step index"
}
},
"required": [
"step"
]
}
}end_tutorialAction
Close the shared guided-tour overlay on this window (following humans keep their own copy until they close it). Call it when the tour is done so it never pops back up.
View tool JSON
{
"name": "end_tutorial",
"kind": "act",
"impl": "imperative",
"description": "Close the shared guided-tour overlay on this window (following humans keep their own copy until they close it). Call it when the tour is done so it never pops back up.",
"inputSchema": {
"type": "object",
"properties": {}
}
}rename_projectAction
Rename the current project (e.g. 'guided-tutorial-01' when starting a tutorial piece). The human sees the new title immediately.
View tool JSON
{
"name": "rename_project",
"kind": "act",
"impl": "imperative",
"description": "Rename the current project (e.g. 'guided-tutorial-01' when starting a tutorial piece). The human sees the new title immediately.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 128,
"description": "New project name (non-empty)"
}
},
"required": [
"name"
]
}
}save_projectAction
Save the current project into the on-device library under a name (defaults to the project name), so it can be reopened later with open_project. Saved names are listed in get_project_state.
View tool JSON
{
"name": "save_project",
"kind": "act",
"impl": "imperative",
"description": "Save the current project into the on-device library under a name (defaults to the project name), so it can be reopened later with open_project. Saved names are listed in get_project_state.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Slot name, e.g. 'guided-tutorial-01'. Defaults to the project name."
}
}
}
}open_projectAction
Replace the current project with a saved one from the on-device library. Requires confirm:true. The human sees the opened project immediately.
View tool JSON
{
"name": "open_project",
"kind": "act",
"impl": "imperative",
"description": "Replace the current project with a saved one from the on-device library. Requires confirm:true. The human sees the opened project immediately.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Saved project name"
},
"confirm": {
"type": "boolean",
"description": "Must be true to replace the current project"
}
},
"required": [
"name",
"confirm"
]
}
}save_paletteAction
Save the current shared palette into the on-device library under a name, so it can be merged into any project later with apply_palette. Saved names are listed in get_project_state.
View tool JSON
{
"name": "save_palette",
"kind": "act",
"impl": "imperative",
"description": "Save the current shared palette into the on-device library under a name, so it can be merged into any project later with apply_palette. Saved names are listed in get_project_state.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Slot name. Defaults to '<project> palette'."
}
}
}
}apply_paletteAction
Merge a saved palette into the current project: missing colors are appended (up to 64), existing indices never move so artwork is untouched. Reports how many colors were added.
View tool JSON
{
"name": "apply_palette",
"kind": "act",
"impl": "imperative",
"description": "Merge a saved palette into the current project: missing colors are appended (up to 64), existing indices never move so artwork is untouched. Reports how many colors were added.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Saved palette name"
}
},
"required": [
"name"
]
}
}