Skip to main content
Glama

draw_text

Draws text onto Aseprite layers using built-in or system fonts, with live and batch modes for sprite editing.

Instructions

Draws text onto a layer. In live mode it uses Aseprite's text renderer with any font Aseprite knows (its built-in 'Aseprite' pixel font, or an installed system font by name such as 'Arial'). In batch mode, or with font='builtin', it uses a built-in 5x7 pixel font that can be scaled by whole numbers. Multi-line text with \n is supported.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
fontNo'builtin', 'Aseprite', or a system font name (live mode)
saveNoBatch mode: write changes back to the sprite file (default true)
sizeNoFont size for Aseprite/system fonts (default 6)
textYes
alignNoHorizontal alignment relative to x
colorNoDefault black
frameNo1-based frame number. Defaults to the active frame (or 1).
layerNoLayer name, 'Group/Child' path, or 1-based index from get_sprite_info. Defaults to the active layer.
scaleNoInteger scale for the builtin font
spriteNoFile path, open tab title, or sprite id. Defaults to the active sprite (live). Batch mode needs a file path.
backendNoauto (default): live Aseprite if connected, else headless batch
opacityNo
lineHeightNoOther fonts: pixels from one line to the next
lineSpacingNoBuiltin font: pixels between lines (default 1)
measureOnlyNoOnly return the text size, draw nothing
letterSpacingNoBuiltin font: pixels between letters (default 1)

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.1

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish only that this is a non-read-only, non-destructive mutate, so the description is free to add the more interesting behavioral detail: that rendering differs fundamentally between live and headless batch mode, and that font availability depends on the backend. It does not spell out persistence semantics (only the save param description hints at that) or error behavior, which keeps it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the purpose before mode-specific detail, with no filler or repetition of the tool name. The middle sentence is dense but each clause carries distinct information about renderer selection. Slightly compressed prose keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter mutation tool with no output schema, the description covers the single most consequential complexity: the live/batch split and its effect on fonts, scaling, and persistence. The remaining parameters (align, opacity, letterspacing, measureOnly) are adequately covered by schema descriptions. It could say more about what happens to the target layer/cel, but the essentials are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 78%, so the baseline is already a 3, and the description earns above that by clarifying what font accepts ('builtin', Aseprite's pixel font, or a named system font) and that its effect is mode-dependent. It also documents multi-line support via \n, a behavior absent from the schema. It doesn't touch the remaining ~22% of undocumented parameters, so it is not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opening sentence gives a specific verb+resource ("Draws text onto a layer"), which cleanly separates it from draw_shapes and draw_pixels. It then explains the two rendering paths, adding precision about what "draw text" actually means here. It stops short of naming the sibling tools it competes with, so it lands at 4 rather than 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains which mode triggers which font renderer (live vs batch, or font='builtin'), which implicitly tells the agent when each behavior applies. However, it gives no explicit guidance on when to prefer draw_text over draw_pixels/draw_image, nor any prerequisites such as needing a connected Aseprite for live mode. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.