Connect AI tools to your links
Sinkto.Link speaks the Model Context Protocol, so Claude Code, Claude.ai, Cursor, and any other MCP client can shorten URLs, manage your links, generate QR codes, and read click analytics on your behalf. Nothing to install — it's one hosted endpoint and an API key.
Endpoint
https://www.sinkto.link/api/mcpWhat this is
MCP is the standard way an AI assistant talks to an outside service. Instead of you copying links between a chat window and your dashboard, the assistant calls Sinkto.Link directly — so "shorten these five URLs for the launch and tag them for Twitter" becomes one instruction rather than fifteen clicks.
The server is hosted by us at the endpoint above and speaks Streamable HTTP. There is no package to install and no version to keep up to date.
Get an API key
- Open Teams → API keys.
- Switch to the team the key should act on, using the team switcher in the sidebar. A key can only ever reach that one team.
- Choose permissions. Start with Read links and Read analytics; add Manage links only when you want the assistant to create or delete things.
- Choose an expiry, then create the key.
- Copy the key immediately. It is shown once and never again. If you lose it, revoke it and make a new one.
Keys look like sk_live_… and should be treated like a password: never commit one to a repository or paste it into a shared document.
Connect your client
Replace sk_live_... with your key in each snippet below.
Claude Code
claude mcp add --transport http sinkto https://www.sinkto.link/api/mcp \
--header "Authorization: Bearer sk_live_..."Cursor, VS Code, or any client using .mcp.json
{
"mcpServers": {
"sinkto": {
"type": "http",
"url": "https://www.sinkto.link/api/mcp",
"headers": {
"Authorization": "Bearer sk_live_..."
}
}
}
}Claude.ai
- Settings → Connectors → Add custom connector.
- Paste
https://www.sinkto.link/api/mcpas the URL. - Add a header: name
Authorization, valueBearer sk_live_...
Verify the connection with curl
curl -X POST https://www.sinkto.link/api/mcp \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Always use the www host. sinkto.link permanently redirects to www.sinkto.link, and some clients drop the request body when they follow a redirect on POST.
Tools
Tools your key lacks the scope for are hidden entirely, so an assistant never offers something it will be refused for.
| Tool | Scope | What it does |
|---|---|---|
| whoami | any | Which team, plan, scopes, and limits this key has. Call it first. |
| list_links | links:read | List and search the team's links, with paging and sorting. |
| get_link | links:read | One link's full detail, addressed by alias. |
| generate_qr | links:read | Render a QR code as PNG or SVG, from an alias or any URL. |
| create_link | links:write | Shorten a URL, optionally with a custom alias, expiry, or password. |
| bulk_create_links | links:write | Shorten several URLs in one call; each row succeeds or fails on its own. |
| update_link | links:write | Change destination, alias, title, expiry, password, or active state. |
| delete_link | links:write | Permanently delete a link. Requires an explicit confirm flag. |
| get_link_analytics | analytics:read | Clicks and breakdowns by source, device, browser, OS, country, city, or UTM. |
| get_overview_stats | analytics:read | Headline team numbers and top links by traffic. |
| get_recent_clicks | analytics:read | The most recent individual clicks, with country, device, and browser. |
Links are addressed by alias — the part after the domain — not by internal id, so you can say "update the launch-2026 link" and it works.
Resources & prompts
Three resources let a client pull context without spending a tool call:
sinkto://team— plan, members, custom domains, link and click totals.sinkto://links— the 50 most recent links with click counts.sinkto://links/{alias}— one link's detail plus a 7-day click summary.
And three prompts for the jobs people actually run:
- campaign_links — a UTM-tagged link set across channels, with a consistent alias convention.
- link_report — a written performance report with totals, top links, sources, and geography.
- audit_links — find expiring, inactive, zero-click, and duplicate links, and propose a cleanup.
Scopes & limits
| Limit | Free | Pro |
|---|---|---|
| API keys per team | 1 | 10 |
| Requests per minute | 60 | 600 |
| Analytics look-back | 30 days | 90 days |
| Links per bulk call | 10 | 25 |
Every plan gets the full tool set — Pro raises the ceilings, it doesn't unlock the door. Custom domains and custom social previews remain Pro features, and the tools will say so if you try to use them on a free team.
Troubleshooting
- 401 Unauthorized
- The header must read exactly
Authorization: Bearer sk_live_.... If the key was revoked, expired, or its owner left the team, it stops working immediately — create a new one in Settings. - 429 Too Many Requests
- You hit the per-minute ceiling for your plan. Wait for the window in the
Retry-Afterheader, or upgrade the team to Pro. - The client connects but lists no tools
- Your key has no scopes, or only scopes whose tools are hidden. Run
whoami, or check the key's permissions in Settings. - "Method not allowed" in a browser
- Expected — the endpoint speaks JSON-RPC over POST. There is nothing to see by visiting it.
- 406 Not Acceptable
- Streamable HTTP requires the request to accept both content types. Send
Accept: application/json, text/event-stream. Real MCP clients do this for you; hand-written curl calls need it spelled out. - Requests fail only from one client
- Check the host. Use
www.sinkto.link, not the bare apex domain.
Ready to connect?
Generate a key under Teams → API keys, then paste one line into your client.
Create an API key