Skip to main content
Glama

utilpeek: make a QR code image (SVG or PNG)

make_qr_code
Idempotent

utilpeek: make a QR code image. For 1-D barcodes use make_barcode; to read a code use read_qr_barcode. Returns svg (text) or data_base64 (PNG), or with output "url" a 24 h download link, plus version, modules, width_px, height_px and bytes. Data too long for a QR code at the chosen level is a 422 (not charged). Encoded locally, nothing is fetched; typically under 0.1 s. Price: USD 0.001. Free: 10 utilpeek calls per IP per UTC day. Docs: https://tanod.dev/learn/qr-code-api.html

Input Schema

NameRequiredDescriptionDefault
dataYesText or URL to encode (1-2000 characters, at most 2953 UTF-8 bytes).
errorNoError correction level (default M).M
scaleNoPixels per module (1-20, default 8).
borderNoQuiet zone in modules (0-10, default 4).
formatNosvg (text) or png (base64).svg
outputNobase64 (default): inline. url: stored for 24 hours; link, metadata.base64

Output Schema

NameRequiredDescriptionDefault
svgNo
bytesNo
errorNoOnly on an error result: an object {code, message}, or the reason string of an x402 PaymentRequired object.
scaleNo
borderNo
formatNo
modulesNo
versionNo
verifiedNo
width_pxNo
height_pxNo
data_base64No
verified_byNo
verify_noteNo
content_typeNo
decoded_textNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / output / description
      Previous value: -"base64 (default): the file comes back inline as base64. url: the file is stored for 24 hours and the reply carries a download link (url, expires_at, bytes, content_type, sha256) instead of the base64, which keeps the file out of your context window."New value: +"base64 (default): inline. url: stored for 24 hours; link, metadata."
  2. Changed4 schema fields changed
    • addedOutput schema / properties / decoded_text
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / verified
      Added value: +{
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / verified_by
      Added value: +{
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / verify_note
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / output
      Added value: +{
      +  "default": "base64",
      +  "description": "base64 (default): the file comes back inline as base64. url: the file is stored for 24 hours and the reply carries a download link (url, expires_at, bytes, content_type, sha256) instead of the base64, which keeps the file out of your context window.",
      +  "enum": [
      +    "base64",
      +    "url"
      +  ],
      +  "title": "Output",
      +  "type": "string"
      +}
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "border": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "bytes": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "content_type": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "data_base64": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "error": {
      +      "description": "Only on an error result: an object {code, message}, or the reason string of an x402 PaymentRequired object."
      +    },
      +    "format": {
      +      "enum": [
      +        "svg",
      +        "png",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "height_px": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "modules": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "scale": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "svg": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "version": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "width_px": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well past the annotations: local encoding with nothing fetched, sub-0.1 s latency, 422 on data too long and explicitly not charged, price USD 0.001, and 10 free calls per IP per UTC day. The 24 h expiry on url output is exactly the kind of side effect an agent needs before choosing that mode.

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?

Front-loaded with purpose and alternatives, then returns, failure mode, operational facts, and pricing. Dense and mostly earning its place, though the doc link and price/free-tier run together in a way that reads like a listing rather than prose.

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?

Even though an output schema exists, the description names the return keys so an agent can pick a format correctly, and covers failure, cost, latency, and persistence. Nothing needed to call this tool correctly is missing.

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 coverage is 100% with enums on error/format/output, so the baseline is 3; the description still earns credit by tying format/output to concrete return fields (`svg` text vs `data_base64`, `url` link) and by explaining that error level drives the 422 payload-limit failure. It does not add much on scale/border 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?

States a specific verb and resource ('make a QR code image') and immediately scopes the output formats (SVG or PNG). It also names the exact siblings it is not — make_barcode for 1-D codes and read_qr_barcode for decoding — so an agent can route without opening a schema.

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?

Explicit routing to alternatives with the condition that selects them ('For 1-D barcodes use make_barcode; to read a code use read_qr_barcode'), plus guidance on choosing between inline base64 and the 24 h url output. This is about as close to when-to-use/when-not-to as a generation tool gets.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources