qr-cow now speaks MCP. If that sentence means nothing to you yet, here is the practical version: you can open Claude, Cursor, or Zed, type "make a QR code for my new menu", and it happens — in your account, styled, saved, and trackable. This post covers what MCP is, the one-minute setup, and the eight things your assistant can now do with QR codes.
What is MCP?
The Model Context Protocol is an open standard, published by Anthropic, that lets AI assistants call external tools. An MCP server describes a set of actions ("create a QR code", "fetch scan analytics"), and any MCP-capable client (Claude Desktop, Claude Code, Cursor, Zed, and a fast-growing list of others) can discover and use them mid-conversation.
Our server is called qr-cow-mcp. It is a small, open source Python package (MIT licensed, source on GitHub) that forwards your assistant's requests to the same public API our API & MCP docs describe. No magic in the middle.
Set it up in one minute
- Sign in at qr-cow.com and open Dashboard → API & MCP.
- Click Create token and copy the
qrc_live_…value (it is shown once). - Add this to your MCP client's config (this example is Claude Desktop's
mcpServersblock):
{
"mcpServers": {
"qr-cow": {
"command": "uvx",
"args": ["qr-cow-mcp"],
"env": { "QRCOW_API_TOKEN": "qrc_live_..." }
}
}
}
Restart the client and the qr-cow tools appear. There is nothing to install beforehand: uvx fetches the package from PyPI on first run. Cursor and Zed use the same shape (a command, args, and an env block); their MCP docs show where it goes.
What you can ask for
- "Make a QR code that goes to my menu page, call it Café menu."
- "Render a QR for acme.com in the ocean preset, 600 pixels, transparent background."
- "Generate ten styled QR codes for these ten booth URLs." (This is where doing it by hand stops being fun and an assistant shines.)
- "Which countries scanned the café menu last week? Which hours are busiest?"
- "Point the printed menu code at /menu-v2 instead."
The eight tools
| Tool | What it does |
|---|---|
create_qrcode |
Create and save a static or dynamic QR code (URL, Wi-Fi, vCard, and 10 more types) in your account. |
render_styled_qrcode |
Render a fully styled image (dot and eye shapes, gradients, logo) from data plus a preset, without saving anything. Returns the image into the chat. |
list_qrcodes |
List your recent codes, newest first. |
get_qrcode |
Fetch one code with its current destination and design. |
update_qrcode_destination |
Change where a dynamic code points. The printed code keeps working. |
delete_qrcode |
Soft-delete a code. |
get_qrcode_analytics |
Scans, unique scanners, and breakdowns by country, device, and hour of day. |
me |
Your profile and current plan. |
The printed-code trick, explained
The most useful prompt in the list above is the least flashy one: retargeting a code that is already printed. That works because dynamic QR codes encode a short redirect URL rather than the destination itself, so the destination stays editable forever. Your assistant changing it in one sentence beats reprinting 500 flyers.
It is also why the analytics tool has something to report: every scan of a dynamic code passes through the redirect, which is what powers the country, device, and time-of-day breakdowns.
Privacy notes
- The server is a thin pass-through. Your token lives in your own config file and is only ever sent to the qr-cow API as an authorization header.
- No telemetry, no third-party calls, no storage in the middle.
- Rendering without saving (
render_styled_qrcode) is stateless: nothing appears in your account unless you ask to save.
Where to get it
The package is on PyPI as qr-cow-mcp, the source is on GitHub, and the full setup reference lives in the API & MCP docs. Static QR codes are free on every plan; dynamic codes with analytics start at $3/month, and the free plan includes a few to play with.
If you wire it into something interesting, tell us — we read every message to hi@qr-cow.com.
Originally published on the qr-cow blog.

Top comments (0)