OpenQR

Generate, edit and track dynamic (editable) QR codes with scan analytics. Hosted MCP and REST API.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
82%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,246Tokens (tool definitions)
~798 BTypical response size
Moderate attention impact (1.75% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "qr": {
      "command": "npx",
      "args": [
        "@open-qr/mcp"
      ]
    }
  }
}

Runnable packages

npm@open-qr/mcp1.0.2stdio

Remote endpoints

https://openqr.uk/mcpstreamable-http

What it can do

Tool inventory

Tools (20)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
βšͺgenerate_qr(data, format, size, theme)

Generate a static QR code from any text/URL. Returns a PNG image (or SVG markup). Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "data": {
      "type": "string",
      "description": "The content to encode (URL or text)."
    },
    "format": {
      "type": "string",
      "enum": [
        "png",
        "svg"
      ],
      "description": "Output format (default png)."
    },
    "size": {
      "type": "number",
      "description": "Pixel size, 96–2048 (default 512)."
    },
    "theme": {
      "type": "string",
      "description": "A saved theme id or name. Applies the theme's colours; full styling applies to dynamic codes."
    }
  },
  "required": [
    "data"
  ]
}
🟑create_dynamic_qr(destination, label, theme)

Create an editable (dynamic) QR code whose destination you can change later without reprinting. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "destination": {
      "type": "string",
      "description": "The http(s) URL the code should point to."
    },
    "label": {
      "type": "string",
      "description": "Optional label."
    },
    "theme": {
      "type": "string",
      "description": "A saved theme id or name to style the code with."
    }
  },
  "required": [
    "destination"
  ]
}
🟑create_static_qr(type, fields, label, theme)

Save a static QR code to your library from structured fields: wifi, contact (vCard), email, SMS, WhatsApp, location, text, phone or URL. Static codes bake the content into the code itself β€” no short link, no scan analytics, not editable later. Render the returned payload with generate_qr. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "url",
        "text",
        "email",
        "phone",
        "sms",
        "whatsapp",
        "wifi",
        "geo",
        "vcard"
      ],
      "description": "The payload type."
    },
    "fields": {
      "type": "object",
      "description": "Field names depend on type. url: url. text: text. email: email, subject?, body?. phone: phone. sms: phone, message?. whatsapp: phone (country code, digits only), message?. wifi: ssid, password?, encryption? (WPA|WEP|nopass), hidden? (boolean). geo: lat, lng. vcard: firstName?, lastName?, phone?, email?, org?, title?, url?, address? (a name/phone/email is required)."
    },
    "label": {
      "type": "string",
      "description": "Optional label for your dashboard."
    },
    "theme": {
      "type": "string",
      "description": "A saved theme id or name to style the code with."
    }
  },
  "required": [
    "type",
    "fields"
  ]
}
🟑update_dynamic_qr(id, destination, label, slug, tags, ...)

Edit a dynamic QR code: change its destination, label, custom short link (slug), tags or folder. Pass only the fields you want to change. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The dynamic code id."
    },
    "destination": {
      "type": "string",
      "description": "New http(s) URL."
    },
    "label": {
      "type": "string",
      "description": "New label."
    },
    "slug": {
      "type": "string",
      "description": "Custom short-link back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Replace the code's tags (max 10)."
    },
    "folder_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "Move into a folder id, or null to un-file."
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "paused"
      ],
      "description": "Pause the code (it stops resolving β€” scanners see an inactive page) or reactivate it. Free allows 1 active code; Pro 25."
    },
    "password": {
      "type": [
        "string",
        "null"
      ],
      "description": "Pro: require this password before the code redirects (min 4 characters). Pass null to remove all protection."
    },
    "pin": {
      "type": [
        "string",
        "null"
      ],
      "description": "Pro: require a 4-digit PIN before the code redirects. Exactly 4 digits. Pass null to remove all protection."
    },
    "lock_hint": {
      "type": [
        "string",
        "null"
      ],
      "description": "Optional hint shown on the unlock page, e.g. \"Ask at the bar\". Max 60 characters."
    },
    "pause_until": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 timestamp: schedule a pause until then (scanners see the inactive page; the code self-resumes at the deadline). Pass null to clear the schedule. Future timestamps only, active codes only."
    },
    "ios_destination": {
      "type": [
        "string",
        "null"
      ],
      "description": "App links: iOS scanners follow this http(s) URL instead of destination (e.g. the App Store page). Pass null to clear. Applies to the plain redirect only."
    },
    "android_destination": {
      "type": [
        "string",
        "null"
      ],
      "description": "App links: Android scanners follow this http(s) URL instead of destination (e.g. the Google Play page). Pass null to clear."
    },
    "theme": {
      "type": "string",
      "description": "A saved theme id or name to restyle the code with."
    }
  },
  "required": [
    "id"
  ]
}
🟒get_dynamic_qr(id)

