Skip to main content
Glama

Snip

Shorten a link

shorten_link

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, click and scan counts, or a YouTube, Spotify or Amazon link that opens the app when tapped inside Instagram, TikTok or Facebook (every Snip.link link does that on its own). When the user is not signed in to Snip.link the link works at once and the answer includes a claim link the user can open to keep it in a free Snip.link 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 (go.snip.link/your-ending) is allowed.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "url": "<url>"
    },
    "name": "shorten_link"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlYesThe http or https address to shorten.
titleNoA name for the link in the user's dashboard. Needs the user signed in to Snip.link.
trackNoOverride the default for visit tracking.
domainNoOne 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.
endingNoCustom ending for go.snip.link/<ending>, also available at snip.link/r/<ending>: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Free with a Snip.link account. Omit or send an empty string for a random code.
routesNoRules that send some visits elsewhere, tried in order; the first match wins and everyone else goes to url. Free with a Snip.link 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.
presetsNoOwned Library ids, one per kind. Omit for account defaults; [] skips Library defaults. Explicit link settings win.
previewNoSocial preview; null clears a Library preview.
qr_styleNoQR settings; null clears a Library QR style.
snapshotsNo
stats_publicNoWhether aggregate stats are public. Explicit false overrides a saved template.
forward_queryNoOverride query-parameter forwarding.
expires_in_daysNoExpiry from creation; null means no expiry.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / ending / description
      Previous value: -"Custom ending for snip.link/<ending>: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Free with a Snip.link account. Omit or send an empty string for a random code."New value: +"Custom ending for go.snip.link/<ending>, also available at snip.link/r/<ending>: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Free with a Snip.link account. Omit or send an empty string for a random code."
  2. Changed3 schema fields changed
    • changedInput schema / properties / ending / description
      Previous value: -"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."New value: +"Custom ending for snip.link/<ending>: 3 to 40 ASCII letters, digits, dashes or underscores, with no spaces. Free with a Snip.link account. Omit or send an empty string for a random code."
    • changedInput schema / properties / routes / description
      Previous value: -"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."New value: +"Rules that send some visits elsewhere, tried in order; the first match wins and everyone else goes to url. Free with a Snip.link 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."
    • changedInput schema / properties / title / description
      Previous value: -"A name for the link in the user's dashboard. Needs the user signed in to Snip."New value: +"A name for the link in the user's dashboard. Needs the user signed in to Snip.link."
  3. Changed8 schema fields changed
    • addedInput schema / properties / expires_in_days
      Added value: +{
      +  "description": "Expiry from creation; null means no expiry.",
      +  "minimum": 1,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / forward_query
      Added value: +{
      +  "description": "Override query-parameter forwarding.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / presets
      Added value: +{
      +  "description": "Owned Library ids, one per kind. Omit for account defaults; [] skips Library defaults. Explicit link settings win.",
      +  "items": {
      +    "maxLength": 64,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 5,
      +  "type": "array"
      +}
    • addedInput schema / properties / preview
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Social preview; null clears a Library preview.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / qr_style
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "QR settings; null clears a Library QR style.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / snapshots
      Added value: +{
      +  "enum": [
      +    "public",
      +    "private",
      +    "off"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / stats_public
      Added value: +{
      +  "description": "Whether aggregate stats are public. Explicit false overrides a saved template.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / track
      Added value: +{
      +  "description": "Override the default for visit tracking.",
      +  "type": "boolean"
      +}
  4. Changed4 schema fields changed
    • changedInput schema / properties / routes / description
      Previous value: -"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. An empty list removes every rule."New value: +"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."
    • addedInput schema / properties / routes / items / properties / action
      Added value: +{
      +  "description": "redirect (default): send the visit to url. off: switch the link off for it.",
      +  "enum": [
      +    "redirect",
      +    "off"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / routes / items / properties / url / description
      Previous value: -"Where a matching visit goes."New value: +"Where a matching visit goes. Leave out when action is off."
    • changedInput schema / properties / routes / items / required
      Previous value: -[
      -  "conditions",
      -  "url"
      -]New value: +[
      +  "conditions"
      +]
  5. Changed1 schema field changed
    • addedInput schema / properties / routes
      Added value: +{
      +  "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. An empty list removes every rule.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "conditions": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "from": {
      +              "type": "string"
      +            },
      +            "kind": {
      +              "enum": [
      +                "device",
      +                "os",
      +                "browser",
      +                "country",
      +                "region",
      +                "language",
      +                "time",
      +                "weekday",
      +                "dates",
      +                "via",
      +                "referrer",
      +                "query",
      +                "split"
      +              ],
      +              "type": "string"
      +            },
      +            "negate": {
      +              "type": "boolean"
      +            },
      +            "param": {
      +              "type": "string"
      +            },
      +            "percent": {
      +              "description": "split: a whole percent from 1 to 99.",
      +              "type": "integer"
      +            },
      +            "to": {
      +              "type": "string"
      +            },
      +            "tz": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "values": {
      +              "items": {
      +                "type": [
      +                  "string",
      +                  "number"
      +                ]
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "kind"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 10,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "name": {
      +        "description": "A label for the dashboard.",
      +        "maxLength": 60,
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "Where a matching visit goes.",
      +        "type": "string"
      +      },
      +      "when": {
      +        "description": "all (default): every condition. any: one is enough.",
      +        "enum": [
      +          "all",
      +          "any"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "conditions",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
  6. Changed2 schema fields changed
    • changedInput schema / properties / ending / description
      Previous value: -"Custom ending for snip.link/<ending>: letters, digits, dashes, underscores. Needs the user signed in to Snip."New value: +"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."
    • changedInput schema / properties / ending / minLength
      Previous value: -3New value: +0
  7. First observed

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description explains important behavioral modes: unsigned users get a working link plus a claim link, signed-in users get the link saved to their account, and custom endings are available when signed in. It does not cover error handling, duplicate-link behavior, or rate limits, but it adds substantial context beyond readOnlyHint, openWorldHint, and idempotentHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, and most sentences earn their place by explaining account states and use cases. The paragraph is somewhat dense and includes parenthetical asides, but it remains readable and is reasonably sized for a 13-parameter creation tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex creation tool with no output schema, the description covers the key behavioral context an agent needs: what is created, how signed-in versus unsigned behavior differs, and what the user can do with the result. It leaves detailed return-shape and error semantics implicit, but the rich schema covers the parameters well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 92%, so the input schema already carries most parameter meaning. The description adds useful account-state context for custom endings and signed-in saving, but it does not add syntax or per-parameter detail beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: turning a long web address into a short snip.link link, with QR code generation and app-opening behavior. It is clear overall, but it does not explicitly distinguish this creation tool from siblings like update_link for existing links or make_qr_code for QR-only requests, despite mentioning QR codes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives strong when-to-use guidance: short links, editable links, click and scan counts, or app-opening links for Instagram, TikTok, and Facebook. It does not name explicit alternatives or exclusion cases, such as using make_qr_code when the user only wants a QR code, so it falls short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources