CodeQR Remote MCP Server
OfficialClick on "Install 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., "@CodeQR Remote MCP ServerCreate a short link for https://example.com"
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.
CodeQR Remote MCP Server
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.
How It Works
┌──────────┐ ┌─────────────────────┐ ┌──────────┐
│ ChatGPT │ │ CodeQR MCP Remote │ │ CodeQR │
│ or any │─────▶│ │─────▶│ API │
│ MCP │◀─────│ OAuth 2.0 + MCP │◀─────│ │
│ client │ │ Streamable HTTP │ │ │
└──────────┘ └─────────────────────┘ └──────────┘Client discovers auth endpoints via
/.well-known/oauth-protected-resourceClient registers dynamically via
POST /oauth/registerGET /oauth/authorizesends the user to CodeQR, where they log in, choose which project to grant access to, and approve — no API key is ever handledCodeQR returns them to
GET /oauth/callback, which trades the code for an access + refresh token pairClient exchanges authorization code for access token (PKCE)
Client sends MCP tool calls with Bearer token to
POST /mcp
The CodeQR access token lasts 7 days and is renewed transparently, so the session stays valid for the 120-day life of the refresh token.
Related MCP server: opn-mcp
Quick Start
# Install dependencies
npm install
# Set environment variables
cp .env.example .env
# Edit .env with your SERVER_URL
# Development
npm run dev
# Production
npm run build
npm startDeploy
Vercel (Recommended)
The project is configured for Vercel serverless functions:
# Install Vercel CLI
npm i -g vercel
# Deploy
vercel
# Set environment variables in Vercel dashboard:
# - SERVER_URL — Your public server URL (e.g., https://mcp.codeqr.io)
# - UPSTASH_REDIS_REST_URL — From your Upstash Redis database (REST API)
# - UPSTASH_REDIS_REST_TOKEN — From your Upstash Redis database
# - CODEQR_OAUTH_CLIENT_ID — client_id of the OAuth app registered in CodeQR
# - CODEQR_OAUTH_CLIENT_SECRET — its client_secret
# - CODEQR_APP_URL — Dashboard origin (default: https://app.codeqr.io)
# - STAINLESS_API_KEY — Optional Stainless API key
# - LOG_LEVEL — Log level (default: info)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).
Docker
docker build -t codeqr-mcp-remote .
docker run -p 3000:3000 -e SERVER_URL=https://mcp.codeqr.io codeqr-mcp-remoteRailway / Render / Fly.io
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)
Connect to ChatGPT
Deploy this server to a public URL
In ChatGPT, go to Settings > Advanced > Developer Mode
Go to the Connectors tab
Click Add Connector
Enter your server URL (e.g.,
https://mcp.codeqr.io/mcp)ChatGPT will auto-discover the OAuth endpoints and prompt you to authorize
Connect to OpenAI Agents SDK
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-4o",
tools=[{
"type": "mcp",
"server_label": "codeqr",
"server_url": "https://mcp.codeqr.io/mcp",
"require_approval": "never",
}],
input="Create a short link for https://example.com",
)Available Tools
Tool | Description |
| Create a shortened link |
| List all short links |
| Get link details |
| Update a link |
| Delete a link |
| 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 all QR codes |
| Change where an existing QR code points, without reprinting it |
| Delete a QR code; printed copies stop resolving |
| Query click analytics |
| List custom domains |
| List tags |
| Create a tag |
| 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.
API Endpoints
Method | Path | Auth | Description |
GET |
| No | Health check |
GET |
| No | OAuth resource metadata (RFC 9728) |
GET |
| No | OAuth server metadata (RFC 8414) |
POST |
| No | Dynamic client registration (RFC 7591) |
GET |
| No | Redirects the user to CodeQR to approve |
GET |
| No | Return leg from CodeQR |
POST |
| No | Token exchange |
POST |
| Bearer | MCP Streamable HTTP endpoint |
Architecture
src/
├── index.ts # Express app & server startup
├── config.ts # Environment configuration
├── oauth/
│ ├── store.ts # OAuth state: Upstash Redis or in-memory fallback
│ └── pkce.ts # PKCE S256 verification
├── middleware/
│ └── auth.ts # Bearer token validation middleware
└── routes/
├── well-known.ts # OAuth discovery metadata endpoints
├── oauth.ts # Authorization & token endpoints
└── mcp.ts # MCP tool definitions & handlersProduction Considerations
OAuth persistence: Configure Upstash Redis (see
.env.example) for serverless and multi-instance deployments. Without it, the in-memory store is used (single process only).Add rate limiting to the OAuth and MCP endpoints
Add HTTPS (usually handled by your reverse proxy / platform)
Add monitoring (the
/healthendpoint is ready for probes)Consider token rotation for long-lived sessions
Publishing to the MCP Registry
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.
# 1. Bump the version in package.json, src/config.ts and server.json together.
# `yarn test` fails if they drift — the registry refuses to republish a
# version it already has.
#
# Then bump it in the CodeQR app too: the Server Card at
# app/.well-known/mcp/server-card.json/route.ts advertises this server's
# version, and no test can reach across repos to check. It already drifted
# once, to a release that never existed.
# 2. Authenticate with the private key (kept outside this repo).
PRIVATE_KEY="$(openssl pkey -in /path/to/codeqr-io.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')"
mcp-publisher login dns --domain codeqr.io --private-key "$PRIVATE_KEY"
# 3. Publish, then confirm the entry is live.
mcp-publisher publish
curl "https://registry.modelcontextprotocol.io/v0/servers?search=codeqr"If the key is ever rotated, remove the old TXT record — a stale one is tried first and makes verification fail.
Directory listings
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 |
| listed | |
| file in repo; claim pending | |
| pending | |
hand-reviewed submission on their site | pending | |
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.
License
MIT — CodeQR
This server cannot be installed
Maintenance
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables generation of QR codes from text or URLs in multiple formats (DataURL, SVG, terminal display) with customizable options like error correction, colors, and size. Supports batch processing of multiple QR codes and integrates seamlessly with MCP-compatible clients.Last updated44MIT
- AlicenseBqualityAmaintenanceMCP server for opn.onl, the open-source self-hostable URL shortener. Shorten links, read click analytics, generate branded QR codes, and manage links — against the hosted service or your own instance.Last updated24422MIT
- Alicense-qualityCmaintenanceMCP server that enables AI agents to manage Lnkify links, domains, API keys, and analytics. Allows creation and resolution of short links through natural language.Last updatedMIT

INBIO MCP Serverofficial
Alicense-qualityCmaintenanceOfficial MCP server for INBIO's URL shortener with click analytics and customizable QR codes. Enables link shortening, QR code generation, and link management with optional authentication for advanced features.Last updatedMIT
Related MCP Connectors
MCP server for URL shortening and management
Official in.bio MCP server: shorten URLs, styled QR codes, and click analytics. No API key needed.
Create and manage QR codes on me-qr.com from AI clients like Claude and ChatGPT.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/codeqr-io/codeqr-mcp-remote'
If you have feedback or need assistance with the MCP directory API, please join our Discord server