Get the full details of one of your QR codes by id: destination, short link, label, type, tags, folder, status and created date. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The code id."
    }
  },
  "required": [
    "id"
  ]
}
🟒get_scans(id)

Get scan statistics for a dynamic QR code. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The dynamic code id."
    }
  },
  "required": [
    "id"
  ]
}
🟑create_link_alias(id, slug)

Create an extra short link (link alias) that resolves where one of your dynamic codes points: share a different slug per channel while the QR keeps its own slug, so QR scans and link clicks are counted separately. Free accounts have no alias allowance; Pro includes 10. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The dynamic code id the alias should point at."
    },
    "slug": {
      "type": "string",
      "description": "Optional custom back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens. Omit for a random one."
    }
  },
  "required": [
    "id"
  ]
}
🟒list_link_aliases(id)

List the link aliases of one dynamic code. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The dynamic code id."
    }
  },
  "required": [
    "id"
  ]
}
🟒list_dynamic_qr(limit)

List your dynamic (editable) QR codes β€” id, short URL, destination, label and status. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max codes to return, 1–500 (default 200)."
    }
  }
}
πŸ”΄delete_dynamic_qr(id)

Permanently delete a dynamic QR code. The short link stops working. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The dynamic code id."
    }
  },
  "required": [
    "id"
  ]
}
🟑bulk_create_dynamic_qr(codes, theme)

Create up to 200 dynamic QR codes at once. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "codes": {
      "type": "array",
      "description": "Codes to create.",
      "items": {
        "type": "object",
        "properties": {
          "destination": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "destination"
        ]
      }
    },
    "theme": {
      "type": "string",
      "description": "A saved theme id or name applied to every code created."
    }
  },
  "required": [
    "codes"
  ]
}
🟒list_folders

List your folders (id and name). Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟑create_folder(name)

Create a folder to organise codes. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "required": [
    "name"
  ]
}
πŸ”΄delete_folder(id)

Delete a folder (its codes are un-filed, not deleted). Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ]
}
🟒list_themes

List your saved style themes (id, name) β€” apply one by passing its id or name as `theme` to generate/create/update tools. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟑create_theme(name, style)

Save a reusable style theme. `style` is a QR style object (fgColor, bgColor, dotType, cornerSquareType, etc.). Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "style": {
      "type": "object",
      "description": "QR style JSON (colours, dot/corner shapes, logo, gradient, frame…)."
    }
  },
  "required": [
    "name",
    "style"
  ]
}
πŸ”΄delete_theme(id)

Delete a saved theme. Codes already styled with it keep their look. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ]
}
🟒get_subdomain

Show the branded subdomain on this account ({name}.oqr.to). Reports whether it is currently suspended β€” a suspended subdomain redirects to the plain short link instead of serving, which happens when a Pro plan lapses. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟑set_subdomain(subdomain)

Claim or change the branded subdomain so codes also resolve at {name}.oqr.to. Pro only. Codes keep working on the plain short link either way, so changing this never breaks anything already printed. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {
    "subdomain": {
      "type": "string",
      "description": "3–32 letters, numbers or hyphens, e.g. \"acme\"."
    }
  },
  "required": [
    "subdomain"
  ]
}
πŸ”΄clear_subdomain

Release the branded subdomain. Codes stay live on the plain short link; only the {name}.oqr.to form stops resolving. The name becomes claimable by someone else. Requires an OpenQR API key.

Input Schema

{
  "type": "object",
  "properties": {}
}

Recommended Prompts

retrieve_data
Get details about [item] from OpenQR
Expected tools: get_dynamic_qr
fetch_info
Fetch [information type] using OpenQR
Expected tools: get_dynamic_qr
list_items
List all [items] available in OpenQR
Expected tools: list_link_aliases
browse_collection
Show me the [collection] from OpenQR
Expected tools: list_link_aliases
explore_workflow
List available [items], then get details for each one using OpenQR
Expected tools: list_link_aliasesget_dynamic_qr

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools
verifiedversion not recorded20 tools