{"apiVersion":"v1","directorySlug":"turtleqr-mcp-775c8707b2","title":"TurtleQR","description":"Free static QR downloads and editable dynamic codes for print and physical assets. Codes survive cancellation. Free tier included.","pageUrl":"https://www.mcpbundles.com/skills/turtleqr-mcp-775c8707b2","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.turtleqr.com/mcp","hostedMcpUrl":null,"toolCount":12,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.turtleqr/turtleqr-mcp-775c8707b2","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"create_qr","description":"Create a new dynamic QR code. Returns the slug, short URL, and code id. The short URL begins resolving immediately at qr.turtleqr.com/{slug}. Use this whenever the user wants a QR for a URL, landing page, signup form, sticker, business card, menu, or anything that should redirect.","inputSchema":{"type":"object","required":["targetUrl"],"properties":{"slug":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","maxLength":100},"type":{"enum":["url","menu","event","coupon","social","business-page"],"type":"string","default":"url"},"scanCap":{"type":"integer","minimum":1},"expiresAt":{"type":"string","format":"date-time"},"targetUrl":{"type":"string","format":"uri"},"fallbackUrl":{"type":"string","format":"uri"}}},"logicalName":"create_qr","displayName":"create_qr","title":"create_qr","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_qr_codes","description":"List the QR codes in the active workspace. Returns up to 100 codes ordered newest-first. Includes slug, target URL, status, and timestamps.","inputSchema":{"type":"object","properties":{}},"logicalName":"list_qr_codes","displayName":"list_qr_codes","title":"list_qr_codes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_qr_code","description":"Read a single QR code by id. Returns full details including expiration and scan cap.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"logicalName":"get_qr_code","displayName":"get_qr_code","title":"get_qr_code","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_qr_target","description":"Change a QR code's destination without reprinting. Supports updating targetUrl, fallbackUrl, expiresAt, scanCap, or status. The KV cache is invalidated; new scans see the new value within 60 seconds globally.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"status":{"enum":["active","expired","suspended"],"type":"string"},"scanCap":{"type":["integer","null"],"minimum":1},"expiresAt":{"type":["string","null"],"format":"date-time"},"targetUrl":{"type":"string","format":"uri"},"fallbackUrl":{"type":["string","null"],"format":"uri"}}},"logicalName":"update_qr_target","displayName":"update_qr_target","title":"update_qr_target","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_qr_code","description":"Soft-delete a code (status=deleted). Scanners with the printed slug start hitting the workspace fallback. Recoverable by an admin.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"logicalName":"delete_qr_code","displayName":"delete_qr_code","title":"delete_qr_code","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_qr_scans","description":"List recent scans for a code. Returns up to `limit` scans (default 50, max 500), newest first, with country/region/city, device, OS, browser.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"limit":{"type":"integer","default":50,"maximum":500,"minimum":1}}},"logicalName":"get_qr_scans","displayName":"get_qr_scans","title":"get_qr_scans","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"whoami","description":"Returns information about the authenticated workspace and API key. Useful for the agent to confirm scope before acting.","inputSchema":{"type":"object","properties":{}},"logicalName":"whoami","displayName":"whoami","title":"whoami","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_qr_image","description":"Render a QR code as an image. Returns base64-encoded PNG (or SVG text) suitable for the agent to display, attach, or save. The QR encodes the short URL (qr.turtleqr.com/{slug}) so the underlying target can change later without reprinting.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"size":{"type":"integer","default":1024,"maximum":2048,"minimum":128},"format":{"enum":["png","svg"],"type":"string","default":"png"}}},"logicalName":"get_qr_image","displayName":"get_qr_image","title":"get_qr_image","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_qr_analytics","description":"Get aggregated scan analytics for a QR code: totals, time series, breakdowns by country, device, OS, browser, hour-of-day, and day-of-week. Use this for dashboards, reports, or to answer questions like 'how is my conference QR code doing?' Use list_recent_scans if the user wants individual scan events instead of aggregates, and use export_qr_scans_csv if they want a downloadable spreadsheet.","inputSchema":{"type":"object","required":["codeId"],"properties":{"range":{"enum":["7d","30d","90d","all"],"type":"string","default":"30d"},"codeId":{"type":"string"}}},"logicalName":"get_qr_analytics","displayName":"get_qr_analytics","title":"get_qr_analytics","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_recent_scans","description":"List recent scans for a QR code, newest first. Each scan returns: scannedAt, country, region, city, device, os, browser, referer. Use for activity feeds, recent-events views, or pagination through scan history. Pass `cursor` (the previous response's nextCursor) to fetch the next page. Use get_qr_analytics if you want aggregates instead of individual events.","inputSchema":{"type":"object","required":["codeId"],"properties":{"limit":{"type":"integer","default":50,"maximum":200,"minimum":1},"codeId":{"type":"string"},"cursor":{"type":"string"}}},"logicalName":"list_recent_scans","displayName":"list_recent_scans","title":"list_recent_scans","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"bulk_create_qr_codes","description":"Create up to 50 QR codes in one call. Useful when seeding a campaign from a list of URLs (e.g., 'create QR codes for each of these 20 product pages'). Returns both the successfully-created codes and any individual failures so the agent can report partial success. Stops early on rate limits or plan-tier code-limit errors and surfaces the partial result with a clear reason. For a single code, prefer `create_qr`.","inputSchema":{"type":"object","required":["codes"],"properties":{"codes":{"type":"array","items":{"type":"object","required":["targetUrl"],"properties":{"slug":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","maxLength":100},"label":{"type":"string"},"targetUrl":{"type":"string","format":"uri"}}},"maxItems":50,"minItems":1}}},"logicalName":"bulk_create_qr_codes","displayName":"bulk_create_qr_codes","title":"bulk_create_qr_codes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"export_qr_scans_csv","description":"Export scan history as CSV for one QR code. Returns the CSV text inline, ready to save to a file or pipe into a spreadsheet. Use for offline analysis, reporting to a stakeholder, or archiving. The agent should write the returned `csv` field to a `.csv` file using the suggested `filename`. The API caps exports at 100,000 rows; widen `range` cautiously on high-volume codes. For aggregates, use get_qr_analytics; for paginated event browsing, use list_recent_scans.","inputSchema":{"type":"object","required":["codeId"],"properties":{"range":{"enum":["7d","30d","90d","all"],"type":"string","default":"30d"},"codeId":{"type":"string"}}},"logicalName":"export_qr_scans_csv","displayName":"export_qr_scans_csv","title":"export_qr_scans_csv","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=TurtleQR&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AudHVydGxlcXIuY29tL21jcCJ9"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22TurtleQR%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.turtleqr.com%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22TurtleQR%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.turtleqr.com%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=TurtleQR&connectorUrl=https%3A%2F%2Fmcp.turtleqr.com%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"TurtleQR\" --url \"https://mcp.turtleqr.com/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/turtleqr-mcp-775c8707b2","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/turtleqr-mcp-775c8707b2/tools/{tool}","mcpServerUrl":"https://mcp.turtleqr.com/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/turtleqr-mcp-775c8707b2?live=1"}