Create and manage CodeQR short links, QR codes, and analytics from any MCP client.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Remote MCP server for CodeQR with OAuth 2.0 authentication. Compatible with ChatGPT, OpenAI Agents SDK, Grok (xAI), and any MCP client supporting Streamable HTTP transport.
/.well-known/oauth-protected-resourcePOST /oauth/registerGET /oauth/authorize sends the user to CodeQR, where they log in, choose
which project to grant access to, and approve β no API key is ever handledGET /oauth/callback, which trades the code for an
access + refresh token pairPOST /mcpThe CodeQR access token lasts 7 days and is renewed transparently, so the session stays valid for the 120-day life of the refresh token.
The project is configured for Vercel serverless functions:
The app will be available at https://your-project.vercel.app. All routes are handled by the serverless function at api/server.ts.
OAuth storage: Set Upstash Redis (UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN) so authorization codes, access tokens, and registered clients persist across serverless invocations. If these variables are omitted, the server falls back to an in-memory store (fine for local development only).
Set environment variables:
SERVER_URL β Your public server URL (e.g., https://mcp.codeqr.io)UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN β Recommended for multi-instance or restartsPORT β Port (usually set automatically by the platform)https://mcp.codeqr.io/mcp)| Tool | Description |
|---|---|
create_link | Create a shortened link |
list_links | List all short links |
get_link_info | Get link details |
update_link | Update a link |
delete_link | Delete a link |
create_qrcode | Create a dynamic QR code encoding a URL, Wi-Fi credentials, a contact card, WhatsApp, email, SMS, a phone number, text or a crypto request |
list_qrcodes | List all QR codes |
update_qrcode | Change where an existing QR code points, without reprinting it |
delete_qrcode | Delete a QR code; printed copies stop resolving |
get_analytics | Query click analytics |
list_domains | List custom domains |
list_tags | List tags |
create_tag | Create a tag |
get_workspace | Read the authorized workspace: name, slug and plan |
Conversion tracking is not offered. track_lead and track_sale need the
conversions.write scope, which CodeQR grants to workspace owners only, and
requesting it makes CodeQR reject the whole authorization for everyone else.
| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /health | No | Health check |
| GET | /.well-known/oauth-protected-resource | No | OAuth resource metadata (RFC 9728) |
| GET | /.well-known/oauth-authorization-server | No | OAuth server metadata (RFC 8414) |
| POST | /oauth/register | No | Dynamic client registration (RFC 7591) |
| GET | /oauth/authorize | No | Redirects the user to CodeQR to approve |
| GET | /oauth/callback | No | Return leg from CodeQR |
| POST | /oauth/token | No | Token exchange |
| POST | /mcp | Bearer | MCP Streamable HTTP endpoint |
.env.example) for serverless and multi-instance deployments. Without it, the in-memory store is used (single process only)./health endpoint is ready for probes)This server is listed in the official registry as io.codeqr/codeqr. The registry
stores only the metadata in server.json β never the code.
Publishing is authorized by DNS: a TXT record on the apex of codeqr.io holds
the public half of an Ed25519 key pair. Apex, not a selector β MCP DNS auth follows
SPF-style placement, and a record under _mcp-auth. fails with a generic signature
error that does not name the cause.
If the key is ever rotated, remove the old TXT record β a stale one is tried first and makes verification fail.
Aggregators crawl the ecosystem and list servers whether or not anyone claims them, so an unclaimed entry still exists β as a bot's guess at what this server does. Claiming replaces the guess and unlocks editing the name and description a reader sees. None of this is done by merging a file; each one is a one-time action on the aggregator's own site.
| Directory | How ownership is claimed | Status |
|---|---|---|
| Official MCP Registry | mcp-publisher + DNS, as above | listed |
| Glama | glama.json in this repo, then run the claim flow once from an account listed in maintainers | file in repo; claim pending |
| Smithery | smithery mcp publish https://mcp.codeqr.io/mcp -n <org>/<name> | pending |
| PulseMCP | hand-reviewed submission on their site | pending |
| mcp.so | submission form / GitHub issue | pending |
The GitHub OAuth route Glama also offers only associates repos under a personal
account, which this repo is not β it belongs to the codeqr-io org. Hence the file.
MIT β CodeQR
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/codeqr)<a href="https://allmcps.com/mcp/codeqr"><img src="https://allmcps.com/api/badge/codeqr?style=directory" alt="CodeQR on AllMCPs" /></a>