qrbaton
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@qrbatonTurn this checkout QR and my ₹642 Blinkit cart into a pay link"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
I send AI agents to shop for me. They work on a desktop, so at checkout they hit a UPI QR they can’t pay, and what follows is a screenshot relay: the agent sends the QR, I save it, open my UPI app, find “scan from gallery”, pick the screenshot, and check the amount.
qrbaton lets the agent pass the baton instead. It sends the QR and the cart, and I get one link: a clean review-and-pay page with a Pay button that opens GPay, PhonePe or Paytm with everything filled in. Once I’ve paid, the agent hears back and finishes the order.
What it does
Reads any UPI QR from screenshots, phone photos or crops. It’s decoded on the server, so the agent just sends the image.
Shows the whole cart: items, prices, discounts, delivery slot and address, the shop’s site, and a note from the agent.
Opens your UPI app directly, pre-filled, and remembers which app you used last.
Closes the loop: live status, an I’ve paid button with an optional UTR, and signed webhooks.
Works on a laptop: the pay page shows a fresh UPI QR to scan with your phone.
No keys, no accounts: one HTTP call or MCP tool. Links expire on their own.
Never touches money: it only builds the link. Your UPI app shows the real payee before you enter your PIN.
Related MCP server: dukaan-agent
Connect your agent
Claude Code
claude mcp add --transport http qrbaton https://qrbaton.vercel.app/mcpAny MCP client (Claude Desktop, Cursor, Codex…)
{ "mcpServers": { "qrbaton": { "type": "http", "url": "https://qrbaton.vercel.app/mcp" } } }Tools: create_pay_link, get_payment_status, set_payment_status.
Agent skill: /SKILL.md teaches the whole workflow, including “never send the screenshot, send the link”.
HTTP API
Open to anyone, no key needed. The app serves its own agent docs: /llms.txt, /openapi.json, /SKILL.md.
BASE=https://qrbaton.vercel.app
# Payee as a QR upload, a base64 image ("qr"), a upi:// string ("upi"), or plain fields ("payee": {pa, pn, am})
curl -X POST $BASE/api/sessions -F qr=@checkout-qr.png \
-F 'order={"merchant":"Blinkit","site":"https://blinkit.com","agent":"Claude","total":642,
"items":[{"name":"Hass Avocado","qty":1,"price":149}],"charges":[{"label":"Item total","amount":642}]}'
# -> {"id","url","statusUrl","manageToken","expiresAt","payee"}
curl $BASE/api/sessions/{id} # {"status":"pending|paid|failed|expired","paidBy"?,"utr"?}
curl -X PATCH $BASE/api/sessions/{id} -H "authorization: Bearer $MANAGE_TOKEN" -d '{"status":"paid"}'Amount: from
payee.am, elseorder.total, else the sum oforder.items(only when there are nocharges, since charges are the full bill as displayed). If both the amount and the total are given they must match.Webhooks: add
"callbackUrl": "https://…". Every status change POSTs{"event":"session.status",…}signed asx-qrbaton-signature: sha256=HMAC-SHA256(key = hex sha256(manageToken), raw body).Payer claims:
paidBy: "payer"means the payer tapped I’ve paid. The creator can confirm it, or overrule it withfailed. Otherwise terminal statuses are final.Limits:
CREATE_LIMIT_PER_HOURper IP (default 60). Links last 30 minutes by default (ttlSec, up to 24 h).Privacy: pay pages are
noindex,no-storeandReferrer-Policy: no-referrer. Order details are labelled on the page as unverified, provided by the sender.
Routes
Route | |
| Landing page, plus a QR → pay link tool that works without an agent (decoded in the browser) |
| Sample pay page; Pay simulates the payment |
| A pay session created through the API |
| A plain pay link, no backend; every param passes through to the deep links |
| MCP server and HTTP API |
Run it yourself
Next.js (App Router) on Vercel, with Upstash Redis for sessions.
Env var | |
| Upstash Redis (Vercel Marketplace → Upstash; |
| Optional; origin for returned links and SEO (defaults to Vercel’s production URL) |
| Optional first-party secret: no rate limit, can update any session |
| Optional; anonymous links per IP per hour (default 60) |
npm install
npm run dev # without Redis, dev keeps sessions in memory
npm test && npm run buildOffline helper: bin/qrbaton-link
Turns a QR image or upi:// string into a plain /?pa=… link on $QRBATON_URL, without calling the API. Decoder: pyzbar if libzbar is installed, else OpenCV (python3 -m venv .venv && .venv/bin/pip install opencv-python-headless pyzbar).
bin/qrbaton-link qr.jpg # -> pay link
bin/qrbaton-link --json qr.png # {"link","upi","pa","pn","am",...}License
MIT. Geist fonts in assets/fonts are under the SIL Open Font License.
This server cannot be deployed
Maintenance
Related MCP Connectors
India payments for AI agents — UPI, cards, wallets via Razorpay Payment Links. Never holds funds.
Pakistan payments for AI agents — Safepay checkout via Safepay. Never holds funds.
Stripe payments for AI agents. Create links, verify, manage customers.
Vietnam payments for AI agents — MoMo wallet QR, ATM, cards. Zero-setup sandbox. Never holds funds.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceAccept crypto payments from AI agents: create an invoice in one call and get a hosted checkout link (USDC/USDT on Celo, Base, Arbitrum, Polygon, BSC). No API key, instant self-custody settlement.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search a merchant's product catalog and complete UPI checkouts via Razorpay test-mode APIs, with spend mandates and full audit logging.MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI coding agents to add stablecoin crypto checkout, payment links, payment status checks, webhook verification, and webhook-based access logic to applications through hosted payment APIs.-
- FlicenseNot gradedqualityAmaintenanceLets AI coding agents integrate crypto checkout, payment links, payment status checks, and webhook-based entitlements into applications.-