Skip to main content
Glama

create_pdf_qr

Create a dynamic QR code and short link for a PDF (menus, flyers, tickets). Host the PDF by passing pdf_url (a link Hovercode fetches) or pdf_base64 (the file's base64 bytes). Returns a shareable short link plus a rendered QR. Because it's dynamic you can later swap the PDF without reprinting the code — always dynamic, no static option here. Counts toward the same workspace dynamic-code limit as create_qr_code (list_workspaces' dynamic_qr_limit); past that limit this call returns an error.

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": "create_pdf_qr"
  }
}

Input Schema

NameRequiredDescriptionDefault
tagsNoLabels to attach (created if new) so you can find these later — list_qr_codes and list_short_links search by tag.
domainNoCustom short-link domain (list_workspaces shows the plan).
pdf_urlNoURL of a PDF to fetch and host. Use this or pdf_base64.
filenameNoName for the stored file, e.g. 'menu.pdf'.
workspaceNoWorkspace id. Optional when the account has one workspace; use list_workspaces to resolve otherwise.
pdf_base64NoBase64-encoded PDF bytes (data-URI prefix allowed), max 20 MB. Or use pdf_url.
display_nameNoInternal name to find this code later.

Output Schema

NameRequiredDescriptionDefault
idNo
pngNoPNG URL once rendered; null until then (use download_qr).
svgNoRendered QR as SVG markup.
logoNo
tagsNo
textNo
errorNoPresent only when the tool failed (isError): cause, retryable, message.
frameNo
vcardNo
folderNo
createdNo
dynamicNo
patternNo
qr_dataNoEncoded data: the destination URL for URL codes.
qr_typeNoLink, Text, vCard, or PDF.
svg_fileNo
eye_colorNo
eye_styleNo
has_borderNo
frame_colorNo
total_scansNo
display_nameNo
gps_trackingNo
pdf_file_urlNo
unique_scansNo
primary_colorNo
shortlink_urlNoTracked short URL a dynamic code points at; null for static codes.
text_secondaryNo
background_colorNo
error_correctionNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • removedOutput schema / properties / error / additionalProperties
      Removed value: -true
    • changedOutput schema / properties / error / description
      Previous value: -"Present only when the tool failed (the result is also flagged isError)."New value: +"Present only when the tool failed (isError): cause, retryable, message."
    • removedOutput schema / properties / error / properties
      Removed value: -{
      -  "cause": {
      -    "description": "Machine-readable failure category: invalid_argument, not_found, forbidden, plan_limit, rate_limited, or server_error.",
      -    "type": "string"
      -  },
      -  "message": {
      -    "type": "string"
      -  },
      -  "retryable": {
      -    "description": "Whether repeating the same call could succeed.",
      -    "type": "boolean"
      -  }
      -}
    • removedOutput schema / properties / folder / anyOf
      Removed value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "The folder a code sits in (null when unfiled).",
      -    "properties": {
      -      "id": {
      -        "type": "string"
      -      },
      -      "name": {
      -        "type": "string"
      -      },
      -      "path": {
      -        "type": "string"
      -      },
      -      "slug": {
      -        "type": "string"
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / folder / type
      Added value: +[
      +  "object",
      +  "null"
      +]
    • removedOutput schema / properties / tags / items
      Removed value: -{
      -  "additionalProperties": true,
      -  "properties": {
      -    "id": {
      -      "type": "string"
      -    },
      -    "slug": {
      -      "type": "string"
      -    },
      -    "title": {
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
    • removedOutput schema / properties / vcard / anyOf
      Removed value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "Contact details encoded in a vCard code.",
      -    "properties": {
      -      "city": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "company_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "country": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "description": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "email": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "first_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "last_name": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "mobile_number": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "phone_number": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "position": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "post_code": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "state": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "street": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "website": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / vcard / type
      Added value: +[
      +  "object",
      +  "null"
      +]
  2. Changed2 schema fields changed
    • addedOutput schema / properties / eye_color
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / frame_color
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "background_color": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "created": {
      +      "type": "string"
      +    },
      +    "display_name": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "dynamic": {
      +      "type": "boolean"
      +    },
      +    "error": {
      +      "additionalProperties": true,
      +      "description": "Present only when the tool failed (the result is also flagged isError).",
      +      "properties": {
      +        "cause": {
      +          "description": "Machine-readable failure category: invalid_argument, not_found, forbidden, plan_limit, rate_limited, or server_error.",
      +          "type": "string"
      +        },
      +        "message": {
      +          "type": "string"
      +        },
      +        "retryable": {
      +          "description": "Whether repeating the same call could succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "error_correction": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "eye_style": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "folder": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": true,
      +          "description": "The folder a code sits in (null when unfiled).",
      +          "properties": {
      +            "id": {
      +              "type": "string"
      +            },
      +            "name": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "slug": {
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "frame": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "gps_tracking": {
      +      "type": "boolean"
      +    },
      +    "has_border": {
      +      "type": "boolean"
      +    },
      +    "id": {
      +      "type": "string"
      +    },
      +    "logo": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "pattern": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "pdf_file_url": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "png": {
      +      "description": "PNG URL once rendered; null until then (use download_qr).",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "primary_color": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "qr_data": {
      +      "description": "Encoded data: the destination URL for URL codes.",
      +      "type": "string"
      +    },
      +    "qr_type": {
      +      "description": "Link, Text, vCard, or PDF.",
      +      "type": "string"
      +    },
      +    "shortlink_url": {
      +      "description": "Tracked short URL a dynamic code points at; null for static codes.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "svg": {
      +      "description": "Rendered QR as SVG markup.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "svg_file": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "tags": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "id": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "text": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "text_secondary": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "total_scans": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "unique_scans": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "vcard": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": true,
      +          "description": "Contact details encoded in a vCard code.",
      +          "properties": {
      +            "city": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "company_name": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "country": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "description": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "email": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "first_name": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "last_name": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "mobile_number": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "phone_number": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "position": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "post_code": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "state": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "street": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "website": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses dynamic-only semantics (the destination PDF can be swapped later without reprinting), quota coupling with create_qr_code via list_workspaces' dynamic_qr_limit, and explicit error behavior when the limit is exceeded. That is meaningful operational context an agent cannot get from the readOnlyHint/openWorldHint fields alone.

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?

Four sentences, front-loaded with the purpose, then hosting mechanics, then the dynamic benefit, then the quota caveat. Each sentence carries distinct information with no padding.

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?

Output schema exists, so return values need not be explained (though they are briefly), and the description covers the remaining gaps an agent would care about: hosting method choice, dynamism, quota limits, and error conditions. Nothing essential is missing for a 7-parameter create tool.

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 description coverage is 100%, so every parameter is already documented, and the description's pdf_url/pdf_base64 explanation largely restates the schema's 'Use this or pdf_base64' wording. It adds little beyond the structured fields, so the baseline 3 applies.

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 — create a dynamic QR code plus short link for a PDF — and names the document types (menus, flyers, tickets). It explicitly separates itself from create_qr_code/create_short_link by noting it is always dynamic with no static option.

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 usage context: use this when the asset is a PDF, and choose between pdf_url (Hovercode fetches it) or pdf_base64. It also warns that the call counts against the same workspace dynamic-code limit as create_qr_code, but it never states the inverse case (use create_qr_code/create_short_link for non-PDF targets).

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.