# io.usefulapi/dub (remote · dub.usefulapi.io)

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

- Trust score: 78/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-04

## Components

- remote · `dub.usefulapi.io`: 78/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-dub/dub.md), [page](https://verifymcp.io/servers/io-usefulapi-dub/dub)

## Channel facts

- Endpoint: `https://dub.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-04.

- **Endpoint Security**: 89/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 77/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2026 tokens (~92/item across 22 items; 22 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability observed for 4 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the io.usefulapi/dub MCP server?

io.usefulapi/dub is a hosted endpoint at https://dub.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-dub 'https://dub.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-dub": {
      "url": "https://dub.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-dub": {
      "type": "http",
      "url": "https://dub.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-dub]
url = "https://dub.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-dub": {
      "type": "remote",
      "url": "https://dub.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-dub --url 'https://dub.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-dub:
    url: "https://dub.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-dub": {
      "Transport": "http",
      "Url": "https://dub.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-dub -t streamable-http -u 'https://dub.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-dub": {
      "type": "http",
      "url": "https://dub.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-04 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-02 (score 77, +1)

- [functional] Server version: 1.3.0 → 1.5.1

### 2026-10-01 (score 76, +5)

- [security improvement] HTTPS: unverified → pass
- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.0.0 → 1.3.0

### 2026-09-30 (score 71, +53)

- [security improvement] Authorization: unverified → pass
- [security improvement] Injection markers: unverified → pass
- [security improvement] Transport: fail → pass
- [security] First check of Judged manipulation: pass
- [security] First check of Authorization: partial
- [functional regression] MCP protocol: unverified → fail
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Destructive annotations: 100
- [functional] First check of Schema quality: pass
- [functional] First check of Schema quality: good
- [functional] First check of Tool coverage: 100

### 2026-09-29 (score 18)

First indexed and scored.

## MCP tools (22)

### `dub_list_links` (~126 tokens)

List short links

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

Input parameters:

- `domain` (string): Only links on this short domain.
- `folderId` (string): Only links in this folder.
- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `search` (string): Free-text search over the key, URL and title.
- `showArchived` (boolean): Include archived links.
- `tagNames` (array): Only links carrying these tag names.

### `dub_get_link` (~89 tokens)

Get one short link

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

Input parameters:

- `domain` (string): The short domain, used with key.
- `externalId` (string): Your own id for the link.
- `key` (string): The short key, used with domain.
- `linkId` (string): The link's Dub id.

### `dub_count_links` (~91 tokens)

Count short links

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 parameters:

- `domain` (string): Only links on this short domain.
- `folderId` (string): Only links in this folder.
- `groupBy` (string): Return counts grouped by this dimension.
- `search` (string): Free-text search.

### `dub_get_analytics` (~214 tokens)

Get analytics

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 parameters:

- `country` (string): Filter to one country code.
- `device` (string): Filter to one device type.
- `domain` (string): Only links on this domain.
- `end` (string): ISO-8601 end of an absolute range.
- `event` (string): Which event type to report. Defaults to clicks.
- `groupBy` (string): Dimension to group by, e.g. count, timeseries, top_links, countries, cities, devices, browsers, os, referers, utm_sources.
- `interval` (string): Relative time window. Use start/end instead for an absolute range.
- `key` (string): The short key, used with domain.
- `linkId` (string): Only this link.
- `start` (string): ISO-8601 start of an absolute range.

### `dub_list_events` (~149 tokens)

List raw events

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

Input parameters:

- `customerId` (string): Only this customer's events.
- `end` (string): ISO-8601 end of an absolute range.
- `event` (string): Which event type to list.
- `interval` (string): Relative time window. Use start/end instead for an absolute range.
- `limit` (integer): Page size, 1-100.
- `linkId` (string): Only this link's events.
- `page` (integer): 1-based page number.
- `start` (string): ISO-8601 start of an absolute range.

### `dub_list_customers` (~111 tokens)

List customers

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

Input parameters:

- `email` (string): Only the customer with this email.
- `externalId` (string): Your own id for the customer.
- `linkId` (string): Only customers attributed to this link.
- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `search` (string): Free-text search.

### `dub_get_customer` (~37 tokens)

Get one customer

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

Input parameters:

- `customer_id` (string, required): The customer's Dub id.

### `dub_list_tags` (~63 tokens)

List tags

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

Input parameters:

- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `search` (string): Free-text search over tag names.

### `dub_list_folders` (~64 tokens)

List folders

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

Input parameters:

- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `search` (string): Free-text search over folder names.

### `dub_list_domains` (~71 tokens)

List domains

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

Input parameters:

- `archived` (boolean): Include archived domains.
- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `search` (string): Free-text search.

### `dub_list_partners` (~104 tokens)

List partners

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

Input parameters:

- `email` (string): Only the partner with this email.
- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `search` (string): Free-text search.
- `status` (string): Only partners in this state, e.g. approved, pending.

### `dub_get_partner_analytics` (~122 tokens)

Get partner analytics

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

Input parameters:

- `end` (string): ISO-8601 end of an absolute range.
- `groupBy` (string): Dimension to group by, e.g. count, timeseries, top_partners.
- `interval` (string): Relative time window. Use start/end instead for an absolute range.
- `partnerId` (string): Only this partner.
- `start` (string): ISO-8601 start of an absolute range.

### `dub_list_partner_applications` (~55 tokens)

List partner applications

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

Input parameters:

- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.

### `dub_list_commissions` (~136 tokens)

List commissions

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

Input parameters:

- `customerId` (string): Only commissions from this customer.
- `interval` (string): Relative time window. Use start/end instead for an absolute range.
- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `partnerId` (string): Only this partner's commissions.
- `status` (string): Only commissions in this state.
- `type` (string): Only commissions of this type, e.g. sale, lead, click.

### `dub_list_payouts` (~78 tokens)

List payouts

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

Input parameters:

- `page` (integer): 1-based page number.
- `pageSize` (integer): Page size, 1-100.
- `partnerId` (string): Only this partner's payouts.
- `status` (string): Only payouts in this state.

### `dub_create_link` (~150 tokens)

Create a short link

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

Input parameters:

- `comments` (string): An internal note.
- `description` (string): Custom link preview description.
- `domain` (string): Short domain to create it on. Defaults to the workspace default.
- `externalId` (string): Your own id for this link.
- `folderId` (string): Folder to file it under.
- `key` (string): The short key. Omit for a random one.
- `tagNames` (array): Tags to attach, by name.
- `title` (string): Custom link preview title.
- `url` (string, required): The destination URL.

### `dub_update_link` (~109 tokens)

Update a short link

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

Input parameters:

- `archived` (boolean): Archive or unarchive the link.
- `comments` (string): New internal note.
- `key` (string): New short key.
- `linkId` (string, required): The link to update.
- `tagNames` (array): Replace the link's tags.
- `title` (string): New preview title.
- `url` (string): New destination URL.

### `dub_delete_link` (~47 tokens)

Delete a short link

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

Input parameters:

- `linkId` (string, required): The link to delete.

### `dub_create_tag` (~44 tokens)

Create a tag

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

Input parameters:

- `color` (string): Tag colour in the dashboard.
- `name` (string, required): The tag name.

### `dub_create_folder` (~58 tokens)

Create a folder

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

Input parameters:

- `accessLevel` (string): Default workspace access to the folder.
- `description` (string): What the folder is for.
- `name` (string, required): The folder name.

### `dub_approve_partner_application` (~66 tokens)

Approve a partner application

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

Input parameters:

- `applicationId` (string, required): The application to approve.
- `groupId` (string): Place the partner in this group.

### `dub_reject_partner_application` (~42 tokens)

Reject a partner application

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

Input parameters:

- `applicationId` (string, required): The application to reject.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-dub/dub#diagnostics

## Score history

- 2026-10-04: 78
- 2026-10-03: 77
- 2026-10-02: 77
- 2026-10-01: 76
- 2026-09-30: 71
- 2026-09-29: 18

## Common questions

### What is the io.usefulapi/dub MCP server?

io.usefulapi/dub is an MCP server listed in the public MCP registry as io.usefulapi/dub. Short links with click, lead and sale analytics, customers, tags and the partner programme. This page covers its hosted endpoint (https://dub.usefulapi.io/mcp).

### Is the io.usefulapi/dub MCP server safe to use?

io.usefulapi/dub scores 78 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.usefulapi/dub MCP server expose?

io.usefulapi/dub exposes 22 tools: dub_list_links, dub_get_link, dub_count_links, dub_get_analytics, dub_list_events, and 17 more. Their descriptions and schemas cost roughly 2,026 tokens of context every time the server is loaded.

### Does the io.usefulapi/dub MCP server require authentication?

Yes. io.usefulapi/dub asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the io.usefulapi/dub MCP server still maintained?

io.usefulapi/dub is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://dub.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-dub/dub.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-dub/dub.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-dub/dub
