Skip to main content
Glama

Snip

Update a link

update_link
Idempotent

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.link 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.link. Pass only the fields to change.

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": {
      "link": "<link>"
    },
    "name": "update_link"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlNoThe new http or https destination.
linkYesThe full short URL (https://go.snip.link/abc123 or https://snip.link/r/abc123), its ending (abc123) or its id. Full URLs are scoped to their host; they never select a same-ending link on another domain.
titleNoA new name for the dashboard.
trackNofalse: only count visits, without recording when, where or on what device. true: record them.
watchNoWatch the destination page: Snip.link 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.
endingNoThe 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.
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.
previewNoThe 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.
disabledNoTrue switches the link off (it answers 404); false switches it back on.
starts_atNoWhen 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_atNoWhen the link stops working, as an ISO date and time. After it, visits see an expired page. null: never.
max_clicksNoStop the link after this many counted visits in total (bots and repeat taps within a minute are not counted). null: no limit.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / link / description
      Previous value: -"The short link (https://snip.link/abc123), its ending (abc123) or its id."New value: +"The full short URL (https://go.snip.link/abc123 or https://snip.link/r/abc123), its ending (abc123) or its id. Full URLs are scoped to their host; they never select a same-ending link on another domain."
    • changedInput schema / properties / link / maxLength
      Previous value: -120New value: +2048
  2. Changed2 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. 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 / watch / description
      Previous value: -"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."New value: +"Watch the destination page: Snip.link 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."
  3. Changed1 schema field changed
    • addedInput schema / properties / preview
      Added value: +{
      +  "additionalProperties": false,
      +  "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.",
      +  "properties": {
      +    "description": {
      +      "maxLength": 300,
      +      "type": "string"
      +    },
      +    "image": {
      +      "maxLength": 2048,
      +      "type": "string"
      +    },
      +    "title": {
      +      "maxLength": 120,
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  4. Changed8 schema fields changed
    • addedInput schema / properties / expires_at
      Added value: +{
      +  "description": "When the link stops working, as an ISO date and time. After it, visits see an expired page. null: never.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / max_clicks
      Added value: +{
      +  "description": "Stop the link after this many counted visits in total (bots and repeat taps within a minute are not counted). null: no limit.",
      +  "minimum": 1,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • 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"
      +]
    • addedInput schema / properties / starts_at
      Added value: +{
      +  "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.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / track
      Added value: +{
      +  "description": "false: only count visits, without recording when, where or on what device. true: record them.",
      +  "type": "boolean"
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / watch
      Added value: +{
      +  "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.",
      +  "enum": [
      +    "daily",
      +    "weekly",
      +    "off"
      +  ],
      +  "type": "string"
      +}
  6. 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"
      +}
  7. Changed1 schema field changed
    • addedInput schema / properties / ending
      Added value: +{
      +  "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.",
      +  "maxLength": 40,
      +  "minLength": 3,
      +  "type": "string"
      +}
  8. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (which already declare non-read-only, idempotent, non-destructive), the description discloses real side effects: previous short URLs and printed QR codes keep resolving to the newest destination and share analytics until disable/delete, and only 20 previous endings are retained. It also flags plan gating for custom endings and page watching, so the agent knows an error may be a billing limit rather than a bad request.

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?

Front-loaded with the action and its mutable fields, then the side-effect notes, then auth and patch guidance — a sensible order. The opening sentence is a long laundry list and "Custom endings and renaming are free with an account" reads slightly promotional, but both carry plan-relevant information.

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

Completeness5/5

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

For a 12-parameter mutation with no output schema, the description covers the pieces the schema cannot: authentication requirement, partial-update semantics, and the downstream consequences of changing an ending. Nothing an agent needs in order to invoke it safely is missing.

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 100% and the property descriptions are unusually rich, so the schema carries the parameter burden. The description adds only the patch-semantics instruction and the 20-previous-ending cap that constrains `ending`; it restates the field groups in prose rather than adding syntax or format detail beyond the schema.

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

Purpose5/5

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

The first sentence names the verb ("Changes") and enumerates the exact mutable surfaces — ending, destination, title, rules, schedule, preview, disabled state, watch — plus the resource ("one of the user's Snip.link links"). That is enough to distinguish it from delete_link, list_links, and shorten_link without opening a schema.

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?

"Pass only the fields to change" establishes patch semantics, and "Needs the user signed in to Snip.link" states a prerequisite. It stops short of explicitly routing the agent away from siblings (e.g. use shorten_link to create, delete_link to remove), so the when-not is implied rather than stated.

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