{"serverId":"mcp-registry/uk.qart/qart","tools":[{"name":"browse_free_pool","fixed":{"name":"browse_free_pool","description":"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.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":173,"tokensAfter":173},{"name":"buy_qr_outright","fixed":{"name":"buy_qr_outright","description":"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. \n\nThis 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 t","inputSchema":{"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},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":244,"tokensAfter":244},{"name":"explain_qart","fixed":{"name":"explain_qart","description":"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.","inputSchema":{"type":"object","properties":{"topic":{"enum":["overview","free-pool","studio","pricing","retargeting"],"type":"string","description":"Which aspect to explain. Defaults to overview."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":160,"tokensAfter":160},{"name":"get_credit_packs","fixed":{"name":"get_credit_packs","description":"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.\n\nAn 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 t","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"get_dither_qr_parameters","fixed":{"name":"get_dither_qr_parameters","description":"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.\n\nTHIS 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 ","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":176,"tokensAfter":176},{"name":"get_qr_matrix","fixed":{"name":"get_qr_matrix","description":"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.\n\nUse 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","inputSchema":{"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},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":1034,"tokensAfter":1034},{"name":"preview_qr_encoding","fixed":{"name":"preview_qr_encoding","description":"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.\n\nUse 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; mo","inputSchema":{"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},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":814,"tokensAfter":814},{"name":"resolve_qart_code","fixed":{"name":"resolve_qart_code","description":"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.","inputSchema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","description":"The code to resolve — '_ab12cde', '/_ab12cde', or 'https://qart.uk/_ab12cde'."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":176,"tokensAfter":176}],"toolsChanged":8,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}