pixel-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pixel-mcpCreate a 16x16 canvas and set pixel (8,8) to red."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pixel-mcp
An MCP (Model Context Protocol) server that lets AI coding agents (Claude Code, Cursor, Windsurf, etc.) create pixel art programmatically. No daemon, no sockets, no Go runtime — just a lightweight TypeScript server that runs via npx.
Install
Use with Claude Code
Run this from your project directory:
claude mcp add pixel-art npx -- pxcli-mcp --export-dir ./assets/spritesThis registers the server in Claude Code's config scoped to your project. Verify it's connected with /mcp.
Use with any MCP client
npx pxcli-mcp --export-dir ./outputFrom source
npm install
npm run build
node dist/index.js --export-dir ./outputRelated MCP server: Aseprite MCP
Quick start
Once configured, Claude (or any MCP client) can use these tools directly:
create_canvas(name: "hero", width: 16, height: 16)
fill_rect(canvas: "hero", x: 0, y: 0, width: 16, height: 16, color: "black")
set_pixel(canvas: "hero", x: 8, y: 4, color: "#ff0000")
draw_line(canvas: "hero", x1: 0, y1: 15, x2: 15, y2: 15, color: "white")
export_png(canvas: "hero", filename: "hero.png")Tools
Tool | Description |
| Create a named canvas with given dimensions (max 256x256) |
| List all active canvases and their sizes |
| Set a single pixel color |
| Read a pixel's color |
| Fill a rectangle with a solid color |
| Draw a line between two points (Bresenham's algorithm) |
| Clear entire canvas to a color (default: transparent) |
| Export canvas to a PNG file |
| Undo the last drawing operation |
| Redo the last undone operation |
All drawing tools accept a canvas parameter (defaults to "default"), so you can work on multiple sprites simultaneously.
Color formats
Hex:
#rgb,#rrggbb,#rrggbbaaNamed:
red,green,blue,white,black,transparent,yellow,cyan,magenta,orange,purple,gray,grey,pink,brown,lime,navy,teal,maroon,olive
CLI options
Flag | Description |
| Directory for exported PNGs (defaults to CWD) |
Playground (live preview)
The repo includes viewer.html — a browser-based playground for watching pixel art being drawn in real time.
Serve the file locally:
npx serve .Open
http://localhost:3000/viewer.htmlin your browser
The playground has two columns:
Left: Scaled pixel canvas with coordinate tracker on hover
Right: Prompt field, canvas settings (name, dimensions, scale, background, export dir), action buttons, and a live operation log
The canvas exposes global drawing functions (px, rect, line) that can be called from the browser console or via browser automation tools (e.g. Claude in Chrome). This makes it easy to visually verify pixel art as it's being drawn step by step.
Drawing from the browser console
// Set a red pixel at (10, 5)
px(10, 5, 255, 0, 0, 255)
// Fill a blue rectangle
rect(0, 0, 16, 16, 0, 0, 255, 255)
// Draw a green line
line(0, 0, 15, 15, 0, 255, 0, 255)
// Update status message
setStatus('Drawing complete!')Development
npm install
npm run build
npm test # runs 22 tests (unit + MCP integration)
npm run dev # watch mode for TypeScript compilationCredits
Inspired by and built on top of vossenwout/pixel-art-cli — thank you for the original Go daemon-based pixel art CLI that made this possible.
Available Tools
10 toolsclearB
Clear the entire canvas to a color (default: transparent).
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Clear color | transparent |
| canvas | No | Canvas name | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action and default color but does not mention that clearing is destructive, whether it can be undone, how it interacts with named canvases, or what happens to existing content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clear sentence with no filler. The core action and default behavior are front-loaded, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the schema fully documents its two optional parameters, but for a destructive operation with no annotations and no output schema, the description should clarify undoability or irreversible effects. It is adequate for basic invocation but leaves important behavioral context implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented. The description adds only the 'entire canvas' scope and reiterates the transparent default, providing minimal extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb ('Clear') and identifies the exact resource ('the entire canvas') and the color parameter. This clearly differentiates it from sibling tools like set_pixel and fill_rect, though it does not explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'entire canvas' implies this is for whole-canvas resets rather than partial drawing operations, but the description gives no explicit when-to-use or when-not-to-use guidance and does not reference alternatives such as fill_rect or undo.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_canvasA
Create a new named canvas with given dimensions. If a canvas with this name exists, it is replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Canvas name | default |
| width | Yes | Width in pixels | |
| height | Yes | Height in pixels |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It explicitly reveals the key destructive behavior: 'If a canvas with this name exists, it is replaced.' This is important because an agent might otherwise assume creation fails when the name is taken. It could also mention return behavior, but the replacement semantics are the most critical behavioral trait and are clearly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The primary purpose is front-loaded, and the critical replacement behavior is stated immediately after. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create/replace tool with a fully documented schema and no output schema, the description covers the essential behavior. The main missing element is explicit guidance about when to use this tool relative to the siblings, but the creation and replacement semantics are sufficient for correct invocation in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, width, and height with defaults and constraints. The description only restates the concepts of 'named' and 'dimensions' without adding new meaning, such as how width/height interact with replacement or coordinate origin. This matches the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create a new named canvas') and the resource, and adds a precise scoping detail: dimensions and name. It also distinguishes itself from sibling tools by emphasizing named canvas creation and replacement, so there is no confusion with list_canvases, set_pixel, or drawing operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is for initializing or replacing a canvas by name, but it does not explicitly state when to use it versus alternatives, nor does it mention prerequisites or exclusions. For example, it does not say to check list_canvases first or to use clear/undo for resetting content within an existing canvas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draw_lineA
Draw a line between two points using Bresenham's algorithm.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X | |
| x2 | Yes | End X | |
| y1 | Yes | Start Y | |
| y2 | Yes | End Y | |
| color | Yes | Line color | |
| canvas | No | Canvas name | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of explaining behaviors such as mutating a canvas, selecting which canvas to draw on, handling out-of-bounds coordinates, or what the tool returns. Saying it uses Bresenham's algorithm hints at rasterization but does not disclose the actual side effects or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence with the core action front-loaded and no filler. The algorithm reference is optional but does not make the description bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema fully documents parameters, and the purpose is clear enough to select the tool. But the description omits the canvas context, side effects, and any return or error behavior, which makes it only minimally complete for an agent without annotations or an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all parameters with 100% coverage, so the baseline is 3. The description's 'between two points' loosely maps to the x1/y1 and x2/y2 pairs but adds no extra meaning about coordinate constraints, color format, or the optional canvas parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Draw') and resource ('a line between two points'), which clearly distinguishes it from sibling tools like set_pixel, fill_rect, and clear. The Bresenham mention adds detail without obscuring what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied: use this when you need to draw a line between two points. However, there is no explicit guidance about when not to use it or which sibling tool would be a better alternative for related shapes or pixel-level operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_pngB
Export a canvas to a PNG file.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas | No | Canvas name | default |
| filename | Yes | Output filename (e.g. hero.png). Saved to --export-dir or CWD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, but it only restates the purpose. It does not mention side effects such as file creation, overwriting behavior, or failure modes when the canvas doesn't exist, leaving the tool's behavior largely undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. It is front-loaded with the core action and output format, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the schema covers parameters, but without annotations or behavioral details the description provides only minimal context. Missing information like overwrite behavior or error conditions means it is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents both parameters (canvas name and output filename). The description adds no extra parameter meaning beyond the schema, warranting the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Export a canvas to a PNG file.' This makes the tool's primary operation clear. However, it does not explicitly contrast with siblings like create_canvas or draw_line, so it misses the top score for sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to choose export_png over other canvas tools, nor any exclusions or conditions. The description simply states the action without contextual usage advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_rectB
Fill a rectangle with a solid color.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Top-left X | |
| y | Yes | Top-left Y | |
| color | Yes | Fill color | |
| width | Yes | Rectangle width | |
| canvas | No | Canvas name | default |
| height | Yes | Rectangle height |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. 'Fill a rectangle with a solid color' communicates the core mutation, but does not disclose effects on existing pixels, canvas selection semantics, or coordinate/clipping behavior. A 3 is appropriate for minimal viable transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler words. It directly names the action and the target resource, earning every word it uses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple drawing primitive, this is adequate alongside a fully described schema, but it lacks usage routing and behavioral caveats. The absence of annotations and an output schema means the description could add more context about effects and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents x, y, width, height, color, and canvas. The description only adds the concept of a solid-color fill, which does not meaningfully expand on the parameter semantics already present. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: filling a rectangle with a solid color. This clearly distinguishes it from sibling tools like set_pixel, draw_line, and clear, even though it does not explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance about when to use fill_rect instead of set_pixel, draw_line, or clear. Usage is only vaguely implied by the tool name and the action described, not explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pixelB
Get the color of a single pixel.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate | |
| y | Yes | Y coordinate | |
| canvas | No | Canvas name | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description has the full burden of disclosing behavior. It states that the tool reads a pixel's color, but does not explain the return format, coordinate bounds, invalid-pixel handling, or the meaning of the default canvas. An agent cannot predict the tool's output or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler, and the core action is front-loaded. It is appropriately short for a simple tool, though additional context could have been added without much cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description needs to explain what the tool returns and how it behaves on errors or invalid coordinates. It does neither. The low complexity of the tool is offset by the absence of critical return-value information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of the parameters with descriptions, so the baseline is 3. The description adds no extra parameter context beyond the concept of a single pixel, but the schema's own descriptions are sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get') and resource ('the color of a single pixel'), making the tool's read-only purpose immediately obvious. It is distinguishable from sibling mutation tools like set_pixel and fill_rect, though it does not explicitly name or contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when you need to read a pixel's color at given coordinates, which is enough for a basic inference. However, it provides no explicit guidance about when to prefer this over alternatives or what prerequisites exist, such as ensuring the canvas exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_canvasesA
List all active canvases with their dimensions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'List' implies a read-only operation and 'active' scopes the result, but the description does not disclose any side effects, return structure beyond dimensions, or possible limitations like pagination or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single front-loaded sentence that states the action, scope, and output data without any filler. It is appropriately concise for a zero-parameter list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only operation the description is largely sufficient, but with no output schema it omits identifiers or other canvas fields that an agent would need to use sibling tools like set_pixel. It also does not define what 'active' means.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is empty (0 parameters), so there is no parameter burden to document. The baseline of 4 applies because the description does not need to clarify any parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (List), a clear resource (canvases), and a scope qualifier (active), while stating the returned data (dimensions). This makes it clearly distinguishable from the sibling mutation/query tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternative guidance is provided. The usage is implied by the description's declarative statement — an agent can infer that this is for retrieving current canvases — but it does not explain when to prefer it over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redoA
Redo the last undone operation on a canvas.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas | No | Canvas name | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It states the core effect but does not describe what happens when there is nothing to redo, whether the operation is destructive, or any error/no-op behavior. For a mutation-like tool, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every word contributes meaning, and the essential operation and resource are stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, the core behavior and parameter are covered. However, with no annotations and no output schema, the description would benefit from stating the behavior when the redo stack is empty or whether this operation can be repeated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, 'canvas', is fully described in the schema with a default value. The description adds no additional parameter semantics, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('redo'), a precise scope ('the last undone operation'), and a resource ('a canvas'). This clearly distinguishes it from sibling tools like undo and set_pixel without requiring the agent to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Last undone operation' establishes a clear precondition: the tool should be used when an undo has occurred. It gives enough context for an agent to know when to call it, though it does not explicitly mention alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pixelB
Set a single pixel on the canvas.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate | |
| y | Yes | Y coordinate | |
| color | Yes | Color: #rgb, #rrggbb, #rrggbbaa, or named (red, blue, transparent, etc.) | |
| canvas | No | Canvas name | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations to signal safety or side effects, and the description does not disclose behavioral traits beyond the minimal action. It does not state that setting a pixel overwrites existing data, what happens on out-of-bounds coordinates, whether the canvas must already exist, or if undo/redo affects this operation. For a mutating tool, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero filler. Every word earns its place, and it delivers the core action and scope immediately. This is ideal conciseness for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple pixel-setting tool with full schema coverage, the description is minimally adequate to invoke it: an agent can supply x, y, color, and optional canvas. However, there is no mention of coordinate bounds, canvas creation behavior, or failure modes, and no usage alternatives are provided. Given the absence of annotations, a bit more context would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (x, y, color, canvas) already have meaningful descriptions and defaults. The tool description does not add any parameter-level semantics beyond the schema. With high schema coverage, baseline 3 is appropriate even though the description ignores parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Set') and identifies the exact resource ('a single pixel') and target ('the canvas'). This clearly distinguishes it from sibling tools like fill_rect, draw_line, and get_pixel, which operate with different shapes or read operations, so an agent can select it confidently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool vs. alternatives. The description only states what it does; it does not mention that fill_rect, draw_line, or get_pixel are better choices for other scenarios. There is no implied 'when-not' or alternative routing, so the agent must infer usage purely from the tool name and sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undoC
Undo the last drawing operation on a canvas.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas | No | Canvas name | default |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of explaining side effects. It states the basic effect but does not disclose whether undo is limited to a single step, whether it preserves history for redo, whether operations like clear are undoable, or what happens when the history is empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundancy or filler. Every word contributes to identifying the action and target, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no annotations and no output schema, this description is too thin. It omits important operational context such as the undo history model, the interaction with redo and clear, and the behavior when there is nothing to undo. An agent could easily call it incorrectly or misinterpret its scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the 'canvas' parameter with 100% coverage and a default value. The description adds no extra parameter-level meaning, format details, or dependency conditions, so it meets but does not exceed the baseline for schema-covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Undo') and the resource ('the last drawing operation on a canvas'), and it is immediately distinguishable from siblings like redo. However, it does not explicitly contrast itself with redo or explain what counts as a drawing operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies using this tool to revert the most recent drawing action, but provides no explicit guidance on when to choose undo versus redo, how multiple undos behave, or what happens if no drawing operation exists. The sibling list includes redo, so a selection rule would be valuable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
clear - First observed
create_canvas - First observed
draw_line - First observed
export_png - First observed
fill_rect - First observed
get_pixel - First observed
list_canvases - First observed
redo - First observed
set_pixel - First observed
undo
TDQS
Scored across 10 tools
Each tool targets a distinct canvas operation: creation, listing, pixel access, shape drawing, clearing, export, and history control. There is no meaningful overlap or ambiguity between tool purposes.
Most tools follow a clear verb_noun pattern like create_canvas, set_pixel, and export_png. A few names like clear, undo, and redo omit an object, but they are still conventional and readable.
Ten tools is a well-scoped size for a pixel-art canvas server. Each tool covers a necessary part of the drawing workflow without unnecessary bloat or missing essentials.
The core canvas lifecycle is covered: create, list, draw, manipulate pixels, export, and undo/redo. A notable minor gap is the lack of an explicit delete_canvas operation, especially since canvases are described as 'active'.
Maintenance
Related MCP Connectors
MCP server for Flux AI image generation
An MCP server that integrates with Discord to provide AI-powered features.
MCP server for NanoBanana AI image generation and editing
MCP server for Qwen Image 3 AI image generation
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for programmatically creating and editing Aseprite sprites, enabling AI agents to draw, manage layers and frames, and iterate until the desired result is achieved.MIT
- AlicenseBqualityCmaintenanceAn MCP server that lets AI agents create and edit Aseprite sprites headlessly, enabling pixel art, animation, and export via 98 tools.1008MIT
- AlicenseBqualityCmaintenanceAn MCP server that generates pixel-art PNGs from text prompts, using a free image backend, and saves them directly to your project directory.2MIT
- AlicenseAqualityDmaintenanceA pixel art animation MCP server for AI agents, enabling scene generation, sprite drawing, and PNG export with zero latency.1922 npm3MIT