# sinkto.link — full reference > Complete reference for the sinkto.link MCP server: every tool, resource, prompt and plan limit. The short version is at https://www.sinkto.link/llms.txt. ## What this is sinkto.link is a free URL shortener with click analytics, QR codes, password-protected links and unlimited team collaboration. It runs a hosted Model Context Protocol server so AI assistants can do that work on a user's behalf. ## Connecting - Endpoint: `https://www.sinkto.link/api/mcp` - Transport: Streamable HTTP (JSON-RPC over POST). GET returns 405 — it is not a page. - Auth: `Authorization: Bearer sk_live_...`. Keys are created at https://www.sinkto.link/teams/api-keys. - Requests must send `Accept: application/json, text/event-stream`. Omitting either yields 406. - Always use the `www.` host. The apex redirects, and clients that drop the body on redirect will fail. Claude Code: ``` claude mcp add --transport http sinkto https://www.sinkto.link/api/mcp \ --header "Authorization: Bearer sk_live_..." ``` Any client reading .mcp.json: ```json { "mcpServers": { "sinkto": { "type": "http", "url": "https://www.sinkto.link/api/mcp", "headers": { "Authorization": "Bearer sk_live_..." } } } } ``` ## Scopes A key is bound to exactly one team and to the scopes chosen at creation, so no tool takes a team argument. Available scopes: `links:read`, `links:write`, `analytics:read`. Tools whose scope the key lacks are not listed at all, so a client never sees a capability it would be refused for. ## Tools ### whoami Scope: `any` Which team, plan, scopes and limits the key carries. Call it first, and whenever a tool reports a permission or quota problem. ### list_links Scope: `links:read` List and search the team's links. Supports query, page, limit, sortBy, sortOrder, minClicks, maxClicks, dateFrom, dateTo. ### get_link Scope: `links:read` One link's full detail, addressed by alias or id. ### generate_qr Scope: `links:read` Render a QR code as PNG or SVG from an alias or an arbitrary URL. Returns an image block. ### create_link Scope: `links:write` Shorten a URL. Optional customAlias, title, expiresAt, password, domain, and Pro-only ogTitle/ogDescription/ogImage. ### bulk_create_links Scope: `links:write` Shorten several URLs in one call. Each row succeeds or fails independently. ### update_link Scope: `links:write` Change destination, alias, title, expiry, password, active state or social preview. Only fields passed are changed. ### delete_link Scope: `links:write` Permanently delete a link and its click history. Requires confirm: true. ### get_link_analytics Scope: `analytics:read` Clicks and breakdowns by referrer, device, browser, OS, country, city or UTM parameter, for the team or one link. ### get_overview_stats Scope: `analytics:read` Headline team numbers and top links by traffic. ### get_recent_clicks Scope: `analytics:read` The most recent individual clicks with country, device, browser and referrer. ## Resources - `sinkto://team` — Plan, member count, verified custom domains, link and click totals. - `sinkto://links` — The 50 most recently created links with click counts. - `sinkto://links/{alias}` — One link's detail plus a 7-day click summary. ## Prompts - `campaign_links` — Build a UTM-tagged link set for one campaign across channels, with a consistent alias convention. - `link_report` — A written performance report: totals, top links, traffic sources and geography. - `audit_links` — Find expiring, inactive, zero-click and duplicate links and propose a cleanup. ## Plan limits - **FREE** — 1 API key per team, 60 requests per minute, 10 links per bulk call, analytics look-back up to 30 days. - **PRO** — 10 API keys per team, 600 requests per minute, 25 links per bulk call, analytics look-back up to 90 days. Every plan gets the full tool set; Pro raises the ceilings. Custom domains and custom social previews remain Pro-only, and the tools say so when a free team attempts them. ## Errors - `401` — missing, invalid, expired or revoked key, or its owner left the team. - `429` — rate limit reached. Honour `Retry-After`, which is in seconds. - `406` — the request did not accept both `application/json` and `text/event-stream`. - `405` — a GET was sent; the endpoint speaks JSON-RPC over POST. Tool-level failures return HTTP 200 with `isError: true` in the JSON-RPC result and an actionable message. ## More - Setup guide: https://www.sinkto.link/docs/mcp - Product documentation: https://www.sinkto.link/docs - Short summary: https://www.sinkto.link/llms.txt