Free QR codes that never expire and free short links with click stats.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <your API key>
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Permanently deletes one of the user's Snip links and its click history; its current and previous short URLs stop working within a minute and all of its endings are free again. Needs the user signed in to Snip. Confirm with the user first; to pause every ending instead, use update_link with disabled true.
The short link (https://snip.link/abc123), its ending (abc123) or its id.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Tool list last changed Oct 25, 2026.
Permanently deletes one of the user's Snip links and its click history; its current and previous short URLs stop working within a minute and all of its endings are free again. Needs the user signed in to Snip. Confirm with the user first; to pause every ending instead, use update_link with disabled true.
| Argument | Type | Description |
|---|---|---|
| link* | string | The short link (https://snip.link/abc123), its ending (abc123) or its id. |
{
"type": "object",
"required": [
"link"
],
"properties": {
"link": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "The short link (https://snip.link/abc123), its ending (abc123) or its id."
}
},
"additionalProperties": false
}Put a file on the web and get a short snip.link link to it, free. Send text (a note, Markdown, CSV, JSON, code) as `content`, or any other file (a PDF, a picture, a document) as `content_base64`, with its file name. The link opens a page that shows the file with a download button and a QR code; the link with the file's extension is the file itself, and other endings convert it (.pdf, .png, .md, .txt, .html, .csv, .json). Use this when the user wants to share, send, publish, host or link to a file, or wants something you wrote available as a link or a QR code. Files shared without an account stay up for 30 days unless the user keeps them with a free account.
| Argument | Type | Description |
|---|---|---|
| name* | string | The file name with its extension, which decides how it is shown: notes.md, prices.csv, photo.png. |
| title | string | A title for the user's dashboard (signed in only). |
| content | string | The file's text, for text files. |
| content_base64 | string | The file's bytes in base64, for anything else. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"description": "The file name with its extension, which decides how it is shown: notes.md, prices.csv, photo.png."
},
"title": {
"type": "string",
"maxLength": 200,
"description": "A title for the user's dashboard (signed in only)."
},
"content": {
"type": "string",
"description": "The file's text, for text files."
},
"content_base64": {
"type": "string",
"description": "The file's bytes in base64, for anything else."
}
},
"additionalProperties": false
}Clicks and QR scans across every link in the user's Snip account: totals, by day, the busiest links, and the top countries, referring sites and devices. Needs the user signed in to Snip. Use this for questions like "how are my links doing" or "which link got the most scans this week".
| Argument | Type | Description |
|---|---|---|
| days | integer | How many days back, up to the plan's limit (30 on Free, a year on Pro). Default 30. |
| links | integer | How many of the busiest links to list. Default 10. |
{
"type": "object",
"properties": {
"days": {
"type": "integer",
"maximum": 366,
"minimum": 1,
"description": "How many days back, up to the plan's limit (30 on Free, a year on Pro). Default 30."
},
"links": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many of the busiest links to list. Default 10."
}
},
"additionalProperties": false
}Clicks and QR scans for one of the user's own Snip links: totals, by day, by hour of the day on plans with time-of-day analytics, and the top countries, referring sites and devices. Needs the user signed in to Snip (the account endpoint or an API key). Pass the short link, its ending or its id. For every link at once, use get_account_stats.
| Argument | Type | Description |
|---|---|---|
| days | integer | How many days back, up to the plan's limit (30 on Free, a year on Pro). Default 30. |
| link* | string | The short link (https://snip.link/abc123), its ending (abc123) or its id. |
{
"type": "object",
"required": [
"link"
],
"properties": {
"days": {
"type": "integer",
"maximum": 366,
"minimum": 1,
"description": "How many days back, up to the plan's limit (30 on Free, a year on Pro). Default 30."
},
"link": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "The short link (https://snip.link/abc123), its ending (abc123) or its id."
}
},
"additionalProperties": false
}The user's Snip collections: links grouped by hand, each with how many links it holds and its public page (snip.link/c/<address>, one button per live link) when that is on. Needs the user signed in to Snip. Change one with save_collection.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}The user's own domains (go.yourbrand.com) that their Snip links can use, with whether each is live. Pass a live one as domain to shorten_link. Needs the user signed in to Snip; adding a domain happens in the dashboard (it needs a DNS record).
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}The user's Snip links, newest first, with their destinations and click counts. Needs the user signed in to Snip. Pass a search to match an ending, a destination or a title.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return. Default 20. |
| search | string | Text to match against the ending, destination and title. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many to return. Default 20."
},
"search": {
"type": "string",
"maxLength": 200,
"description": "Text to match against the ending, destination and title."
}
},
"additionalProperties": false
}Make a static QR code for a link, text, Wi-Fi network, contact card, email, phone number or SMS, free and with no account. Returns a PNG and an SVG download link that the user can open, save or print; show the PNG link to the user. Static codes hold the content in the pattern, so they never expire and keep working without Snip. Use this whenever the user asks for a QR code.
| Argument | Type | Description |
|---|---|---|
| bg | string | Background colour, #rrggbb. Default #ffffff. |
| fg | string | Dark colour, #rrggbb, for example #111111. Default #111111. |
| ecc | string | Error correction: L 7%, M 15% (default), Q 25%, H 30% of the code can be damaged and still scan. |
| data* | string | What the QR code holds: a web address, plain text, a WIFI:T:WPA;S:<name>;P:<password>;; string, a vCard, mailto:, tel: or sms:. For a link the user may want to change or track later, call shorten_link instead and use its QR code. |
| style | string | Dot shape. Default rounded. |
{
"type": "object",
"required": [
"data"
],
"properties": {
"bg": {
"type": "string",
"maxLength": 7,
"description": "Background colour, #rrggbb. Default #ffffff."
},
"fg": {
"type": "string",
"maxLength": 7,
"description": "Dark colour, #rrggbb, for example #111111. Default #111111."
},
"ecc": {
"enum": [
"L",
"M",
"Q",
"H"
],
"type": "string",
"description": "Error correction: L 7%, M 15% (default), Q 25%, H 30% of the code can be damaged and still scan."
},
"data": {
"type": "string",
"maxLength": 1500,
"minLength": 1,
"description": "What the QR code holds: a web address, plain text, a WIFI:T:WPA;S:<name>;P:<password>;; string, a vCard, mailto:, tel: or sms:. For a link the user may want to change or track later, call shorten_link instead and use its QR code."
},
"style": {
"enum": [
"rounded",
"square"
],
"type": "string",
"description": "Dot shape. Default rounded."
}
},
"additionalProperties": false
}Creates a collection of the user's Snip links, or changes one (pass collection, its id from list_collections): its name, the line under it, its links in order, and whether it has a public page at snip.link/c/<address> that shows one button per live link, link-in-bio style. links replaces the collection's links in that order; leave it out to keep them. Free on every plan; the links themselves never change. Needs the user signed in to Snip.
| Argument | Type | Description |
|---|---|---|
| name | string | The collection's name, shown on its page. |
| slug | string | The page's address after /c/: lowercase letters, digits and dashes. Left out, one is made from the name. |
| links | array | The links in order, each by short URL, ending or id (see list_links). Replaces the collection's links. |
| public | boolean | true switches the public page on, false off. Off by default. |
| collection | string | The id of the collection to change. Leave it out to create one. |
| description | string | null | One line under the name on the page. null removes it. |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The collection's name, shown on its page."
},
"slug": {
"type": "string",
"maxLength": 40,
"minLength": 3,
"description": "The page's address after /c/: lowercase letters, digits and dashes. Left out, one is made from the name."
},
"links": {
"type": "array",
"items": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"maxItems": 200,
"description": "The links in order, each by short URL, ending or id (see list_links). Replaces the collection's links."
},
"public": {
"type": "boolean",
"description": "true switches the public page on, false off. Off by default."
},
"collection": {
"type": "string",
"maxLength": 64,
"description": "The id of the collection to change. Leave it out to create one."
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 300,
"description": "One line under the name on the page. null removes it."
}
},
"additionalProperties": false
}Read any web page as clean Markdown and keep a copy that stays the same even if the page changes or disappears. Returns the page's text in the answer, plus a short snip.link link and QR code for it, and the saved copy as Markdown, plain text, a full-page screenshot, a PDF and a web archive (each at the short link with an ending: .md, .txt, .jpg, .pdf, .mhtml). Free, no account needed. Use this when the user wants to read, quote, cite, summarize, archive or share a web page, or asks for a page as Markdown, text, a screenshot or a PDF. A page anyone saved in the last hour comes back at once.
| Argument | Type | Description |
|---|---|---|
| url* | string | The http or https page to save. |
| fresh | boolean | Load the page again even if it was saved in the last hour. Default false. |
| formats | array | Only these formats (faster for just the text). Default: all of them. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The http or https page to save."
},
"fresh": {
"type": "boolean",
"description": "Load the page again even if it was saved in the last hour. Default false."
},
"formats": {
"type": "array",
"items": {
"enum": [
"markdown",
"text",
"screenshot",
"pdf",
"archive"
],
"type": "string"
},
"description": "Only these formats (faster for just the text). Default: all of them."
}
},
"additionalProperties": false
}Turn a long web address into a short snip.link link, free, and get a QR code for it. Use this when the user wants a short link, a link they can change after printing, or click and scan counts. When the user is not signed in to Snip the link works at once and the answer includes a claim link the user can open to keep it in a free Snip account and see its clicks. When they are signed in (the account endpoint or an API key) the link is saved to their account, and a custom ending (snip.link/your-ending) is allowed.
| Argument | Type | Description |
|---|---|---|
| url* | string | The http or https address to shorten. |
| title | string | A name for the link in the user's dashboard. Needs the user signed in to Snip. |
| domain | string | One of the user's own live domains (go.yourbrand.com, see list_domains) to put the link on instead of snip.link. Needs the user signed in on a plan with own domains. |
| ending | string | Custom ending for snip.link/<ending>: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Free with a Snip account. Omit or send an empty string for a random code. |
| routes | array | Rules that send some visits elsewhere, tried in order; the first match wins and everyone else goes to url. Free with a Snip account. Each rule: conditions joined by when (all or any) and its own url. Condition kinds: device (values mobile, tablet, desktop), os (ios, android, windows, macos, linux, chromeos), browser (chrome, safari, firefox, edge, samsung, opera, instagram, facebook, tiktok), country (ISO codes like US), region (US-CA), language (en, es), time (from and to as HH:MM, tz an IANA zone or "visitor"), weekday (values 0 Sunday to 6, tz), dates (from and/or to as 2026-11-01 or 2026-11-01T09:00, tz), via (value qr or link), referrer (sites like instagram.com), query (param, optional value), split (percent 1 to 99; neighbouring splits share visitors, so 50 then 50 is an A/B test). Any condition but split takes negate true. A rule with action off and no url switches the link off for matching visits instead (a time window, a country): they see a "not available right now" page and are not counted. An empty list removes every rule. |
Changes the ending, destination, title, rules, schedule (go-live time, expiry, click limit) or link preview (the title, line and picture chat apps and social sites show when the link is pasted) of one of the user's Snip links, switches it off and on, or watches its page for changes. Custom endings and renaming are free with an account. Previous short URLs and printed QR codes keep working, follow the latest destination and share the same analytics until the link is disabled or deleted. A link keeps up to 20 previous endings. Needs the user signed in to Snip. Pass only the fields to change.
| Argument | Type | Description |
|---|---|---|
| url | string | The new http or https destination. |
| link* | string | The short link (https://snip.link/abc123), its ending (abc123) or its id. |
| title | string | A new name for the dashboard. |
| track | boolean | false: only count visits, without recording when, where or on what device. true: record them. |
| watch | string | Watch the destination page: Snip saves a fresh copy daily or weekly and emails the user what was added and what went when its words change. off stops. A paid plan feature; the error says which plan has it. |
| ending | string | The new ending: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Reusing this link's previous ending or changing only its case does not use another previous-ending slot. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The http or https address to shorten."
},
"title": {
"type": "string",
"maxLength": 200,
"description": "A name for the link in the user's dashboard. Needs the user signed in to Snip."
},
"domain": {
"type": "string",
"maxLength": 253,
"description": "One of the user's own live domains (go.yourbrand.com, see list_domains) to put the link on instead of snip.link. Needs the user signed in on a plan with own domains."
},
"ending": {
"type": "string",
"maxLength": 40,
"minLength": 0,
"description": "Custom ending for snip.link/<ending>: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Free with a Snip account. Omit or send an empty string for a random code."
},
"routes": {
"type": "array",
"items": {
"type": "object",
"required": [
"conditions"
],
"properties": {
"url": {
"type": "string",
"description": "Where a matching visit goes. Leave out when action is off."
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A label for the dashboard."
},
"when": {
"enum": [
"all",
"any"
],
"type": "string",
"description": "all (default): every condition. any: one is enough."
},
"action": {
"enum": [
"redirect",
"off"
],
"type": "string",
"description": "redirect (default): send the visit to url. off: switch the link off for it."
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind"
],
"properties": {
"to": {
"type": "string"
},
"tz": {
"type": "string"
},
"from": {
"type": "string"
},
"kind": {
"enum": [
"device",
"os",
"browser",
"country",
"region",
"language",
"time",
"weekday",
"dates",
"via",
"referrer",
"query",
"split"
],
"type": "string"
},
"param": {
"type": "string"
},
"value": {
"type": [
"string",
"null"
]
},
"negate": {
"type": "boolean"
},
"values": {
"type": "array",
"items": {
"type": [
"string",
"number"
]
}
},
"percent": {
"type": "integer",
"description": "split: a whole percent from 1 to 99."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "Rules that send some visits elsewhere, tried in order; the first match wins and everyone else goes to url. Free with a Snip account. Each rule: conditions joined by when (all or any) and its own url. Condition kinds: device (values mobile, tablet, desktop), os (ios, android, windows, macos, linux, chromeos), browser (chrome, safari, firefox, edge, samsung, opera, instagram, facebook, tiktok), country (ISO codes like US), region (US-CA), language (en, es), time (from and to as HH:MM, tz an IANA zone or \"visitor\"), weekday (values 0 Sunday to 6, tz), dates (from and/or to as 2026-11-01 or 2026-11-01T09:00, tz), via (value qr or link), referrer (sites like instagram.com), query (param, optional value), split (percent 1 to 99; neighbouring splits share visitors, so 50 then 50 is an A/B test). Any condition but split takes negate true. A rule with action off and no url switches the link off for matching visits instead (a time window, a country): they see a \"not available right now\" page and are not counted. An empty list removes every rule."
}
},
"additionalProperties": false
}| routes |
| array |
| Rules that send some visits elsewhere, tried in order; the first match wins and everyone else goes to url. Free with a Snip account. Each rule: conditions joined by when (all or any) and its own url. Condition kinds: device (values mobile, tablet, desktop), os (ios, android, windows, macos, linux, chromeos), browser (chrome, safari, firefox, edge, samsung, opera, instagram, facebook, tiktok), country (ISO codes like US), region (US-CA), language (en, es), time (from and to as HH:MM, tz an IANA zone or "visitor"), weekday (values 0 Sunday to 6, tz), dates (from and/or to as 2026-11-01 or 2026-11-01T09:00, tz), via (value qr or link), referrer (sites like instagram.com), query (param, optional value), split (percent 1 to 99; neighbouring splits share visitors, so 50 then 50 is an A/B test). Any condition but split takes negate true. A rule with action off and no url switches the link off for matching visits instead (a time window, a country): they see a "not available right now" page and are not counted. An empty list removes every rule. |
| preview | object | null | The link's own preview card for chats and posts. Any field left out shows the page's own. image is an https picture address or screenshot (the page's first screen). null removes it. Free on every plan. |
| disabled | boolean | True switches the link off (it answers 404); false switches it back on. |
| starts_at | string | null | When the link goes live, as an ISO date and time (2026-11-01T09:00:00Z). Before it, visits see a not live yet page and are not counted. null: live now. |
| expires_at | string | null | When the link stops working, as an ISO date and time. After it, visits see an expired page. null: never. |
| max_clicks | integer | null | Stop the link after this many counted visits in total (bots and repeat taps within a minute are not counted). null: no limit. |
{
"type": "object",
"required": [
"link"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"minLength": 1,
"description": "The new http or https destination."
},
"link": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "The short link (https://snip.link/abc123), its ending (abc123) or its id."
},
"title": {
"type": "string",
"maxLength": 200,
"description": "A new name for the dashboard."
},
"track": {
"type": "boolean",
"description": "false: only count visits, without recording when, where or on what device. true: record them."
},
"watch": {
"enum": [
"daily",
"weekly",
"off"
],
"type": "string",
"description": "Watch the destination page: Snip saves a fresh copy daily or weekly and emails the user what was added and what went when its words change. off stops. A paid plan feature; the error says which plan has it."
},
"ending": {
"type": "string",
"maxLength": 40,
"minLength": 3,
"description": "The new ending: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Reusing this link's previous ending or changing only its case does not use another previous-ending slot."
},
"routes": {
"type": "array",
"items": {
"type": "object",
"required": [
"conditions"
],
"properties": {
"url": {
"type": "string",
"description": "Where a matching visit goes. Leave out when action is off."
},
"name": {
"type": "string",
"maxLength": 60,
"description": "A label for the dashboard."
},
"when": {
"enum": [
"all",
"any"
],
"type": "string",
"description": "all (default): every condition. any: one is enough."
},
"action": {
"enum": [
"redirect",
"off"
],
"type": "string",
"description": "redirect (default): send the visit to url. off: switch the link off for it."
},
"conditions": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind"
],
"properties": {
"to": {
"type": "string"
},
"tz": {
"type": "string"
},
"from": {
"type": "string"
},
"kind": {
"enum": [
"device",
"os",
"browser",
"country",
"region",
"language",
"time",
"weekday",
"dates",
"via",
"referrer",
"query",
"split"
],
"type": "string"
},
"param": {
"type": "string"
},
"value": {
"type": [
"string",
"null"
]
},
"negate": {
"type": "boolean"
},
"values": {
"type": "array",
"items": {
"type": [
"string",
"number"
]
}
},
"percent": {
"type": "integer",
"description": "split: a whole percent from 1 to 99."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "Rules that send some visits elsewhere, tried in order; the first match wins and everyone else goes to url. Free with a Snip account. Each rule: conditions joined by when (all or any) and its own url. Condition kinds: device (values mobile, tablet, desktop), os (ios, android, windows, macos, linux, chromeos), browser (chrome, safari, firefox, edge, samsung, opera, instagram, facebook, tiktok), country (ISO codes like US), region (US-CA), language (en, es), time (from and to as HH:MM, tz an IANA zone or \"visitor\"), weekday (values 0 Sunday to 6, tz), dates (from and/or to as 2026-11-01 or 2026-11-01T09:00, tz), via (value qr or link), referrer (sites like instagram.com), query (param, optional value), split (percent 1 to 99; neighbouring splits share visitors, so 50 then 50 is an A/B test). Any condition but split takes negate true. A rule with action off and no url switches the link off for matching visits instead (a time window, a country): they see a \"not available right now\" page and are not counted. An empty list removes every rule."
},
"preview": {
"type": [
"object",
"null"
],
"properties": {
"image": {
"type": "string",
"maxLength": 2048
},
"title": {
"type": "string",
"maxLength": 120
},
"description": {
"type": "string",
"maxLength": 300
}
},
"description": "The link's own preview card for chats and posts. Any field left out shows the page's own. image is an https picture address or screenshot (the page's first screen). null removes it. Free on every plan.",
"additionalProperties": false
},
"disabled": {
"type": "boolean",
"description": "True switches the link off (it answers 404); false switches it back on."
},
"starts_at": {
"type": [
"string",
"null"
],
"description": "When the link goes live, as an ISO date and time (2026-11-01T09:00:00Z). Before it, visits see a not live yet page and are not counted. null: live now."
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "When the link stops working, as an ISO date and time. After it, visits see an expired page. null: never."
},
"max_clicks": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Stop the link after this many counted visits in total (bots and repeat taps within a minute are not counted). null: no limit."
}
},
"additionalProperties": false
}