Skip to main content
Glama
NiimBlue Labels MCP

NiimBlue Labels MCP

Official

Render NiimBlue label

render_label
Idempotent

Design a NIIMBOT label and preview exactly what the printhead burns, returning a 1-bit PNG, layout warnings, and a link to open it in NiimBlue.

Instructions

Design a NIIMBOT label for NiimBlue and see exactly what the printhead burns. Returns the 1-bit PNG NiimBlue prints (threshold 140; each dot drawn zoom×zoom px), each object's rendered box, warnings that end with their fix, and a niim.blue #load= link that opens the label in NiimBlue for printing. Units are printer dots: 8 per mm at 203 dpi, 11.81 at 300 dpi; origin top-left; objects paint in array order and use NiimBlue/fabric property names. Floors at 203 dpi (×dpmm/8 at 300 dpi): text ≥16 px, or the font's min_px from list_fonts; weight ≥500 under 24 px; strokes ≥2 px; QR modules ≥3 px with 4 clear modules; Code 128 scaleFactor ≥2 with 10 clear modules; text and codes ≥1 mm from the edges. Colours: black, white, transparent. Fonts: Noto Sans Variable (Latin, Cyrillic) by default; any other fontFamily (list_fonts) travels by name only, so the user adds its file in NiimBlue (FONT_NOT_IN_LINK). Fix every warning and render again. Final call: include_json, for the .json export. The link replaces the label open in NiimBlue after a confirm: tell the user to save it first. {key} fields fill from rows (preview: row 1; more than 1 row travels as NiimBlue's CSV, one label per row). save_as writes the args and an importable .niimblue.json to the templates folder; template starts from saved args.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "render_label"
  }
}

Input Schema

NameRequiredDescriptionDefault
rowsNoValues for {key} fields, one object per label. The preview shows row 1. 1 row: the link carries the filled text. More: the link carries them as NiimBlue's CSV (it replaces the user's open CSV) and prints one label per row
splitNoSplit the label into parts (cable flags)
titleNoLabel name in NiimBlue's saved labels; travels only in the .json export (include_json, save_as), so after opening the link the user types it when saving
mirrorNoRepeat the design into the other split part, optionally rotated
objectsNoObjects in paint order: the first is the bottom layer
printerNoPrinter model, e.g. D110, B1, D11_H: sets dpi, print direction and printable width
save_asNoSave these args as a template under this name: writes <name>.args.json and an importable <name>.niimblue.json
tail_posNoSide of the cable-flag tail
templateNoSaved template name (list_templates): its args are the base, the args given here override them, objects and rows replace wholesale
width_mmNoLabel width as set in NiimBlue. B-series (top): runs across the head
height_mmNoLabel height as set in NiimBlue. D-series (left): the tape width across the head
overwriteNoReplace an existing save_as template (default false: refuse)
split_partsNoNumber of split parts
include_jsonNoAlso return the NiimBlue .json export; set it on the final call
tail_length_mmNoTail length in mm

Output Schema

