OpenQR
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Generate, edit and track dynamic (editable) QR codes with scan analytics. Hosted MCP and REST API.
| Author | uk.openqr |
|---|---|
| Access | mixed |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 4142 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"OpenQR": {
"url": "https://openqr.uk/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (23)
generate_qrGenerate a static QR code from any text/URL. Returns a PNG image (or SVG markup). Requires an OpenQR API key.
Parameters:
data(required) — string — The content to encode (URL or text).size— number — Pixel size, 96–2048 (default 512).theme— string — A saved theme id or name. Applies the theme's colours; full styling applies to dynamic codes.format— string — Output format (default png).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
generate_pix_codeBuild a static PIX (BR Code) payment payload for Brazil and optionally render it as a QR image. Returns the payload string by default (render it with generate_qr, or pass format). Static and untracked — nothing is saved to the library. Requires an OpenQR API key.
Parameters:
key(required) — string — PIX key: CPF, CNPJ, email, +55 phone or random (EVP) key.name(required) — string — Merchant name, ≤25 chars (diacritics stripped to ASCII).city(required) — string — Merchant city, ≤15 chars.size— number — Image size, 96–2048 (default 512).txid— string — Transaction id, 1-25 letters/digits. Defaults to ***.force— boolean — Build even when validation reports problems (they return as warnings) — e.g. a check-digit warning you have verified yourself.amount— string — Optional amount in BRL, e.g. 10.50.format— string — Return a rendered image instead of the payload string.singleUse— boolean — Emit point-of-initiation 11: the code works for one payment only. Default reusable.description— string — Optional description, ≤25 chars.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
generate_epc_codeBuild a static EPC/SEPA payment payload (EPC069-12, the GiroCode/BezahlCode European banks scan) and optionally render it as a QR image. Returns the payload string by default. Static and untracked — nothing is saved to the library. Requires an OpenQR API key.
Parameters:
name(required) — string — Beneficiary name, ≤70 chars.iban(required) — string — IBAN, with or without spaces (checksum-validated).bic— string — Optional BIC, 8 or 11 chars.size— number — Image size, 96–2048 (default 512).text— string — Unstructured remittance text, ≤140 chars. Mutually exclusive with reference.force— boolean — Build even when validation reports problems (they return as warnings).amount— string — Optional EUR amount, e.g. 12.34.format— string — Return a rendered image instead of the payload string.purpose— string — Optional 4-character purpose code.reference— string — ISO 11649 creditor reference, ≤35 chars. Mutually exclusive with text.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
generate_upi_codeBuild a static UPI (upi://pay) payment payload for India and optionally render it as a QR image. Returns the payload string by default. Static and untracked — nothing is saved to the library. Requires an OpenQR API key.
Parameters:
vpa(required) — string — Virtual payment address, e.g. name@bank.payeeName(required) — string — Payee name shown in the payer's app.note— string — Optional payment note (≤50 chars keeps every UPI app happy).size— number — Image size, 96–2048 (default 512).force— boolean — Build even when validation reports problems (they return as warnings).amount— string — Optional amount in INR, e.g. 25.50.format— string — Return a rendered image instead of the payload string.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
create_dynamic_qrCreate an editable (dynamic) QR code whose destination you can change later without reprinting. Requires an OpenQR API key.
Parameters:
destination(required) — string — The http(s) URL the code should point to.label— string — Optional label.theme— string — A saved theme id or name to style the code with.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
create_static_qrSave 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.
Parameters:
type(required) — string — The payload type.fields(required) — object — 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— string — Optional label for your dashboard.theme— string — A saved theme id or name to style the code with.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
update_dynamic_qrEdit 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.
Parameters:
id(required) — string — The dynamic code id.pin— ['string', 'null'] — Pro: require a 4-digit PIN before the code redirects. Exactly 4 digits. Pass null to remove all protection.slug— string — Custom short-link back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens.tags— array — Replace the code's tags (max 10).label— string — New label.theme— string — A saved theme id or name to restyle the code with.status— string — Pause the code (it stops resolving — scanners see an inactive page) or reactivate it. Free allows 1 active code; Pro 25.password— ['string', 'null'] — Pro: require this password before the code redirects (min 4 characters). Pass null to remove all protection.folder_id— ['string', 'null'] — Move into a folder id, or null to un-file.lock_hint— ['string', 'null'] — Optional hint shown on the unlock page, e.g. "Ask at the bar". Max 60 characters.destination— string — New http(s) URL.pause_until— ['string', 'null'] — 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— ['string', 'null'] — 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— ['string', 'null'] — App links: Android scanners follow this http(s) URL instead of destination (e.g. the Google Play page). Pass null to clear.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_dynamic_qrGet 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.
Parameters:
id(required) — string — The code id.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_scansGet scan statistics for a dynamic QR code. Requires an OpenQR API key.
Parameters:
id(required) — string — The dynamic code id.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
create_link_aliasCreate 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.
Parameters:
id(required) — string — The dynamic code id the alias should point at.slug— string — Optional custom back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens. Omit for a random one.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
list_link_aliasesList the link aliases of one dynamic code. Requires an OpenQR API key.
Parameters:
id(required) — string — The dynamic code id.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
list_dynamic_qrList your dynamic (editable) QR codes — id, short URL, destination, label and status. Requires an OpenQR API key.
Parameters:
limit— number — Max codes to return, 1–500 (default 200).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
delete_dynamic_qrPermanently delete a dynamic QR code. The short link stops working. Requires an OpenQR API key.
Parameters:
id(required) — string — The dynamic code id.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
bulk_create_dynamic_qrCreate up to 200 dynamic QR codes at once. Requires an OpenQR API key.
Parameters:
codes(required) — array — Codes to create.theme— string — A saved theme id or name applied to every code created.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
list_foldersList your folders (id and name). Requires an OpenQR API key.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
create_folderCreate a folder to organise codes. Requires an OpenQR API key.
Parameters:
name(required) — string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
delete_folderDelete a folder (its codes are un-filed, not deleted). Requires an OpenQR API key.
Parameters:
id(required) — string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
list_themesList 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
create_themeSave a reusable style theme. `style` is a QR style object (fgColor, bgColor, dotType, cornerSquareType, etc.). Requires an OpenQR API key.
Parameters:
name(required) — stringstyle(required) — object — QR style JSON (colours, dot/corner shapes, logo, gradient, frame…).
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
delete_themeDelete a saved theme. Codes already styled with it keep their look. Requires an OpenQR API key.
Parameters:
id(required) — string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_subdomainShow 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
set_subdomainClaim 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.
Parameters:
subdomain(required) — string — 3–32 letters, numbers or hyphens, e.g. "acme".
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
clear_subdomainRelease 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.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.