Tool tree
gradeNot graded
paint_cellsAction
Paint cells on one frame (brush/eraser/fill/line). Batch ALL cells for one frame into a single call. Coordinates are 0-based with y=0 at the top row; out-of-bounds cells are rejected. Paint in color — vary fg across elements, never a whole piece in one fg.
View tool JSON
{
"name": "paint_cells",
"kind": "act",
"impl": "imperative",
"description": "Paint cells on one frame (brush/eraser/fill/line). Batch ALL cells for one frame into a single call. Coordinates are 0-based with y=0 at the top row; out-of-bounds cells are rejected. Paint in color — vary fg across elements, never a whole piece in one fg.",
"inputSchema": {
"type": "object",
"properties": {
"frame": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
},
"cells": {
"type": "array",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "0-based column"
},
"y": {
"type": "number",
"description": "0-based row, y=0 is the top row"
},
"ch": {
"type": "string",
"description": "exactly one character; \" \" erases"
},
"fg": {
"type": "string",
"description": "foreground hex color, e.g. \"#4ade80\""
},
"bg": {
"type": "string",
"description": "background hex color, or \"\" for transparent"
}
},
"required": [
"x",
"y",
"ch",
"fg"
]
},
"description": "cells to paint on that frame"
}
},
"required": [
"frame",
"cells"
]
}
}recolor_cellsAction
Change ONLY the colors of existing cells on one frame, keeping their characters (the Paint tool). Use this to recolor art that is already drawn.
View tool JSON
{
"name": "recolor_cells",
"kind": "act",
"impl": "imperative",
"description": "Change ONLY the colors of existing cells on one frame, keeping their characters (the Paint tool). Use this to recolor art that is already drawn.",
"inputSchema": {
"type": "object",
"properties": {
"frame": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
},
"cells": {
"type": "array",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"fg": {
"type": "string"
},
"bg": {
"type": "string"
}
},
"required": [
"x",
"y",
"fg",
"bg"
]
}
}
},
"required": [
"frame",
"cells"
]
}
}add_frameAction
Insert a blank frame after the given 0-based frame index.
View tool JSON
{
"name": "add_frame",
"kind": "act",
"impl": "imperative",
"description": "Insert a blank frame after the given 0-based frame index.",
"inputSchema": {
"type": "object",
"properties": {
"after": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
}
},
"required": [
"after"
]
}
}duplicate_frameAction
Duplicate a frame, inserting the copy right after it.
View tool JSON
{
"name": "duplicate_frame",
"kind": "act",
"impl": "imperative",
"description": "Duplicate a frame, inserting the copy right after it.",
"inputSchema": {
"type": "object",
"properties": {
"index": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
}
},
"required": [
"index"
]
}
}delete_frameSensitive Action
Delete a frame. The document must keep at least one frame, so deleting the last remaining frame is rejected.
View tool JSON
{
"name": "delete_frame",
"kind": "transact",
"impl": "imperative",
"description": "Delete a frame. The document must keep at least one frame, so deleting the last remaining frame is rejected.",
"inputSchema": {
"type": "object",
"properties": {
"index": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
}
},
"required": [
"index"
]
}
}clear_frameAction
Erase every cell in a frame (keeps its holdMs). To hand the user a blank slate, clear every frame instead of deleting them.
View tool JSON
{
"name": "clear_frame",
"kind": "act",
"impl": "imperative",
"description": "Erase every cell in a frame (keeps its holdMs). To hand the user a blank slate, clear every frame instead of deleting them.",
"inputSchema": {
"type": "object",
"properties": {
"frame": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
}
},
"required": [
"frame"
]
}
}move_frameAction
Move a frame from one 0-based position to another.
View tool JSON
{
"name": "move_frame",
"kind": "act",
"impl": "imperative",
"description": "Move a frame from one 0-based position to another.",
"inputSchema": {
"type": "object",
"properties": {
"from": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
},
"to": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
}
},
"required": [
"from",
"to"
]
}
}set_holdAction
Set how long a frame displays during playback, in milliseconds.
View tool JSON
{
"name": "set_hold",
"kind": "act",
"impl": "imperative",
"description": "Set how long a frame displays during playback, in milliseconds.",
"inputSchema": {
"type": "object",
"properties": {
"index": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
},
"holdMs": {
"type": "number",
"description": "display time in milliseconds"
}
},
"required": [
"index",
"holdMs"
]
}
}set_themeAction
Switch the document theme (canvas background + stamp colors). Only use when the user asks for a different mood or palette.
View tool JSON
{
"name": "set_theme",
"kind": "act",
"impl": "imperative",
"description": "Switch the document theme (canvas background + stamp colors). Only use when the user asks for a different mood or palette.",
"inputSchema": {
"type": "object",
"properties": {
"themeId": {
"type": "string",
"description": "one of: dracula, monokai, nord, solarized, tokyo, onedark"
}
},
"required": [
"themeId"
]
}
}rename_documentAction
Rename the document.
View tool JSON
{
"name": "rename_document",
"kind": "act",
"impl": "imperative",
"description": "Rename the document.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": [
"name"
]
}
}resize_canvasAction
Resize the canvas (width 4-64, height 4-48). Existing art is re-centered on the new canvas; art that does not fit is cropped.
View tool JSON
{
"name": "resize_canvas",
"kind": "act",
"impl": "imperative",
"description": "Resize the canvas (width 4-64, height 4-48). Existing art is re-centered on the new canvas; art that does not fit is cropped.",
"inputSchema": {
"type": "object",
"properties": {
"width": {
"type": "number"
},
"height": {
"type": "number"
}
},
"required": [
"width",
"height"
]
}
}set_active_frameAction
Select which frame is active in the timeline (does not change any art).
View tool JSON
{
"name": "set_active_frame",
"kind": "act",
"impl": "imperative",
"description": "Select which frame is active in the timeline (does not change any art).",
"inputSchema": {
"type": "object",
"properties": {
"index": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
}
},
"required": [
"index"
]
}
}add_stampAction
Create a reusable stamp the user keeps in their Stamps panel. id: lowercase letters/digits/dashes, 1-20 chars, unique across built-in and user stamps. frames: the stamp art — each frame is an array of equal-length row strings, spaces are transparent. Any size, any frame count. Search the catalog (below) before creating: if a built-in stamp fits, place it instead.
View tool JSON
{
"name": "add_stamp",
"kind": "act",
"impl": "imperative",
"description": "Create a reusable stamp the user keeps in their Stamps panel. id: lowercase letters/digits/dashes, 1-20 chars, unique across built-in and user stamps. frames: the stamp art — each frame is an array of equal-length row strings, spaces are transparent. Any size, any frame count. Search the catalog (below) before creating: if a built-in stamp fits, place it instead.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"fg": {
"type": "string",
"description": "default foreground hex color for the stamp"
},
"frames": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
},
"description": "one animation frame: rows of characters"
},
"description": "animation frames of the stamp"
}
},
"required": [
"id",
"fg",
"frames"
]
}
}delete_stampSensitive Action
Remove a user-created stamp by id. Built-in stamps cannot be deleted.
View tool JSON
{
"name": "delete_stamp",
"kind": "transact",
"impl": "imperative",
"description": "Remove a user-created stamp by id. Built-in stamps cannot be deleted.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
]
}
}place_stampAction
Paint a stamp (built-in or user-created) CENTERED on x,y on one frame — this is how you USE stamps, never hand-draw a stamp's cells. Art that extends past the grid edge is clipped to the grid, so placements near the edge partially apply. stampFrame picks which of the stamp's art frames to use (default 0). Coordinates are 0-based with y=0 at the top row.
View tool JSON
{
"name": "place_stamp",
"kind": "act",
"impl": "imperative",
"description": "Paint a stamp (built-in or user-created) CENTERED on x,y on one frame — this is how you USE stamps, never hand-draw a stamp's cells. Art that extends past the grid edge is clipped to the grid, so placements near the edge partially apply. stampFrame picks which of the stamp's art frames to use (default 0). Coordinates are 0-based with y=0 at the top row.",
"inputSchema": {
"type": "object",
"properties": {
"stampId": {
"type": "string",
"description": "built-in id or user stamp id"
},
"frame": {
"type": "number",
"description": "0-based frame index; the UI calls frame N+1 \"frame 1\", and the document context below lists every frame with its index"
},
"x": {
"type": "number",
"description": "center column, 0-based"
},
"y": {
"type": "number",
"description": "center row, 0-based, y=0 is top"
},
"fg": {
"type": "string",
"description": "foreground hex color for the placed art"
},
"bg": {
"type": "string",
"description": "background hex color, or \"\" for transparent"
},
"stampFrame": {
"type": "number",
"description": "which art frame of the stamp to use (default 0)"
}
},
"required": [
"stampId",
"frame",
"x",
"y",
"fg",
"bg"
]
}
}undoAction
Undo the last change to the document — the same undo stack as the toolbar Undo button and keyboard shortcut. Reports "nothing to undo" when the stack is empty.
View tool JSON
{
"name": "undo",
"kind": "act",
"impl": "imperative",
"description": "Undo the last change to the document — the same undo stack as the toolbar Undo button and keyboard shortcut. Reports \"nothing to undo\" when the stack is empty.",
"inputSchema": {
"type": "object",
"properties": {}
}
}redoAction
Redo the last undone change — the same redo stack as the toolbar Redo button and keyboard shortcut. Reports "nothing to redo" when the stack is empty.
View tool JSON
{
"name": "redo",
"kind": "act",
"impl": "imperative",
"description": "Redo the last undone change — the same redo stack as the toolbar Redo button and keyboard shortcut. Reports \"nothing to redo\" when the stack is empty.",
"inputSchema": {
"type": "object",
"properties": {}
}
}set_fontAction
Set the canvas pixel font — the same font picker as the Document panel. fontId is one of: "cozette" (default, widest glyph coverage), "vga" (authentic IBM VGA 8x16), "jetbrains" (JetBrains Mono), "system" (system monospace).
View tool JSON
{
"name": "set_font",
"kind": "act",
"impl": "imperative",
"description": "Set the canvas pixel font — the same font picker as the Document panel. fontId is one of: \"cozette\" (default, widest glyph coverage), \"vga\" (authentic IBM VGA 8x16), \"jetbrains\" (JetBrains Mono), \"system\" (system monospace).",
"inputSchema": {
"type": "object",
"properties": {
"fontId": {
"type": "string",
"description": "one of cozette, vga, jetbrains, system"
}
},
"required": [
"fontId"
]
}
}playAction
Start playing the animation — the same state as the timeline play button. Reports "already playing" when playback is already running.
View tool JSON
{
"name": "play",
"kind": "act",
"impl": "imperative",
"description": "Start playing the animation — the same state as the timeline play button. Reports \"already playing\" when playback is already running.",
"inputSchema": {
"type": "object",
"properties": {}
}
}pauseAction
Pause the animation — the same state as the timeline pause button. Pausing leaves the playhead on the current frame so you can inspect or edit it. Reports "already paused" when playback is already stopped.
View tool JSON
{
"name": "pause",
"kind": "act",
"impl": "imperative",
"description": "Pause the animation — the same state as the timeline pause button. Pausing leaves the playhead on the current frame so you can inspect or edit it. Reports \"already paused\" when playback is already stopped.",
"inputSchema": {
"type": "object",
"properties": {}
}
}describe_documentAnswer
Read the current document: canvas size, frame count, active frame, theme, canvas font, user stamps, and every frame rendered as text with a column ruler, row numbers, and a color legend. Call this first to see what you are editing. Frame indices in actions are 0-based; the UI shows them 1-based.
View tool JSON
{
"name": "describe_document",
"kind": "answer",
"impl": "imperative",
"description": "Read the current document: canvas size, frame count, active frame, theme, canvas font, user stamps, and every frame rendered as text with a column ruler, row numbers, and a color legend. Call this first to see what you are editing. Frame indices in actions are 0-based; the UI shows them 1-based.",
"inputSchema": {
"type": "object",
"properties": {}
}
}