Cuttly MCP by usefulapi
Shorten links with Cuttly, read click stats, and edit, expire, redirect or delete short links.
Should I use this
Quality & Safety
Findings (7)
- HIGH
- MEDIUMin cuttly_shorten_link
- MEDIUMin cuttly_get_link_stats
- MEDIUMin cuttly_update_link
- MEDIUMin cuttly_set_link_expiration
- MEDIUMin cuttly_set_device_redirect
- MEDIUMin cuttly_delete_link
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"cuttly": {
"url": "https://cuttly.usefulapi.io/mcp"
}
}
}Remote endpoints
https://cuttly.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟡cuttly_shorten_link(url, alias, use_branded_domain, public_stats)
WRITE: create a Cuttly short link for a long URL, optionally with a custom alias (the part after the slash). Returns the short link, the full link and the page title. It counts against the monthly link limit of the plan. Cuttly rate limit: Free 3 calls per 60 seconds, Starter 6, Single 60. The call is sent once and never retried. GET https://cutt.ly/api/api.php?short=...
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"description": "The long URL to shorten (full http or https URL)."
},
"alias": {
"description": "Custom alias (back-half), e.g. 'spring-sale'. Fails if it is taken.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"use_branded_domain": {
"description": "Use the active branded domain of the account instead of cutt.ly (any paid plan).",
"type": "boolean"
},
"public_stats": {
"description": "Make the click statistics of this link readable through the API without the owner's key (Single plan and up).",
"type": "boolean"
}
},
"required": [
"url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cuttly_get_link_stats(link, date_from, date_to)
Click statistics of one short link: total clicks, clicks by source (Facebook, Twitter, LinkedIn, other, bots), top referrers, countries, device types, operating systems, browsers, device brands and languages. The date range filter needs the Team plan or higher. Counts as one API call (Free plan 3 per 60 seconds). GET https://cutt.ly/api/api.php?stats=...
Input Schema
{
"type": "object",
"properties": {
"link": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"description": "The Cuttly short link, e.g. https://cutt.ly/abc123 (or a link on your branded domain)."
},
"date_from": {
"description": "Start of the range (Team plan and up).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"date_to": {
"description": "End of the range (Team plan and up). May be used alone.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
}
},
"required": [
"link"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴cuttly_update_link(link, new_alias, destination_url, title, tag, ...)
WRITE: change a short link: its alias, destination URL, title, tag or unique-click window. Send only what you want to change. Changing the alias makes the old short link stop working; changing the destination redirects every visitor to the new URL at once. Link editing needs the Single plan or higher. Cuttly sends no previous values back, so ask the user before you change a live link. The call is sent once and never retried. GET https://cutt.ly/api/api.php?edit=...
Input Schema
{
"type": "object",
"properties": {
"link": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"description": "The Cuttly short link, e.g. https://cutt.ly/abc123 (or a link on your branded domain)."
},
"new_alias": {
"description": "New alias. The old short link stops working. Fails if the alias is taken.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"destination_url": {
"description": "New destination URL the short link redirects to.",
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"title": {
"description": "New link title.",
"type": "string",
"minLength": 1,
"maxLength": 250
},
"tag": {
"description": "A tag to add to the link.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"unique_clicks_minutes": {
"description": "Unique-click counting: 0 = off, 1 = 15-minute window (Single plan), 15-1440 = custom window in minutes (Team plan and up).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"link"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴cuttly_set_link_expiration(link, mode, clicks, date, redirect_url, ...)
WRITE: set or remove the expiration of a short link. The link expires after a number of clicks or on a date, and can then redirect to another URL. mode 'none' removes an existing expiration. Needs the Single plan or higher. The call is sent once and never retried. GET https://cutt.ly/api/api.php?edit=...&expire=...
Input Schema
{
"type": "object",
"properties": {
"link": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"description": "The Cuttly short link, e.g. https://cutt.ly/abc123 (or a link on your branded domain)."
},
"mode": {
"type": "string",
"enum": [
"clicks",
"date",
"none"
],
"description": "'clicks' = expire after `clicks` clicks, 'date' = expire on `date`, 'none' = remove the expiration."
},
"clicks": {
"description": "Click threshold (mode 'clicks').",
"type": "integer",
"minimum": 1,
"maximum": 1000000000
},
"date": {
"description": "Expiration date (mode 'date').",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"redirect_url": {
"description": "Where visitors go after the link expired.",
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"count_unique_clicks": {
"description": "Count only unique clicks toward a click threshold.",
"type": "boolean"
}
},
"required": [
"link",
"mode"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴cuttly_set_device_redirect(link, platform, destination, remove)
WRITE: send visitors on one device type to another destination (an app store page or a deep link): Android, iOS or Windows Mobile. platform 'redirect' sets the destination for all other devices. Set `remove: true` instead of a destination to delete the rule. Needs the Single plan or higher. The call is sent once and never retried. GET https://cutt.ly/api/api.php?edit=...&mobile=...
Input Schema
{
"type": "object",
"properties": {
"link": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"description": "The Cuttly short link, e.g. https://cutt.ly/abc123 (or a link on your branded domain)."
},
"platform": {
"type": "string",
"enum": [
"android",
"ios",
"windowsMobile",
"redirect"
],
"description": "Device type. 'redirect' = every other device."
},
"destination": {
"description": "URL or deep link for that device type.",
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"remove": {
"description": "true = remove the rule of this device type (then do not pass a destination).",
"type": "boolean"
}
},
"required": [
"link",
"platform"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴cuttly_delete_link(link)
WRITE, IRREVERSIBLE: permanently delete a short link and its statistics. Anyone who opens the short link afterwards gets an error, and Cuttly cannot restore it. Ask the user to confirm the exact link before you call this. Needs the Single plan or higher. The call is sent once and never retried. GET https://cutt.ly/api/api.php?edit=...&delete=1
Input Schema
{
"type": "object",
"properties": {
"link": {
"type": "string",
"minLength": 1,
"maxLength": 2048,
"description": "The Cuttly short link, e.g. https://cutt.ly/abc123 (or a link on your branded domain)."
}
},
"required": [
"link"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence