# Bitly MCP MCP Server

> **Bitly MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to Bitly MCP.
>
> MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows,
> token refresh, and production-grade auto-scaling — so your AI agents can connect to
> third-party services and run freely without you managing any MCP server yourself.
>
> Server page:  https://mewcp.com/mcp/bitly-mcp
> MewCP docs:   https://docs.mewcp.com
> Full catalog: https://mewcp.com/llms.txt

---

## About

Bitly helps teams manage branded short links, create and customize QR codes, organize campaigns, and track engagement. Generate shareable URLs, update link destinations, retrieve click analytics, and measure traffic by channel to optimize marketing campaigns.

---

## Details

- Server ID: `bitly-mcp`
- Version: 1.0.0
- Tools: 58
- Authentication: OAuth, managed by MewCP
- Transport: http

---

## Access

The gateway URL below serves your **entire MewCP toolset**, not this server on its
own. Pasting a config snippet is not enough — Bitly MCP has to be in the toolset
first. In order:

1. Add Bitly MCP to your toolset at https://mewcp.com/mcp/bitly-mcp
2. Connect your Bitly MCP account (OAuth); MewCP stores the credential and attaches it to each call
3. Copy your MewCP API key from the dashboard (Developer)
4. Configure your client with the snippet for it below

Once connected, an agent does **not** see this server's tools as top-level tools.
It sees four meta-tools and reaches everything through them:

- `search(query)` — find tools by keyword across the toolset
- `get_schema(tools)` — full description and arguments for the tools you picked
- `list_accounts(provider)` — only when one app has several connected accounts
- `call_tool(server_maskedId, tool_name, args)` — execute

So the list below is what `search` can return for this server, not a set of
callable tool names on their own.

---

## Tools (58)

Descriptions are truncated to 160 characters; call `get_schema`
for the full text and the argument schema. Where a tool is annotated, its type
is shown — treat `destructive` as irreversible.