NameRequiredDescriptionDefault
okYes
linkYesOpens the label in NiimBlue (after a confirm that replaces the open label)
toolYes
zoomYesEach printer dot is zoom×zoom PNG pixels
boxesYesRendered bounding boxes in dots, after auto-size
labelYes
savedNosave_as: the template files written
warningsYes
link_charsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.2.0
    • changedInput schema / properties / objects / items / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "angle": {
      -        "description": "Rotation in degrees around the origin",
      -        "maximum": 360,
      -        "minimum": -360,
      -        "type": "number"
      -      },
      -      "backgroundColor": {
      -        "description": "Box fill behind the text; black + white fill makes an inverse band",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "charSpacing": {
      -        "description": "Tracking in 1/1000 em",
      -        "maximum": 1000,
      -        "minimum": -200,
      -        "type": "number"
      -      },
      -      "fill": {
      -        "description": "Text colour (default black)",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "fontAutoSize": {
      -        "description": "Shrinks the font only when a field filled in at print time ({dt…} or a rows value) adds lines or widens the text; a long word never shrinks it",
      -        "type": "boolean"
      -      },
      -      "fontSize": {
      -        "description": "Font size in dots; ≥16 at 203 dpi",
      -        "maximum": 999,
      -        "minimum": 6,
      -        "type": "number"
      -      },
      -      "fontStyle": {
      -        "description": "italic is a synthetic oblique",
      -        "enum": [
      -          "normal",
      -          "italic"
      -        ],
      -        "type": "string"
      -      },
      -      "fontWeight": {
      -        "description": "Noto Sans Variable weight (default 600); ≥500 under 24 dots",
      -        "maximum": 900,
      -        "minimum": 100,
      -        "type": "integer"
      -      },
      -      "left": {
      -        "description": "x of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "lineHeight": {
      -        "description": "Line height in font sizes (default 1)",
      -        "maximum": 3,
      -        "minimum": 0.7,
      -        "type": "number"
      -      },
      -      "originX": {
      -        "description": "Which point left refers to (default left)",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "originY": {
      -        "description": "Which point top refers to (default top)",
      -        "enum": [
      -          "top",
      -          "center",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "scaleX": {
      -        "description": "Horizontal scale; 0.8–0.9 gives a condensed look",
      -        "maximum": 1.5,
      -        "minimum": 0.6,
      -        "type": "number"
      -      },
      -      "text": {
      -        "description": "Text; \\n breaks lines. {dt}, {dt|DD.MM.YYYY} or {dt+7d|DD.MM} print the date at print time; {key} fills from rows",
      -        "maxLength": 2000,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "textAlign": {
      -        "description": "Default center, as in the app",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right",
      -          "justify"
      -        ],
      -        "type": "string"
      -      },
      -      "top": {
      -        "description": "y of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "Textbox",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "Wrap width in dots (long words widen the box)",
      -        "maximum": 5000,
      -        "minimum": 1,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "left",
      -      "top",
      -      "text",
      -      "width",
      -      "fontSize"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "angle": {
      -        "description": "Rotation in degrees around the origin",
      -        "maximum": 360,
      -        "minimum": -360,
      -        "type": "number"
      -      },
      -      "fill": {
      -        "description": "Glyph colour (default black)",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "fontSize": {
      -        "description": "Glyph size in dots; ≥32 at 203 dpi",
      -        "maximum": 999,
      -        "minimum": 8,
      -        "type": "number"
      -      },
      -      "left": {
      -        "description": "x of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Material Icons name in snake_case, e.g. lan, kitchen, wine_bar",
      -        "maxLength": 60,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "originX": {
      -        "description": "Which point left refers to (default left)",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "originY": {
      -        "description": "Which point top refers to (default top)",
      -        "enum": [
      -          "top",
      -          "center",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "top": {
      -        "description": "y of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "Icon",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "left",
      -      "top",
      -      "name",
      -      "fontSize"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "angle": {
      -        "description": "Rotation in degrees around the origin",
      -        "maximum": 360,
      -        "minimum": -360,
      -        "type": "number"
      -      },
      -      "fill": {
      -        "description": "Fill (default transparent)",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "Height in dots",
      -        "maximum": 5000,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "left": {
      -        "description": "x of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "originX": {
      -        "description": "Which point left refers to (default left)",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "originY": {
      -        "description": "Which point top refers to (default top)",
      -        "enum": [
      -          "top",
      -          "center",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "rx": {
      -        "description": "Corner radius x",
      -        "maximum": 500,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "ry": {
      -        "description": "Corner radius y",
      -        "maximum": 500,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "stroke": {
      -        "description": "Outline (default black)",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "strokeWidth": {
      -        "description": "Stroke width in dots (default 3); ≥2 at 203 dpi",
      -        "maximum": 50,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "top": {
      -        "description": "y of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "Rect",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "Width in dots",
      -        "maximum": 5000,
      -        "minimum": 1,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "left",
      -      "top",
      -      "width",
      -      "height"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "angle": {
      -        "description": "Rotation in degrees around the origin",
      -        "maximum": 360,
      -        "minimum": -360,
      -        "type": "number"
      -      },
      -      "fill": {
      -        "description": "Fill (default transparent)",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "left": {
      -        "description": "x of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "originX": {
      -        "description": "Which point left refers to (default left)",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "originY": {
      -        "description": "Which point top refers to (default top)",
      -        "enum": [
      -          "top",
      -          "center",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "radius": {
      -        "description": "Radius in dots",
      -        "maximum": 2500,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "stroke": {
      -        "description": "Outline (default black)",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "strokeWidth": {
      -        "description": "Stroke width in dots (default 3); ≥2 at 203 dpi",
      -        "maximum": 50,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "top": {
      -        "description": "y of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "Circle",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "left",
      -      "top",
      -      "radius"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "angle": {
      -        "description": "Rotation in degrees around the origin",
      -        "maximum": 360,
      -        "minimum": -360,
      -        "type": "number"
      -      },
      -      "fill": {
      -        "description": "Fills the shape the points enclose, closed implicitly (default transparent): chevrons, arrows, marks; add stroke transparent for a clean edge",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "left": {
      -        "description": "Omit: points are absolute",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "originX": {
      -        "description": "Which point left refers to (default left)",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "originY": {
      -        "description": "Which point top refers to (default top)",
      -        "enum": [
      -          "top",
      -          "center",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "points": {
      -        "description": "Absolute canvas points in dots",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "x": {
      -              "maximum": 5000,
      -              "minimum": -1000,
      -              "type": "number"
      -            },
      -            "y": {
      -              "maximum": 5000,
      -              "minimum": -1000,
      -              "type": "number"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 64,
      -        "minItems": 2,
      -        "type": "array"
      -      },
      -      "stroke": {
      -        "description": "Line colour (default black)",
      -        "enum": [
      -          "black",
      -          "white",
      -          "transparent"
      -        ],
      -        "type": "string"
      -      },
      -      "strokeWidth": {
      -        "description": "Line width in dots (default 3); ≥2 at 203 dpi",
      -        "maximum": 50,
      -        "minimum": 1,
      -        "type": "number"
      -      },
      -      "top": {
      -        "description": "Omit: points are absolute",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "Polyline",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "points"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "angle": {
      -        "description": "Rotation in degrees around the origin",
      -        "maximum": 360,
      -        "minimum": -360,
      -        "type": "number"
      -      },
      -      "ecl": {
      -        "description": "Error correction (default M); L fits more on small labels",
      -        "enum": [
      -          "L",
      -          "M",
      -          "Q",
      -          "H"
      -        ],
      -        "type": "string"
      -      },
      -      "left": {
      -        "description": "x of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "originX": {
      -        "description": "Which point left refers to (default left)",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "originY": {
      -        "description": "Which point top refers to (default top)",
      -        "enum": [
      -          "top",
      -          "center",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Encoded text or URL",
      -        "maxLength": 1200,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "top": {
      -        "description": "y of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "QRCode",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "Side of the square in dots; modules must be ≥3 dots",
      -        "maximum": 2000,
      -        "minimum": 42,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "left",
      -      "top",
      -      "text",
      -      "width"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "angle": {
      -        "description": "Rotation in degrees around the origin",
      -        "maximum": 360,
      -        "minimum": -360,
      -        "type": "number"
      -      },
      -      "encoding": {
      -        "description": "Symbology",
      -        "enum": [
      -          "CODE128B",
      -          "EAN13"
      -        ],
      -        "type": "string"
      -      },
      -      "fontSize": {
      -        "description": "Size of the printed text (default 12)",
      -        "maximum": 60,
      -        "minimum": 6,
      -        "type": "number"
      -      },
      -      "height": {
      -        "description": "Height in dots, including the printed text",
      -        "maximum": 2000,
      -        "minimum": 10,
      -        "type": "number"
      -      },
      -      "left": {
      -        "description": "x of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "originX": {
      -        "description": "Which point left refers to (default left)",
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "originY": {
      -        "description": "Which point top refers to (default top)",
      -        "enum": [
      -          "top",
      -          "center",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "printText": {
      -        "description": "Print the text under the bars (default true)",
      -        "type": "boolean"
      -      },
      -      "scaleFactor": {
      -        "description": "Dots per module (default 2); width follows from it",
      -        "maximum": 10,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "text": {
      -        "description": "CODE128B: printable ASCII, never $ or ). EAN13: 12–13 digits",
      -        "maxLength": 229,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "top": {
      -        "description": "y of the origin point, in dots",
      -        "maximum": 5000,
      -        "minimum": -1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "Barcode",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "left",
      -      "top",
      -      "text",
      -      "encoding",
      -      "height"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle": {
      +        "description": "Rotation in degrees around the origin",
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "number"
      +      },
      +      "backgroundColor": {
      +        "description": "Box fill behind the text; black + white fill makes an inverse band",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "charSpacing": {
      +        "description": "Tracking in 1/1000 em",
      +        "maximum": 1000,
      +        "minimum": -200,
      +        "type": "number"
      +      },
      +      "fill": {
      +        "description": "Text colour (default black)",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "fontAutoSize": {
      +        "description": "Shrinks the font only when a field filled in at print time ({dt…} or a rows value) adds lines or widens the text; a long word never shrinks it",
      +        "type": "boolean"
      +      },
      +      "fontFamily": {
      +        "description": "Font family (default Noto Sans Variable): a list_fonts family. Any other font travels by name only, so the user adds its file in NiimBlue (FONT_NOT_IN_LINK)",
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "pattern": "^-?[\\p{L}_][\\p{L}\\p{N}_-]*(?: -?[\\p{L}_][\\p{L}\\p{N}_-]*)*$",
      +        "type": "string"
      +      },
      +      "fontSize": {
      +        "description": "Font size in dots; ≥16 at 203 dpi",
      +        "maximum": 999,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "fontStyle": {
      +        "description": "italic is a synthetic oblique",
      +        "enum": [
      +          "normal",
      +          "italic"
      +        ],
      +        "type": "string"
      +      },
      +      "fontWeight": {
      +        "description": "Noto Sans Variable weight (default 600); ≥500 under 24 dots. Other fonts are one weight each: leave it unset (400), as ≥600 fakes bold on a regular file",
      +        "maximum": 900,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "left": {
      +        "description": "x of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "lineHeight": {
      +        "description": "Line height in font sizes (default 1)",
      +        "maximum": 3,
      +        "minimum": 0.7,
      +        "type": "number"
      +      },
      +      "originX": {
      +        "description": "Which point left refers to (default left)",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "originY": {
      +        "description": "Which point top refers to (default top)",
      +        "enum": [
      +          "top",
      +          "center",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "scaleX": {
      +        "description": "Horizontal scale; 0.8–0.9 gives a condensed look",
      +        "maximum": 1.5,
      +        "minimum": 0.6,
      +        "type": "number"
      +      },
      +      "text": {
      +        "description": "Text; \\n breaks lines. {dt}, {dt|DD.MM.YYYY} or {dt+7d|DD.MM} print the date at print time; {key} fills from rows",
      +        "maxLength": 2000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "textAlign": {
      +        "description": "Default center, as in the app",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right",
      +          "justify"
      +        ],
      +        "type": "string"
      +      },
      +      "top": {
      +        "description": "y of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "Textbox",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "Wrap width in dots (long words widen the box)",
      +        "maximum": 5000,
      +        "minimum": 1,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "left",
      +      "top",
      +      "text",
      +      "width",
      +      "fontSize"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle": {
      +        "description": "Rotation in degrees around the origin",
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "number"
      +      },
      +      "fill": {
      +        "description": "Glyph colour (default black)",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "fontSize": {
      +        "description": "Glyph size in dots; ≥32 at 203 dpi",
      +        "maximum": 999,
      +        "minimum": 8,
      +        "type": "number"
      +      },
      +      "left": {
      +        "description": "x of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Material Icons name in snake_case, e.g. lan, kitchen, wine_bar",
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "originX": {
      +        "description": "Which point left refers to (default left)",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "originY": {
      +        "description": "Which point top refers to (default top)",
      +        "enum": [
      +          "top",
      +          "center",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "top": {
      +        "description": "y of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "Icon",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "left",
      +      "top",
      +      "name",
      +      "fontSize"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle": {
      +        "description": "Rotation in degrees around the origin",
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "number"
      +      },
      +      "fill": {
      +        "description": "Fill (default transparent)",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "Height in dots",
      +        "maximum": 5000,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "left": {
      +        "description": "x of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "originX": {
      +        "description": "Which point left refers to (default left)",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "originY": {
      +        "description": "Which point top refers to (default top)",
      +        "enum": [
      +          "top",
      +          "center",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "rx": {
      +        "description": "Corner radius x",
      +        "maximum": 500,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "ry": {
      +        "description": "Corner radius y",
      +        "maximum": 500,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "stroke": {
      +        "description": "Outline (default black)",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "strokeWidth": {
      +        "description": "Stroke width in dots (default 3); ≥2 at 203 dpi",
      +        "maximum": 50,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "top": {
      +        "description": "y of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "Rect",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "Width in dots",
      +        "maximum": 5000,
      +        "minimum": 1,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "left",
      +      "top",
      +      "width",
      +      "height"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle": {
      +        "description": "Rotation in degrees around the origin",
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "number"
      +      },
      +      "fill": {
      +        "description": "Fill (default transparent)",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "left": {
      +        "description": "x of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "originX": {
      +        "description": "Which point left refers to (default left)",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "originY": {
      +        "description": "Which point top refers to (default top)",
      +        "enum": [
      +          "top",
      +          "center",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "radius": {
      +        "description": "Radius in dots",
      +        "maximum": 2500,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "stroke": {
      +        "description": "Outline (default black)",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "strokeWidth": {
      +        "description": "Stroke width in dots (default 3); ≥2 at 203 dpi",
      +        "maximum": 50,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "top": {
      +        "description": "y of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "Circle",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "left",
      +      "top",
      +      "radius"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle": {
      +        "description": "Rotation in degrees around the origin",
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "number"
      +      },
      +      "fill": {
      +        "description": "Fills the shape the points enclose, closed implicitly (default transparent): chevrons, arrows, marks; add stroke transparent for a clean edge",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "left": {
      +        "description": "Omit: points are absolute",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "originX": {
      +        "description": "Which point left refers to (default left)",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "originY": {
      +        "description": "Which point top refers to (default top)",
      +        "enum": [
      +          "top",
      +          "center",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "points": {
      +        "description": "Absolute canvas points in dots",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "x": {
      +              "maximum": 5000,
      +              "minimum": -1000,
      +              "type": "number"
      +            },
      +            "y": {
      +              "maximum": 5000,
      +              "minimum": -1000,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 64,
      +        "minItems": 2,
      +        "type": "array"
      +      },
      +      "stroke": {
      +        "description": "Line colour (default black)",
      +        "enum": [
      +          "black",
      +          "white",
      +          "transparent"
      +        ],
      +        "type": "string"
      +      },
      +      "strokeWidth": {
      +        "description": "Line width in dots (default 3); ≥2 at 203 dpi",
      +        "maximum": 50,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "top": {
      +        "description": "Omit: points are absolute",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "Polyline",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "points"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle": {
      +        "description": "Rotation in degrees around the origin",
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "number"
      +      },
      +      "ecl": {
      +        "description": "Error correction (default M); L fits more on small labels",
      +        "enum": [
      +          "L",
      +          "M",
      +          "Q",
      +          "H"
      +        ],
      +        "type": "string"
      +      },
      +      "left": {
      +        "description": "x of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "originX": {
      +        "description": "Which point left refers to (default left)",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "originY": {
      +        "description": "Which point top refers to (default top)",
      +        "enum": [
      +          "top",
      +          "center",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Encoded text or URL",
      +        "maxLength": 1200,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "top": {
      +        "description": "y of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "QRCode",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "Side of the square in dots; modules must be ≥3 dots",
      +        "maximum": 2000,
      +        "minimum": 42,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "left",
      +      "top",
      +      "text",
      +      "width"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "angle": {
      +        "description": "Rotation in degrees around the origin",
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "number"
      +      },
      +      "encoding": {
      +        "description": "Symbology",
      +        "enum": [
      +          "CODE128B",
      +          "EAN13"
      +        ],
      +        "type": "string"
      +      },
      +      "fontFamily": {
      +        "description": "Font family (default Noto Sans Variable): a list_fonts family. Any other font travels by name only, so the user adds its file in NiimBlue (FONT_NOT_IN_LINK)",
      +        "maxLength": 60,
      +        "minLength": 1,
      +        "pattern": "^-?[\\p{L}_][\\p{L}\\p{N}_-]*(?: -?[\\p{L}_][\\p{L}\\p{N}_-]*)*$",
      +        "type": "string"
      +      },
      +      "fontSize": {
      +        "description": "Size of the printed text (default 12)",
      +        "maximum": 60,
      +        "minimum": 6,
      +        "type": "number"
      +      },
      +      "height": {
      +        "description": "Height in dots, including the printed text",
      +        "maximum": 2000,
      +        "minimum": 10,
      +        "type": "number"
      +      },
      +      "left": {
      +        "description": "x of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "originX": {
      +        "description": "Which point left refers to (default left)",
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "originY": {
      +        "description": "Which point top refers to (default top)",
      +        "enum": [
      +          "top",
      +          "center",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "printText": {
      +        "description": "Print the text under the bars (default true)",
      +        "type": "boolean"
      +      },
      +      "scaleFactor": {
      +        "description": "Dots per module (default 2); width follows from it",
      +        "maximum": 10,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "text": {
      +        "description": "CODE128B: printable ASCII, never $ or ). EAN13: 12–13 digits",
      +        "maxLength": 229,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "top": {
      +        "description": "y of the origin point, in dots",
      +        "maximum": 5000,
      +        "minimum": -1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "Barcode",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "left",
      +      "top",
      +      "text",
      +      "encoding",
      +      "height"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. First observedv1.1.0

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description discloses substantial runtime behavior: threshold 140 and zoom-scaled dots, returned warning text ending in fixes, a link that replaces the currently open label, and save_as writing args and an importable .niimblue.json. It also explains template inheritance and the FONT_NOT_IN_LINK limitation, all of which matter for correct use.

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?

The description is front-loaded with the core purpose and outputs, and nearly every sentence carries useful constraints or side-effect information. It is dense and uses many semicolon-separated clauses, but that density is mostly justified by the tool's complexity.

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

Completeness5/5

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

Given 15 parameters, an output schema, and multiple behavioral side effects, the description is complete enough to call the tool correctly: it covers units, DPI floors, paint order, font handling, rows, templates, warnings, and the final-call include_json behavior. The output schema exists, yet the description still adds useful context about the returned PNG, boxes, warnings, and link.

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 100%, so the schema already documents parameters thoroughly. The description still adds operational meaning: units are printer dots with DPI conversions, the origin is top-left, objects paint in array order, and rows preview row 1 while more rows travel as CSV. These are meaningful additions beyond the schema.

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 and resource: design a NIIMBOT label for NiimBlue and see the exact 1-bit PNG the printhead burns. It also identifies the outputs (PNG, rendered boxes, warnings, niim.blue link) and distinguishes the tool from support siblings like list_fonts and list_templates by naming them where relevant.

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

Usage Guidelines4/5

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

It gives clear workflow guidance: fix every warning and render again, and set include_json on the final call. It also warns that the link replaces the label open in NiimBlue after a confirm, so the user should save first. It does not explicitly contrast this tool with get_template or list_templates, but the usage context is clear.

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

Deploy Server

Other Tools