_ registry / mcp + a2a streamable-http · checked 29m ago

qart-uk

https://qart.uk

Registry code: 765b149110ecb7b6

api record

qart.uk makes QR codes where the artwork IS the code — every image is decoded by a real QR detector before it is offered, so what you get is artwork that already scanned. Three ways to get one: a free pool of finished codes anyone with an account can claim and point at their URL, a paid Studio that generates custom ones from prepaid credits, and a single finished QR bought outright over x402 with no account at all (buy_qr_outright).

THE ONE THING TO GET RIGHT WHEN CHOOSING A RAIL: whether the finished code can be RE-POINTED after it is printed. That is a property of the payload, not of the…

endpoint
https://qart.uk/api/mcp
door code
d52e6417665e70e9
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is qart-uk live?
Yes — it answered the hub's last check (checked 29m ago). It answered 99% of checks over the last 30 days.
Is qart-uk free to use?
Yes — the hub reached it with no key and no payment.
What tools does qart-uk have?
8 tools: preview_qr_encoding, explain_qart, resolve_qart_code, buy_qr_outright, get_credit_packs, get_qr_matrix, browse_free_pool, get_dither_qr_parameters.
Is qart-uk safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
99.1%

90 days 99.1%· all time 98.8%

latency
426ms

last good check

priced tools
0

of 8 tools

_ answered our checks, 90 days 1007 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
_ what it is for
used for
  • browse free artistic qr codes
  • buy a finished qr artwork
  • preview how a payload encodes as a qr code
  • resolve a qr code to its target url
