Skip to main content
Glama
with-pebbly

aseprite-ai-artist

by with-pebbly

Transform

transform

Transform pixels on a single cel by translating, flipping, rotating, scaling, outlining, or cropping to content. Supports only clean 90° rotations and integer scaling to preserve pixel art.

Instructions

Move, flip, rotate or scale pixels on ONE cel — the target layer's image on the target frame. Ops: 'translate', 'flip', 'rotate', 'scale', 'outline', 'crop_to_content'. To transform part of a cel, crop the region out with draw op 'blit' first; there is no selection-scoped transform. Rotation is only clean at 90° multiples — arbitrary angles destroy pixel art, so anything else needs allowLossy. Scaling is nearest-neighbour and integer-only for the same reason.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dxNo
dyNo
opYes
axisNoFor 'flip'.
angleNoDegrees, clockwise. For 'rotate'.
colorNoOutline colour, for 'outline'.
frameNo1-based frame number. Omit to use the active frame.
layerNoLayer name. Omit to use the active layer.
factorNoFor 'scale'.
spriteNoWhich sprite: its id as '#7' (what every result reports back, and the only unambiguous form — two unsaved documents are both called 'Sprite'), its filename, or its display name. Omit to use the sprite Aseprite has focused.
thicknessNo
allowLossyNoPermit a non-90° rotation or non-integer scale. Ask the user first.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
opYes
boundsNo
spriteYes
pixelsChangedYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.1.6
    • removedInput schema / properties / scope
      Removed value: -{
      -  "default": "selection",
      -  "description": "What the transform applies to. 'selection' falls back to the cel when nothing is selected.",
      -  "enum": [
      -    "selection",
      -    "cel",
      -    "layer",
      -    "sprite"
      -  ],
      -  "type": "string"
      -}
    • changedInput schema / properties / sprite / description
      Previous value: -"Sprite filename or id. Omit to use the sprite Aseprite has focused."New value: +"Which sprite: its id as '#7' (what every result reports back, and the only unambiguous form — two unsaved documents are both called 'Sprite'), its filename, or its display name. Omit to use the sprite Aseprite has focused."
    • removedOutput schema / properties / scope
      Removed value: -{
      -  "type": "string"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "sprite",
      -  "op",
      -  "scope",
      -  "pixelsChanged"
      -]New value: +[
      +  "sprite",
      +  "op",
      +  "pixelsChanged"
      +]
  2. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, destructiveHint=false — they carry no safety or behavioral detail. The description carries the full burden and discloses rich traits: arbitrary-angle rotation destroys pixel art (requires allowLossy), scaling is nearest-neighbour and integer-only, and there is no selection-scoped transform. These go well beyond what annotations provide and are accurate to the mutation semantics. No contradiction with annotations.

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

Conciseness5/5

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

A single dense paragraph that front-loads the core purpose and ops, then packs the lossiness constraints, the selection limitation, and the alternative tool into compact, high-information sentences. Every sentence earns its place with zero filler.

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?

Complex 12-parameter mutation tool with an output schema present, so return values need no explanation. The description covers ops, selection scoping, lossy behavior, and the draw/blit alternative. Minor gap: it doesn't spell out required companion params per op (e.g., axis for flip, factor for scale), which is left to the schema — acceptable but not exhaustive.

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

Parameters3/5

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

Schema coverage is ~67%, so the schema already documents op, axis, angle, color, frame, layer, factor, sprite, and allowLossy individually. The description adds behavioral meaning tied to parameters (rotation lossiness → angle/allowLossy, integer scaling → factor) but does not enumerate parameters directly. It adds some value without fully compensating for the undocumented dx/dy/thickness.

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

Purpose5/5

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

The description states a specific verb+resource ('Move, flip, rotate or scale pixels on ONE cel') and enumerates the six ops. It clearly delimits scope to a single cel (target layer's image on the target frame), which distinguishes it from sibling tools like draw, read_pixels, and cel.

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

Usage Guidelines5/5

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

Explicitly names the alternative and the condition that selects it: 'To transform part of a cel, crop the region out with draw op 'blit' first; there is no selection-scoped transform.' This is direct routing to a sibling tool under a stated condition, which fully satisfies the when/when-not guidance.

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