qr-cow MCP server
Official# qr-cow MCP server
[](https://pypi.org/project/qr-cow-mcp/)
[](https://pypi.org/project/qr-cow-mcp/)
[](LICENSE)
[](https://github.com/qrcow/qr_cow_mcp/actions/workflows/ci.yml)
An MCP server that exposes the customer-facing [qr-cow.com](https://qr-cow.com)
API to any MCP-compatible AI client (Claude Desktop, Claude Code, Cursor,
Zed, …).
Once connected, you can say things like:
> "Make a QR code that goes to https://my-cafe.com/menu, call it Café menu"
> "Render a styled QR for https://acme.com in the ocean preset, 600px"
> "Show me which countries scanned my café menu last week"
> "Change the destination of the café menu QR to /menu-v2"
…and the assistant calls the API on your behalf.
---
## 1. Create a token
1. Sign in at https://qr-cow.com.
2. Go to **Dashboard → API & MCP**.
3. Click **Create token**. Give it a name like "Claude Desktop".
4. Copy the `qrc_live_…` value that appears. **It's shown once.**
## 2. Wire it into your MCP client
### Claude Desktop / Claude Code
Add to `~/.claude.json` (or your platform's equivalent config):
```json
{
"mcpServers": {
"qr-cow": {
"command": "uvx",
"args": ["qr-cow-mcp"],
"env": {
"QRCOW_API_TOKEN": "qrc_live_..."
}
}
}
}
```
Restart the client. You should see qr-cow tools listed.
### Cursor / Zed
Same shape — pass `command`, `args`, and an `env` block with
`QRCOW_API_TOKEN`. See their MCP docs for the exact key.
### Self-hosted qr-cow
Set `QRCOW_API_BASE` (defaults to `https://qr-cow.com/api`) to point at
your install:
```json
"env": {
"QRCOW_API_TOKEN": "qrc_live_...",
"QRCOW_API_BASE": "https://your-host/api"
}
```
---
## Tools
| Tool | What it does |
|---|---|
| `create_qrcode` | Create and save a static or dynamic QR (URL, Wi-Fi, vCard, …) in your account. |
| `render_styled_qrcode` | Render a fully styled QR image (dot/eye shapes, gradient, logo) from data plus a preset or style, without saving it. Returns the image. |
| `list_qrcodes` | List recent QR codes in your account. |
| `get_qrcode` | Fetch one QR code with its current destination + design. |
| `update_qrcode_destination` | Change a dynamic QR's destination — the printed code keeps working. |
| `delete_qrcode` | Soft-delete a code. |
| `get_qrcode_analytics` | Scans, unique scanners, country / device / hour-of-day breakdown. |
| `me` | The signed-in user's profile + current plan. |
---
## Develop locally
```sh
git clone https://github.com/qrcow/qr_cow_mcp.git
cd qr_cow_mcp
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"
pytest
# Try it out — auth doesn't matter for startup
QRCOW_API_TOKEN=qrc_live_local QRCOW_API_BASE=http://localhost:8080/api qr-cow-mcp
```
The server speaks stdio, so the easiest way to manually exercise it is
through an MCP client.
## Privacy & security
- The server is a thin pass-through: your token stays in your MCP client
config and is only ever sent to the qr-cow API (or the `QRCOW_API_BASE`
you configure) as a `Bearer` header.
- No telemetry, no third-party calls. Requests carry a
`User-Agent: qr-cow-mcp/<version>` header so the API can distinguish
MCP traffic.
## Contributing & releases
- [CONTRIBUTING.md](CONTRIBUTING.md) — dev setup, style, how to send a PR.
- [CHANGELOG.md](CHANGELOG.md) — what changed in each release.
- [RELEASING.md](RELEASING.md) — how maintainers cut a release (tag → CI → PyPI).
## License
[MIT](LICENSE)
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose. render_styled_qrcode is explicitly stateless and different from create_qrcode, while update_qrcode_destination, get_qrcode_analytics, and me serve unique roles without overlap.
Most tools follow a consistent verb_noun pattern (create_qrcode, list_qrcodes, get_qrcode, delete_qrcode, render_styled_qrcode, update_qrcode_destination, get_qrcode_analytics). The lone exception is 'me', which is a minor deviation in an otherwise predictable scheme.
With 8 tools, the server is well-scoped for a QR code management service. Each tool fulfills a necessary operation without redundancy or excessive granularity, fitting comfortably in the ideal 3-15 range.
The tool set covers the full QR code lifecycle: create, read, list, delete, update (destination), plus rendering without saving, analytics, and user plan info. No significant gaps are evident for the stated purpose.