takes → gives
text → images, data
tools
7 reads1 moves money
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 8 tools
2 open 6 never probed 2 of 8 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • browse_free_pool reads open 29m ago

    List the QR artwork currently claimable for free on qart.uk, one per style, with a preview image URL for each. This is the ANONYMOUS shelf — the same selection every signed-out visitor sees, and these codes are what a guest can claim. Use it to show someone what is available or to describe the styles on offer. If you are acting for a signed-in account and want codes THAT account can actually claim, use browse_my_pool instead — the two storefronts differ, and a code from here may 403 on a claim.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_dither_qr_parameters reads open 29m ago

    The complete parameter contract for qart.uk's dithered photo QR recipe — an error-diffused technique (after andrew-t) that dithers a photograph into the space around each QR module, so the finished 1-bit image reads as a picture and still scans. THIS TOOL GENERATES NOTHING. There is no API for the technique and no endpoint that will run it for you: it is a browser-side generator, and this tool returns the parameters, ranges, defaults and algorithm order so that YOU can implement it or instruct someone who will. Pair it with get_qr_matrix, which supplies the module grid and the function-pattern map the algorithm needs. It also returns the honest limits, which matter before anyone prints anything: no scan verdict is computed anywhere in this path, error correction wants to stay at H, and stricter detectors (zbar) reject output that phone-grade detectors accept. Treat a dithered code as untested until someone scans the actual printed sheet.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • preview_qr_encoding reads unknown never probed

    Work out how a payload will encode as a QR code, without creating anything. Returns the exact string the pixels would carry, its byte length, the QR version and module count required, the capacity remaining at that version, and any warnings. Costs nothing and mints nothing. Use this to answer questions like "will this URL fit at error correction level H" or "how much does a long Wi-Fi password cost me in QR density". Higher ECC survives damage better but needs more modules for the same data; more modules print smaller and get harder to scan. payloadKind 'qart_code' sizes the RETARGETABLE variant instead: the pixels carry a 16-byte qart.uk/_ link rather than your data, which is usually several versions smaller. Compare the two before committing to a print. This returns metadata only, never the module grid. For the actual black/white matrix, call get_qr_matrix.

    mcp-tool

    {
      "type": "object",
      "required": [
        "payloadKind"
      ],
      "properties": {
        "ecc": {
          "enum": [
            "L",
            "M",
            "Q",
            "H"
          ],
          "type": "string",
          "description": "Error correction level, lowest to highest. Defaults to the Studio default if omitted."
        },
        "end": {
          "type": "string",
          "description": "For 'event': end datetime."
        },
        "url": {
          "type": "string",
          "description": "For payloadKind 'url': the destination."
        },
        "name": {
          "type": "string",
          "description": "For payloadKind 'vcard': full name."
        },
        "ssid": {
          "type": "string",
          "description": "For payloadKind 'wifi': network name."
        },
        "text": {
          "type": "string",
          "description": "For payloadKind 'text': the literal text."
        },
        "email": {
          "type": "string",
          "description": "For payloadKind 'vcard': email address."
        },
        "phone": {
          "type": "string",
          "description": "Phone, for vcard/mecard/tel/sms/whatsapp."
        },
        "start": {
          "type": "string",
          "description": "For 'event': start datetime (YYYY-MM-DDTHH:MM)."
        },
        "title": {
          "type": "string",
          "description": "For 'event': title. For 'vcard': job title."
        },
        "allDay": {
          "type": "boolean",
          "description": "For 'event': all-day (DATE values)."
        },
        "amount": {
          "type": "string",
          "description": "For 'paypal': optional amount."
        },
        "fields": {
          "type": "object",
          "description": "Payload fields for the kind. Flat sibling properties (url, phone, handle, …) are also accepted, matching get_qr_matrix."
        },
        "handle": {
          "type": "string",
          "description": "For social kinds: handle or profile URL."
        },
        "message": {
          "type": "string",
          "description": "For 'sms'/'whatsapp': message text."
        },
        "version": {
          "type": "integer",
          "maximum": 40,
          "minimum": 1,
          "description": "Force a QR version (size). Omit to use the smallest that fits."
        },
        "location": {
          "type": "string",
          "description": "For 'event': location."
        },
        "password": {
          "type": "string",
          "description": "For payloadKind 'wifi': network password."
        },
        "username": {
          "type": "string",
          "description": "For 'telegram': username or t.me URL."
        },
        "description": {
          "type": "string",
          "description": "For 'event': description."
        },
        "payloadKind": {
          "enum": [
            "url",
            "qart_code",
            "text",
            "wifi",
            "vcard",
            "mecard",
            "mailto",
            "tel",
            "sms",
            "geo",
            "whatsapp",
            "telegram",
            "event",
            "instagram",
            "twitter",
            "youtube",
            "facebook",
            "tiktok",
            "linkedin",
            "paypal"
          ],
          "type": "string",
          "description": "What the code should contain. 'qart_code' sizes the retargetable variant — a 16-byte qart.uk/_ link instead of your data. whatsapp/telegram/event/social kinds assemble a standard URL or VCALENDAR; they are verbatim, not retargetable."
        }
      },
      "additionalProperties": false
    }
    arguments 123 lines
  • explain_qart reads unknown never probed

    Explain how qart.uk works: scan verification, retargeting a printed code, the free claim pool and its daily allowances, Studio pricing, and what happens to credits when a run is stopped or fails. Use this before guessing at product details — pricing and allowances change and this returns the current text.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "topic": {
          "enum": [
            "overview",
            "free-pool",
            "studio",
            "pricing",
            "retargeting"
          ],
          "type": "string",
          "description": "Which aspect to explain. Defaults to overview."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • resolve_qart_code reads unknown never probed

    Resolve a scanned qart.uk code to the URL it currently points at. Accepts the alias ('_ab12cde'), or a full qart.uk URL to pull it out of. Returns targetUrl, or disabledReason if the owner retired it. This does not count as a scan and will not affect the owner's statistics. Only the '_' code class resolves here; older qart.uk links of other shapes are not in this pool.

    mcp-tool

    {
      "type": "object",
      "required": [
        "code"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "The code to resolve — '_ab12cde', '/_ab12cde', or 'https://qart.uk/_ab12cde'."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • buy_qr_outright moves money unknown never probed

    How to buy ONE finished QR artwork with no account at all, paying from your own wallet over x402. Returns the live price and the exact request to make. This is the right tool when you have a wallet but no qart.uk account: get_credit_packs buys CREDITS, which still need an account to spend, and the Studio tools all require an OAuth token. This path requires neither — you GET https://qart.uk/api/v1/qr?url=..., it answers 402, you retry with a PAYMENT-SIGNATURE header, and the PNG comes back in the response body. You are charged ONLY if a real QR detector decodes the image: settlement runs after the scan verdict, so a request that produces nothing scannable is never settled and costs you nothing. Pay in USDC on Base — you do not need ETH, because the facilitator submits the transaction. Cannot be performed through MCP itself: a payment rides in an HTTP header and there is nowhere to put one here. This tool tells you the call; you make it.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "description": "The https destination you want the QR to encode. Optional — without it you get the price and the call shape."
        },
        "size": {
          "enum": [
            768,
            1024
          ],
          "type": "integer",
          "description": "Pixel size. 1024 costs more. Defaults to 768."
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • get_credit_packs reads unknown never probed

    What Studio credits cost: the packs on sale, their price in USD, and roughly how many images each buys. Anonymous — this is a price list. Read it rather than quoting a price from memory; packs change. An agent that runs out mid-task can top up WITHOUT a human, paying from its OWN wallet: POST /api/qart/x402/credits?pack=... with a qart:purchase bearer token. The money comes from the application's wallet, never the user's card. Stripe checkout (POST /api/qart/checkout) remains human-only; hand the user the purchase URL for that.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_qr_matrix reads unknown 29m ago

    Return the actual QR MODULE GRID for a payload — the black/white matrix, plus a per-module map of which modules are function patterns (finder, separator, timing, alignment, format info, version info, dark module) and which carry data. Both come back as one row string per row. Costs nothing, mints nothing, stores nothing. Use this when you are going to RENDER or transform a QR yourself: dithering a photo into it, drawing it as an SVG, laying it out for print, or reasoning about which modules are safe to alter. The function-pattern map is the point — any technique that paints over a QR has to know which modules a scanner uses to FIND the code (finder, timing, alignment) versus which merely carry bits. Do NOT use it to check whether a payload fits — preview_qr_encoding is smaller and answers that. Do NOT use it to get a qart.uk product: this is a plain standards QR, with no artwork, no scan verdict and no alias behind it. The matrix is canonical and untransformed: invert, rotation, mirror and any subpixel scaling are yours to apply afterwards.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "ecc": {
          "enum": [
            "L",
            "M",
            "Q",
            "H"
          ],
          "type": "string",
          "description": "Error correction level. Defaults to H, which is what any paint-over-the-code technique needs."
        },
        "end": {
          "type": "string",
          "description": "For 'event': end datetime."
        },
        "lat": {
          "type": "number",
          "description": "For 'geo': latitude."
        },
        "lng": {
          "type": "number",
          "description": "For 'geo': longitude."
        },
        "org": {
          "type": "string",
          "description": "For 'vcard': organization."
        },
        "url": {
          "type": "string",
          "description": "For 'url': the destination. For 'vcard'/'mecard': the website."
        },
        "auth": {
          "enum": [
            "WPA",
            "WEP",
            "nopass"
          ],
          "type": "string",
          "description": "For 'wifi': security type. Defaults to WPA."
        },
        "body": {
          "type": "string",
          "description": "For 'mailto': message body."
        },
        "mask": {
          "enum": [
            "auto",
            "0",
            "1",
            "2",
            "3",
            "4",
            "5",
            "6",
            "7"
          ],
          "type": "string",
          "description": "Which of the 8 standard mask patterns to apply. 'auto' (default) picks the lowest-penalty one, exactly as the encoder in the browser does. All 8 are legal and scan identically; they differ only in how the light and dark modules are laid out, which is worth pinning when you are fitting a picture to the grid."
        },
        "name": {
          "type": "string",
          "description": "For 'vcard'/'mecard': full name."
        },
        "ssid": {
          "type": "string",
          "description": "For 'wifi': network name."
        },
        "text": {
          "type": "string",
          "description": "For 'text': the literal text."
        },
        "email": {
          "type": "string",
          "description": "Email address, for 'vcard'/'mecard'/'mailto'."
        },
        "phone": {
          "type": "string",
          "description": "Phone number, for 'vcard'/'mecard'/'tel'/'sms'/'whatsapp'."
        },
        "start": {
          "type": "string",
          "description": "For 'event': start datetime (YYYY-MM-DDTHH:MM)."
        },
        "title": {
          "type": "string",
          "description": "For 'vcard': job title. For 'event': event title."
        },
        "allDay": {
          "type": "boolean",
          "description": "For 'event': all-day (DATE values)."
        },
        "amount": {
          "type": "string",
          "description": "For 'paypal': optional amount."
        },
        "handle": {
          "type": "string",
          "description": "For social kinds (instagram, twitter, youtube, facebook, tiktok, linkedin, paypal): handle or profile URL."
        },
        "hidden": {
          "type": "boolean",
          "description": "For 'wifi': hidden network."
        },
        "address": {
          "type": "string",
          "description": "For 'vcard': postal address."
        },
        "message": {
          "type": "string",
          "description": "For 'sms'/'whatsapp': message text."
        },
        "subject": {
          "type": "string",
          "description": "For 'mailto': subject line."
        },
        "version": {
          "type": "integer",
          "maximum": 40,
          "minimum": 1,
          "description": "Force a QR version (1-40, size 21-177 modules). Omit for the smallest that fits. Pinning BELOW the fit is impossible and is raised to the fit, matching the Studio."
        },
        "location": {
          "type": "string",
          "description": "For 'event': location."
        },
        "password": {
          "type": "string",
          "description": "For 'wifi': network password."
        },
        "username": {
          "type": "string",
          "description": "For 'telegram': username or t.me URL."
        },
        "description": {
          "type": "string",
          "description": "For 'event': description."
        },
        "payloadKind": {
          "enum": [
            "url",
            "qart_code",
            "text",
            "wifi",
            "vcard",
            "mecard",
            "mailto",
            "tel",
            "sms",
            "geo",
            "whatsapp",
            "telegram",
            "event",
            "instagram",
            "twitter",
            "youtube",
            "facebook",
            "tiktok",
            "linkedin",
            "paypal"
          ],
          "type": "string",
          "description": "What the code should contain. Defaults to url."
        }
      },
      "additionalProperties": false
    }
    arguments 168 lines
_ try it over mcp through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 765b149110ecb7b6.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/765b149110ecb7b6/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/765b149110ecb7b6/badge.svg)](https://brick.blue/agent/765b149110ecb7b6?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we knowoff the mcp door
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.