dub

Short links with click, lead and sale analytics, customers, tags and the partner programme.

Should I use this

Quality & Safety

A
Description quality
94%
Schema completeness
94%
Naming quality
79%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'dub_update_link' description lacks action verbin dub_update_link
  • LOWTool 'dub_approve_partner_application' name length outside 3-30 rangein dub_approve_partner_application

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,671Tokens (tool definitions)
~1.4 KBTypical response size
Significant attention impact (2.87% of 128k context)

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": {
    "dub": {
      "url": "https://dub.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://dub.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (22)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢dub_list_links(domain, search, tagNames, folderId, showArchived, ...)

List short links, filtered by domain, tag, folder or a text search. Dub: GET /links.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "description": "Only links on this short domain.",
      "type": "string"
    },
    "search": {
      "description": "Free-text search over the key, URL and title.",
      "type": "string"
    },
    "tagNames": {
      "description": "Only links carrying these tag names.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "folderId": {
      "description": "Only links in this folder.",
      "type": "string"
    },
    "showArchived": {
      "description": "Include archived links.",
      "type": "boolean"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_get_link(linkId, externalId, domain, key)

Fetch a single link by its id, its external id, or its domain plus key. Dub: GET /links/info.

Input Schema

{
  "type": "object",
  "properties": {
    "linkId": {
      "description": "The link's Dub id.",
      "type": "string"
    },
    "externalId": {
      "description": "Your own id for the link.",
      "type": "string"
    },
    "domain": {
      "description": "The short domain, used with key.",
      "type": "string"
    },
    "key": {
      "description": "The short key, used with domain.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_count_links(domain, search, folderId, groupBy)

Count links matching a filter, optionally grouped by domain, tag or folder. Cheaper than listing when you only need totals. Dub: GET /links/count.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "description": "Only links on this short domain.",
      "type": "string"
    },
    "search": {
      "description": "Free-text search.",
      "type": "string"
    },
    "folderId": {
      "description": "Only links in this folder.",
      "type": "string"
    },
    "groupBy": {
      "description": "Return counts grouped by this dimension.",
      "type": "string",
      "enum": [
        "domain",
        "tagId",
        "folderId",
        "userId"
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_get_analytics(event, groupBy, linkId, domain, key, ...)

Get aggregated click, lead and sale analytics, grouped by a dimension such as country, device, referer or top links. The main reporting read. Dub: GET /analytics.

Input Schema

{
  "type": "object",
  "properties": {
    "event": {
      "description": "Which event type to report. Defaults to clicks.",
      "type": "string",
      "enum": [
        "clicks",
        "leads",
        "sales",
        "composite"
      ]
    },
    "groupBy": {
      "description": "Dimension to group by, e.g. count, timeseries, top_links, countries, cities, devices, browsers, os, referers, utm_sources.",
      "type": "string"
    },
    "linkId": {
      "description": "Only this link.",
      "type": "string"
    },
    "domain": {
      "description": "Only links on this domain.",
      "type": "string"
    },
    "key": {
      "description": "The short key, used with domain.",
      "type": "string"
    },
    "interval": {
      "description": "Relative time window. Use start/end instead for an absolute range.",
      "type": "string",
      "enum": [
        "24h",
        "7d",
        "30d",
        "90d",
        "1y",
        "mtd",
        "qtd",
        "ytd",
        "all"
      ]
    },
    "start": {
      "description": "ISO-8601 start of an absolute range.",
      "type": "string"
    },
    "end": {
      "description": "ISO-8601 end of an absolute range.",
      "type": "string"
    },
    "country": {
      "description": "Filter to one country code.",
      "type": "string"
    },
    "device": {
      "description": "Filter to one device type.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_events(event, linkId, customerId, interval, start, ...)

List individual click, lead and sale events rather than aggregates — the row-level detail behind the analytics. Dub: GET /events.

Input Schema

{
  "type": "object",
  "properties": {
    "event": {
      "description": "Which event type to list.",
      "type": "string",
      "enum": [
        "clicks",
        "leads",
        "sales"
      ]
    },
    "linkId": {
      "description": "Only this link's events.",
      "type": "string"
    },
    "customerId": {
      "description": "Only this customer's events.",
      "type": "string"
    },
    "interval": {
      "description": "Relative time window. Use start/end instead for an absolute range.",
      "type": "string",
      "enum": [
        "24h",
        "7d",
        "30d",
        "90d",
        "1y",
        "mtd",
        "qtd",
        "ytd",
        "all"
      ]
    },
    "start": {
      "description": "ISO-8601 start of an absolute range.",
      "type": "string"
    },
    "end": {
      "description": "ISO-8601 end of an absolute range.",
      "type": "string"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "limit": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_customers(email, externalId, search, linkId, page, ...)

List the customers Dub has attributed to links, by email, external id or link. Dub: GET /customers.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "description": "Only the customer with this email.",
      "type": "string"
    },
    "externalId": {
      "description": "Your own id for the customer.",
      "type": "string"
    },
    "search": {
      "description": "Free-text search.",
      "type": "string"
    },
    "linkId": {
      "description": "Only customers attributed to this link.",
      "type": "string"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_get_customer(customer_id)

Fetch a single customer with their attribution. Dub: GET /customers/{id}.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_id": {
      "type": "string",
      "description": "The customer's Dub id."
    }
  },
  "required": [
    "customer_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_tags(search, page, pageSize)

List the tags available for organising links. Dub: GET /tags.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "description": "Free-text search over tag names.",
      "type": "string"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_folders(search, page, pageSize)

List link folders and their access levels. Dub: GET /folders.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "description": "Free-text search over folder names.",
      "type": "string"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_domains(archived, search, page, pageSize)

List the short domains configured on the workspace. Dub: GET /domains.

Input Schema

{
  "type": "object",
  "properties": {
    "archived": {
      "description": "Include archived domains.",
      "type": "boolean"
    },
    "search": {
      "description": "Free-text search.",
      "type": "string"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_partners(status, email, search, page, pageSize)

List the partners (affiliates) in the programme, by status, country or email. Dub: GET /partners.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "description": "Only partners in this state, e.g. approved, pending.",
      "type": "string"
    },
    "email": {
      "description": "Only the partner with this email.",
      "type": "string"
    },
    "search": {
      "description": "Free-text search.",
      "type": "string"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_get_partner_analytics(partnerId, groupBy, interval, start, end)

Get analytics for the partner programme — clicks, leads, sales and revenue per partner. Dub: GET /partners/analytics.

Input Schema

{
  "type": "object",
  "properties": {
    "partnerId": {
      "description": "Only this partner.",
      "type": "string"
    },
    "groupBy": {
      "description": "Dimension to group by, e.g. count, timeseries, top_partners.",
      "type": "string"
    },
    "interval": {
      "description": "Relative time window. Use start/end instead for an absolute range.",
      "type": "string",
      "enum": [
        "24h",
        "7d",
        "30d",
        "90d",
        "1y",
        "mtd",
        "qtd",
        "ytd",
        "all"
      ]
    },
    "start": {
      "description": "ISO-8601 start of an absolute range.",
      "type": "string"
    },
    "end": {
      "description": "ISO-8601 end of an absolute range.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_partner_applications(page, pageSize)

List pending applications to join the partner programme. Dub: GET /partners/applications.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_commissions(partnerId, customerId, status, type, interval, ...)

List partner commissions, by partner, status, customer or time window. Dub: GET /commissions.

Input Schema

{
  "type": "object",
  "properties": {
    "partnerId": {
      "description": "Only this partner's commissions.",
      "type": "string"
    },
    "customerId": {
      "description": "Only commissions from this customer.",
      "type": "string"
    },
    "status": {
      "description": "Only commissions in this state.",
      "type": "string"
    },
    "type": {
      "description": "Only commissions of this type, e.g. sale, lead, click.",
      "type": "string"
    },
    "interval": {
      "description": "Relative time window. Use start/end instead for an absolute range.",
      "type": "string",
      "enum": [
        "24h",
        "7d",
        "30d",
        "90d",
        "1y",
        "mtd",
        "qtd",
        "ytd",
        "all"
      ]
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢dub_list_payouts(partnerId, status, page, pageSize)

List partner payouts and their status. Dub: GET /payouts.

Input Schema

{
  "type": "object",
  "properties": {
    "partnerId": {
      "description": "Only this partner's payouts.",
      "type": "string"
    },
    "status": {
      "description": "Only payouts in this state.",
      "type": "string"
    },
    "page": {
      "description": "1-based page number.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "pageSize": {
      "description": "Page size, 1-100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴dub_create_link(url, domain, key, externalId, title, ...)

Create a short link. Omit `key` to let Dub generate one. Dub: POST /links.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The destination URL."
    },
    "domain": {
      "description": "Short domain to create it on. Defaults to the workspace default.",
      "type": "string"
    },
    "key": {
      "description": "The short key. Omit for a random one.",
      "type": "string"
    },
    "externalId": {
      "description": "Your own id for this link.",
      "type": "string"
    },
    "title": {
      "description": "Custom link preview title.",
      "type": "string"
    },
    "description": {
      "description": "Custom link preview description.",
      "type": "string"
    },
    "tagNames": {
      "description": "Tags to attach, by name.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "folderId": {
      "description": "Folder to file it under.",
      "type": "string"
    },
    "comments": {
      "description": "An internal note.",
      "type": "string"
    }
  },
  "required": [
    "url"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴dub_update_link(linkId, url, key, title, tagNames, ...)

Change a link's destination, key, tags or archived state. Dub: PATCH /links/{linkId}.

Input Schema

{
  "type": "object",
  "properties": {
    "linkId": {
      "type": "string",
      "description": "The link to update."
    },
    "url": {
      "description": "New destination URL.",
      "type": "string"
    },
    "key": {
      "description": "New short key.",
      "type": "string"
    },
    "title": {
      "description": "New preview title.",
      "type": "string"
    },
    "tagNames": {
      "description": "Replace the link's tags.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "archived": {
      "description": "Archive or unarchive the link.",
      "type": "boolean"
    },
    "comments": {
      "description": "New internal note.",
      "type": "string"
    }
  },
  "required": [
    "linkId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴dub_delete_link(linkId)

Delete a short link. The URL stops resolving immediately and its analytics go with it. Dub: DELETE /links/{linkId}.

Input Schema

{
  "type": "object",
  "properties": {
    "linkId": {
      "type": "string",
      "description": "The link to delete."
    }
  },
  "required": [
    "linkId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴dub_create_tag(name, color)

Create a tag for organising links. Dub: POST /tags.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The tag name."
    },
    "color": {
      "description": "Tag colour in the dashboard.",
      "type": "string",
      "enum": [
        "red",
        "yellow",
        "green",
        "blue",
        "purple",
        "pink",
        "brown"
      ]
    }
  },
  "required": [
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴dub_create_folder(name, description, accessLevel)

Create a folder for grouping links. Dub: POST /folders.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The folder name."
    },
    "description": {
      "description": "What the folder is for.",
      "type": "string"
    },
    "accessLevel": {
      "description": "Default workspace access to the folder.",
      "type": "string",
      "enum": [
        "write",
        "read",
        "none"
      ]
    }
  },
  "required": [
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴dub_approve_partner_application(applicationId, groupId)

Approve an application to join the partner programme. The partner gains links and starts earning commission. Dub: POST /partners/applications/approve.

Input Schema

{
  "type": "object",
  "properties": {
    "applicationId": {
      "type": "string",
      "description": "The application to approve."
    },
    "groupId": {
      "description": "Place the partner in this group.",
      "type": "string"
    }
  },
  "required": [
    "applicationId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴dub_reject_partner_application(applicationId)

Reject an application to join the partner programme. Dub: POST /partners/applications/reject.

Input Schema

{
  "type": "object",
  "properties": {
    "applicationId": {
      "type": "string",
      "description": "The application to reject."
    }
  },
  "required": [
    "applicationId"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded22 tools