- `bitly_create_short_link` _(write)_ — Create a compact, shareable Bitly link from a long URL, with optional title, tags, a custom back-half keyword, and dynamic routing rules. Use this when the…
- `bitly_create_short_link_with_qr` _(write)_ — Create a new short link and a QR code that encodes that link in one step. Use this when the user wants both a bitlink and a QR code for the same destination,…
- `bitly_get_link_destination` _(read)_ — Look up where a short link points: returns its destination long URL plus basic fields (creation time, link ID, and any dynamic-routing destination URLs). Works…
- `bitly_get_user` _(read)_ — Get authenticated user information including profile details, email addresses, 2FA status, and default group. Provides user context for other operations.
- `bitly_get_organizations` _(read)_ — Get all organizations that the authenticated user has access to. Returns organization details including organization ID, name, tier information, role,…
- `bitly_get_link_analytics` _(read)_ — Get analytics for a single short link. Use this when the user asks how one specific link is performing. The dimension selects the report: a breakdown by…
- `bitly_get_group_analytics` _(read)_ — Get analytics across all links in a group (workspace). Use this when the user asks about overall performance or top-performing links, rather than one specific…
- `bitly_get_qr_code_analytics` _(read)_ — Get scan analytics for a single QR code. Use this when the user asks how one specific QR code is performing. The dimension selects the report: a breakdown by…
- `bitly_get_short_link_details` _(read)_ — Get complete metadata for a short link in your account: title, destination URL, creation time, creator, tags, custom domains, campaign and QR-code IDs,…
- `bitly_update_short_link` _(destructive)_ — Update an existing short link's destination URL, title, tags, or archived status, or set its dynamic routing rules. Use this to change where a link points,…
- `bitly_delete_short_link` _(destructive)_ — Delete a short link permanently. This operation removes unedited short links (non-customized links only) and cannot be undone. The short link must not have…
- `bitly_get_group_details` _(read)_ — Get specific group information and details by group GUID. Returns comprehensive group metadata including name, organization, role, creation dates, custom…
- `bitly_get_groups` _(read)_ — Get all groups (workspaces) that the authenticated user has access to across all organizations. Groups are collections of links and users within an…
- `bitly_get_group_short_links` _(read)_ — Get links in a specific group with filtering and pagination. Returns a list of links belonging to the specified group, with support for search, filtering by…
- `bitly_get_group_short_links_sorted` _(read)_ — Get a group's links ranked by click performance, with per-link metrics and time-series data. Use this when the user wants their best- (or worst-) performing…
- `bitly_get_group_preferences` _(read)_ — Get a group's preferences, including its default (preferred) short domain. Use this when deciding which domain to shorten a link to: check the group's…
- `bitly_update_group_short_links` _(destructive)_ — Update the archive state or tags on up to 100 short links in a group at once. For one link, use bitly_update_short_link. Changes apply asynchronously.
- `bitly_get_custom_domains` _(read)_ — Gets a list of custom domains that can be used for link shortening. This is the member view: only verified domains, across every organization and group, with…
- `bitly_get_organization_custom_domains` _(read)_ — List the custom domains of an organization with their setup state: verification status ('pending', 'ok', or 'error'), attached groups, and, once verified,…
- `bitly_get_custom_domain_details` _(read)_ — Get one custom domain's setup state and settings: verification status ('pending', 'ok', or 'error') with any verification error, attached groups, and, once…
- `bitly_get_custom_domain_dns` _(read)_ — Get the DNS records a custom domain needs at its registrar, the records currently resolving, and whether they match. Use this right after…
- `bitly_prevalidate_custom_domain` _(read)_ — Check whether a domain the user already owns can be connected to an organization as a custom domain, without creating anything. Catches a malformed, reserved,…
- `bitly_create_custom_domain` _(destructive)_ — Connect a domain the user already owns to an organization as a custom domain and queue its DNS verification. Requires an organization admin. Run…
- `bitly_update_custom_domain` _(destructive)_ — Update a verified custom domain's settings: where the bare domain and unknown paths redirect, and HTTPS/HSTS behavior. Only the fields you send change; omitted…
- `bitly_search_available_domains` _(read)_ — Search for new domains that Bitly can register for an organization as its complimentary custom domain, at no cost to the user. Takes a keyword ('acme') or a…
- `bitly_get_domain_agreements` _(read)_ — Get Bitly's Domain Name Use Agreement (https://bitly.com/pages/domain-name-use-agreement), which the user must accept before Bitly registers a domain for them,…
- `bitly_create_complimentary_domain` _(destructive)_ — Register a new domain as the organization's complimentary custom domain, at no cost to the user. Bitly sets up its DNS, so there are no records to create.…
- `bitly_update_group` _(destructive)_ — Rename a group (workspace) or change which custom domains it can shorten links with. The 'bsds' list REPLACES the group's current custom domains: to add one,…
- `bitly_update_group_preferences` _(destructive)_ — Set a group's default (preferred) short domain, used when a link is created for the group without an explicit domain. The domain must be 'bit.ly' or a custom…
- `bitly_get_custom_link_details` _(read)_ — Get full details and destination-override history for a custom-keyword short link — a link with a custom back-half such as 'bit.ly/summer-sale'. Returns the…
- `bitly_get_qr_code` _(read)_ — Get full details for a QR code by its ID: title, destination URL, group, type, archived status, and dynamic routing rules. Use this when you have a QR code ID…
- `bitly_create_qr_code` _(write)_ — Create a QR code for either an existing short link (pass bitlink_id) or a long URL (pass long_url), with optional title and visual customizations. Use this…
- `bitly_update_qr_code` _(destructive)_ — Update an existing QR code's title, visual customizations, archived status, expiration, or dynamic routing rules. Use this to restyle a QR code,…
- `bitly_get_group_qr_codes` _(read)_ — List the QR codes in a group, with search, archived-status and dynamic-routing filters, and pagination. Use this to browse a group's QR codes or to find one by…
- `bitly_get_qr_code_image` _(read)_ — Return a QR code's image as a base64 data URI (SVG default, or PNG). Most agent UIs cannot render raw image data, so prefer directing the user to the QR code's…
- `bitly_create_bulk_upload` _(destructive)_ — Create links, QR codes, or both from a CSV or XLSX file in one step. The tool creates the bulk upload and uploads the file. Processing continues in the…
- `bitly_get_bulk_upload` _(read)_ — Get the status of one bulk upload. Use the id that bitly_create_bulk_upload returned. If you do not have the id, use bitly_get_bulk_uploads. Statuses: -…
- `bitly_get_bulk_uploads` _(read)_ — List the organization's bulk uploads with their status, newest first. Use this to answer questions about recent bulk uploads when you do not have an id. A bulk…
- `bitly_export_data` _(read)_ — Export link or QR data as CSV. Always use response_format="json". Returns a download-card payload (filename, row_count, truncated, columns) — do not paste CSV,…
- `bitly_get_group_sites` _(read)_ — List the Bitly Sites (link-in-bio pages / microsites) in a group (workspace), with URL filtering and pagination. Use this to browse a group's sites or find one…
- `bitly_get_site` _(read)_ — Get a Bitly Site's full configuration by its site ID: URL, status, display name, description, button count, attached QR code, and whether it has unpublished…
- `bitly_create_site` _(write)_ — Create a new, empty Bitly Site (link-in-bio page) for a group at a short URL, using default appearance. The new site is a draft with no buttons; add content…
- `bitly_update_site` _(destructive)_ — Update a Bitly Site's URI, display name, description, or attach a QR code. Only the fields you send change; omitted fields are left as-is, and a present empty…
- `bitly_delete_site` _(destructive)_ — Deactivate (delete) a Bitly Site. This takes the live site down. To only throw away unpublished edits while keeping the live site, use bitly_discard_site_draft…
- `bitly_discard_site_draft` _(destructive)_ — Discard a Bitly Site's unpublished draft, reverting in-progress edits back to the currently published version. The live site is unaffected. To take the whole…
- `bitly_publish_site` _(destructive)_ — Publish a Bitly Site's draft so the current edits go live. Newly created sites and edits are drafts until published. Use bitly_get_site to check whether a site…
- `bitly_clone_site` _(write)_ — Clone a live Bitly Site into a new site at a different URI, copying its content and appearance. Requires a plan with the site-cloning feature. The new site is…
- `bitly_get_site_templates` _(read)_ — List Bitly Site templates that can be applied to a site, optionally filtered by category. Use this to discover a template_guid, then apply it with…
- `bitly_apply_site_template` _(destructive)_ — Apply a template's content, appearance, and blocks to a Bitly Site, replacing the site's current content and styling. Find a template_guid with…
- `bitly_update_site_appearance` _(destructive)_ — Replace a Bitly Site's appearance: theme, layout, fonts, and colors. This is a full replacement (PUT) of the appearance object, so include every field you want…
- `bitly_create_site_container` _(write)_ — Create a container (a grid or carousel) on a Bitly Site to group content blocks. Requires a plan with the corresponding feature. After creating it, add child…
- `bitly_create_site_block` _(write)_ — Add a content block to a Bitly Site: a bitlink button, social icon, YouTube video, image, digital business card, or text block. New blocks are active (visible)…
- `bitly_update_site_block` _(destructive)_ — Update an existing block on a Bitly Site, replacing its content (and appearance for text blocks). For a bitlink button, the content object can change its…
- `bitly_delete_site_block` _(destructive)_ — Delete a block of any type from a Bitly Site: a bitlink button, social icon, YouTube video, image, digital business card, text block, or a grid/carousel…
- `bitly_prevalidate_site_button` _(read)_ — Prevalidate button content before adding it to a Bitly Site. Currently supports YouTube videos: given a video_id, it returns the resolved video URL, title, and…
- `bitly_delete_site_redirect` _(destructive)_ — Delete a redirect from a Bitly Site. Redirects are created automatically when a site's URI changes (see bitly_update_site); this removes one, identified by its…
- `bitly_create_site_image` _(write)_ — Register an already-uploaded image for use on a Bitly Site (e.g. as an avatar, background, or image block). You must upload the image and obtain its image_guid…
- `bitly_get_site_analytics` _(read)_ — Get analytics for a single Bitly Site (link-in-bio page). Use this when the user asks how a site is performing. Choose a dataset — 'page_views' (visits to the…

---

## Connect

Gateway URL: https://gateway.mewcp.com/personal/mcp

Every request carries one header:

    Authorization: Bearer <API_KEY>

Replace `API_KEY` with your own key from the dashboard (Developer).

## Apps

### Claude Desktop

Mac & Windows app

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://gateway.mewcp.com/personal/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open Claude Desktop → Settings → Developer → "Edit Config"
2. Paste the snippet inside the outer { } of the config file (merge with your existing "mcpServers" section if you have one)
3. Save the file, then quit Claude Desktop completely and reopen it
4. Start a new conversation — your tool will be available

### VS Code

Copilot / Cline

- Command Palette → "MCP: Open User Configuration" (opens mcp.json). For one project only, use .vscode/mcp.json instead.

```json
{
  "mcp.servers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have a "servers" section in your mcp.json? Just add the server entry inside it.

1. Open VS Code → Command Palette (Cmd+Shift+P / Ctrl+Shift+P)
2. Run "MCP: Open User Configuration" to open your mcp.json
3. Paste the snippet and save
4. Start the server when prompted (or from the MCP servers view) and use it in Copilot Chat

### Cursor

AI-first editor

- macOS: `~/.cursor/mcp.json`
- Windows: `%USERPROFILE%\.cursor\mcp.json`

```json
{
  "mcpServers": {
    "mewcp": {
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your mcp.json? Just add the server entry inside it.

1. Open Cursor → Settings → Cursor Settings → MCP
2. Click "Add new global MCP server"
3. Paste the snippet and save
4. Restart Cursor

### Codex

OpenAI's CLI agent

- Add the snippet to your Codex MCP config or your standard MCP config file for the CLI tool you use.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Codex generally reads a standard MCP server block, so you can add this alongside your other configured servers.

1. Open your Codex MCP config or project-level config file
2. Paste the MewCP server block inside the config JSON/TOML structure your tool expects
3. Save the file and restart Codex
4. Verify the tool is available inside a fresh session

### Claude Code

Anthropic's CLI agent

- ~/.claude.json (user scope) or .mcp.json in your project root — create it if it doesn't exist. Or skip the file and use the CLI command below.

```json
{
  "mcpServers": {
    "mewcp": {
      "type": "http",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it.

1. Open ~/.claude.json (or .mcp.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file and start (or restart) Claude Code
4. Or skip the file entirely and run the CLI command below instead

### OpenCode

Open-source terminal agent

- ~/.config/opencode/opencode.json (global) or opencode.json in your project root — create it if it doesn't exist.

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mewcp": {
      "type": "remote",
      "url": "https://gateway.mewcp.com/personal/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcp" section in your opencode.json? Just add the server entry inside it.

1. Open ~/.config/opencode/opencode.json (or opencode.json in your project root) in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and start (or restart) OpenCode

### OpenClaw

Self-hosted agent gateway

- ~/.openclaw/openclaw.json — create it if it doesn't exist.

```json
{
  "mcp": {
    "servers": {
      "mewcp": {
        "transport": "streamable-http",
        "url": "https://gateway.mewcp.com/personal/mcp",
        "enabled": true,
        "headers": {
          "Authorization": "Bearer API_KEY"
        }
      }
    }
  }
}
```

Already have an "mcp" section in your openclaw.json? Just add the server entry inside "servers".

1. Open ~/.openclaw/openclaw.json in a text editor
2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one)
3. Save the file and restart OpenClaw

### Antigravity

Google's agentic IDE

- ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — create it if it doesn't exist.

```json
{
  "mcpServers": {
    "mewcp": {
      "serverUrl": "https://gateway.mewcp.com/personal/mcp",
      "headers": {
        "Authorization": "Bearer API_KEY"
      }
    }
  }
}
```

Already have an "mcpServers" section in your config? Just add the server entry inside it. Remote servers must use the "serverUrl" field — the legacy "url"/"httpUrl" fields aren't supported.

1. In the editor's agent side panel, click "…" → "MCP Servers" → "Manage MCP Servers" → "View raw config" (Antigravity CLI: type /mcp instead to open the Interactive MCP Manager)
2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one)
3. Save the file — the server connects automatically

### Hermes

Nous Research's CLI agent

- config.yaml in your Hermes config directory (~/.hermes) — add this under a top-level "mcp_servers:" key.

```yaml
mcp_servers:
  mewcp:
    url: "https://gateway.mewcp.com/personal/mcp"
    headers:
      Authorization: "Bearer API_KEY"
```

Already have an "mcp_servers" section in your config.yaml? Just add the server entry inside it.

1. Open config.yaml in your Hermes config directory
2. Paste the snippet under the top-level "mcp_servers:" key (merge with existing entries if you have any)
3. Save the file, then run /reload-mcp in Hermes (or start a fresh session)
4. Ask Hermes "Tell me which MCP-backed tools are available right now" to confirm it connected

### DeepSeek Harness

DeepSeek's agent harness

- cordis.yml in your DSH project — or the patch file you mount plugins from.

```yaml
- id: mcp-mewcp
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: mewcp
    transport: streamable-http
    url: https://gateway.mewcp.com/personal/mcp
    headers:
      Authorization: "Bearer API_KEY"
```

One plugin instance = one MCP server. Add this entry to your plugin list; don't nest it inside another entry.

1. Open cordis.yml (or your patch file) in your DSH project
2. Paste the entry into your plugin list, keeping the leading dash and indentation
3. Restart DSH (or let HMR reload) — tools register as mcp__mewcp__<tool_name>
4. Verify with: dsh web --dump-config | grep -A3 mcp

## SDKs

### Python

fastmcp client

```python
import asyncio
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport

SERVER_URL = "https://gateway.mewcp.com/personal/mcp"
API_KEY = "API_KEY"

transport = StreamableHttpTransport(
    url=SERVER_URL,
    headers={
        "Authorization": f"Bearer {API_KEY}",
    }
)

async def main():
    client = Client(transport)
    async with client:
        tools = await client.list_tools()
        print(tools)

asyncio.run(main())
```

1. Install fastmcp: pip install fastmcp
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run your script

### TypeScript

MCP SDK

```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const SERVER_URL = "https://gateway.mewcp.com/personal/mcp";
const API_KEY = "API_KEY";

const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), {
  requestInit: {
    headers: {
      Authorization: `Bearer ${API_KEY}`,
    },
  },
});

const client = new Client({ name: "mewcp-client", version: "1.0.0" });
await client.connect(transport);

const tools = await client.listTools();
console.log(tools.tools.map((t) => t.name));
```

1. Install: npm install @modelcontextprotocol/sdk
2. Copy the snippet into your project
3. Replace API_KEY with your key from the dashboard
4. Run with Node 18+ as an ES module (e.g. npx tsx script.ts)