The Bitly MCP connector routes your AI agent's tool calls to Bitly's own MCP server through Scalekit. Each user signs in to Bitly once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 58 tools.
- Tools
- 58
- What they doRead · write · destructive
- 16 · 38 · 416 read38 write4 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
What you can do
- Create and manage short links: shorten URLs, create links with custom back-halves, update link metadata, and delete links
- Create and manage QR codes: generate QR codes for links, update QR code settings, and retrieve QR code images
- Analyze link performance: get click summaries, engagement metrics, and breakdowns by city, country, device, referrer, and referring domain
- Analyze QR code scans: get scan summaries and breakdowns by city, country, device, and browser
- Analyze group-level engagement: query top links, clicks, scans, and engagement trends across all links in a group
- Manage account structure: retrieve organizations, groups, custom domains, and user details
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Bitly MCP connection
In AgentKit > Connections, create a Bitly MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Bitly MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'bitlymcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Bitly MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'bitlymcp_bitly_get_custom_domains',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "bitlymcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Bitly MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="bitlymcp_bitly_get_custom_domains",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolbitlymcp_bitly_get_custom_domainsList all custom domains (also called branded short domains or BSDs) available to the authenticated user for use instead of 'bit.ly' when creating short links.Read-onlyGet Custom Domains
List all custom domains (also called branded short domains or BSDs) available to the authenticated user for use instead of 'bit.ly' when creating short links.
Inputs
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_custom_link_detailsGet full details and destination-override history for a custom-keyword short link, such as 'bit.ly/summer-sale'.Read-onlyGet Custom Link Details
Get full details and destination-override history for a custom-keyword short link, such as 'bit.ly/summer-sale'. The link must have a custom keyword (fails with NOT_CUSTOM_BITLINK otherwise); for a plain auto-generated link, use get_short_link_details instead.
Inputs
custom_bitlinkstringrequired- The short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_group_analyticsGet analytics across all links in a group (workspace).Read-onlyBitly Get Group Analytics
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 link. For a single link use bitly_get_link_analytics; for a single QR code's scans use bitly_get_qr_code_analytics. Choose a dataset — 'clicks', 'engagements' (clicks + QR scans + button clicks), or 'qr_scans' — and a dimension: a facet breakdown, 'over_time' (time series), or 'top' (best performing links). There is no group-level total/summary dimension: for an overall count over a period use 'over_time' and total the returned series; for a single link's total use bitly_get_link_analytics with dimension 'summary'. Valid dimensions per dataset — clicks: cities, countries, device_os, over_time, referrers, top; engagements: cities, countries, devices, over_time, referrers, referring_networks, top; qr_scans: cities, countries, over_time, top. 'devices' is device form factor (mobile, desktop, ...) and 'device_os' is operating system (iOS, Android, Windows, ...). Notes: for datasets 'engagements' and 'qr_scans' the raw JSON keys counts as 'clicks' even though the values are engagements/scans; for dataset 'clicks' with dimension 'referrers' the v4 API returns engagement counts, not clicks alone.
Inputs
datasetstringrequired- What to measure: 'clicks' (link clicks only), 'engagements' (clicks + QR scans + button clicks), 'qr_scans' (QR code scans only), or 'agentic_traffic' (clicks from AI agents and assistants, fixed 90-day total).one of
agentic_trafficclicksengagementsqr_scans dimensionstringrequired- The report to return. Valid values depend on the dataset — agentic_traffic: summary; clicks: cities, countries, device_os, over_time, referrers, top; engagements: cities, countries, devices, over_time, referrers, referring_networks, top; qr_scans: cities, countries, over_time, top.one of
citiescountriesdevice_osdevicesover_timereferrersreferring_networkssummarytop group_guidstringrequired- The unique identifier of the group (workspace)
response_formatstring- 'text' (default) or 'json'
sizenumber- Maximum number of results to return (default varies)
unitstring- Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: dayone of
minutehourdayweekmonth unit_referencestring- ISO 8601 timestamp for the END of the time range. The range is the last 'units' periods ending on this date (e.g. '2025-02-28T00:00:00+0000' with units=28 gives all of February). For a full month, use the last day of that month (e.g. 2026-02-28 for Feb 2026). Omit for default: now.
unitsstring- Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.
bitlymcp_bitly_get_group_detailsGet metadata for a specific group by GUID, including name, organization, role, creation date, custom domains (BSDs), and status.Read-onlyGet Group Details
Get metadata for a specific group by GUID, including name, organization, role, creation date, custom domains (BSDs), and status. For the group's preferred short domain, use get_group_preferences instead.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_group_preferencesGet a group's preferences, including its default (preferred) short domain.Read-onlyGet Group Preferences
Get a group's preferences, including its default (preferred) short domain. Check this first when deciding which domain to shorten a link to, then fall back to get_group_details for the group's full list of available custom domains.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_group_qr_codesList the QR codes in a group, with search, archived-status and dynamic-routing filters, and pagination.Read-onlyBitly Get Group Qr Codes
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 title or destination when you don't have its ID. Note: QR codes backed by an existing short link (coupled) appear here. bitly_update_qr_code can still change their title, archived status and visual customizations, and dynamic routing must be set on the underlying link with bitly_update_short_link instead. Expiration is not supported on coupled QR codes at all.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
archivedstring- Filter by archived status: 'on' (archived only), 'off' (non-archived only), 'both' (all)one of
onoffboth has_dynamic_routingstring- Filter by dynamic routing: 'on' (only QR codes with dynamic routing), 'off' (only those without), 'both' (all, default). Requires the dynamic_routing feature; otherwise ignored.one of
onoffboth querystring- Search term to filter QR codes by title or destination URL
response_formatstring- 'text' (default) or 'json'
search_afterstring- Pagination cursor for retrieving next page of results
sizestring- Number of QR codes to return (default: 50, max: 100)
bitlymcp_bitly_get_group_short_linksList links in a group with filtering by search query, tag, archived status, dynamic-routing presence, or creation date range, plus pagination.Read-onlyGet Group Short Links
List links in a group with filtering by search query, tag, archived status, dynamic-routing presence, or creation date range, plus pagination. For links ranked by click performance instead, use get_group_short_links_sorted.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
archivedstring- Filter by archived status: 'on' (archived only), 'off' (non-archived only), 'both' (all)one of
onoffboth created_afterstring- Filter links created after this time, as a Unix timestamp in seconds (e.g. 1704067200). ISO 8601 strings are rejected.
created_beforestring- Filter links created before this time, as a Unix timestamp in seconds (e.g. 1704067200). ISO 8601 strings are rejected.
has_dynamic_routingstring- Filter by dynamic routing: 'on' (only links with dynamic routing), 'off' (only links without), 'both' (all, default). Requires the dynamic_routing feature; otherwise ignored.one of
onoffboth querystring- Search term to filter links by title, destination URL, or short URL
response_formatstring- 'text' (default) or 'json'
search_afterstring- Pagination cursor for retrieving next page of results
sizestring- Number of links to return (default: 50, max: 100)
tagarray- Tags to filter links by, e.g. ["campaign", "q1"]. Multiple tags are combined with AND: only links carrying every tag listed are returned, so pass one tag to match links having that tag. There is no way to match links having any of several tags in one call — query each tag separately and merge the results.
bitlymcp_bitly_get_group_short_links_sortedGet a group's links ranked by click performance, with per-link metrics and time-series data.Read-onlyGet Group Short Links Sorted
Get a group's links ranked by click performance, with per-link metrics and time-series data. Use this for requests like 'show my top links this month'. Requires sort='clicks'. To browse or search a group's links without ranking them, use get_group_short_links instead.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
sortstringrequired- Sort method for the results: 'clicks' ranks links by click performanceone of
clicks response_formatstring- 'text' (default) or 'json'
sizenumber- Maximum number of results to return (default varies)
unitstring- Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: dayone of
minutehourdayweekmonth unit_referencestring- ISO 8601 timestamp for the END of the time range. The range is the last 'units' periods ending on this date (e.g. '2025-02-28T00:00:00+0000' with units=28 gives all of February). For a full month, use the last day of that month (e.g. 2026-02-28 for Feb 2026). Omit for default: now.
unitsstring- Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.
bitlymcp_bitly_get_groupsList all groups (workspaces) the authenticated user has access to across all organizations, optionally filtered to one organization.Read-onlyGet Groups
List all groups (workspaces) the authenticated user has access to across all organizations, optionally filtered to one organization. Groups contain links and QR codes; use the returned group_guid with other tools.
Inputs
organization_guidstring- Optional organization GUID to filter groups by specific organization. If provided, only groups belonging to this organization will be returned.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_link_analyticsGet analytics for a single short link.Read-onlyBitly Get Link Analytics
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 countries, cities, devices (form factor), referrers, or referring_domains; 'over_time' for a click time series; 'summary' for total click counts; or 'engagements'/'engagements_summary' for the same reports with a clicks/scans/button-clicks breakdown. For analytics across every link in a group (workspace), or top-performing links, use bitly_get_group_analytics. For a single QR code's scans, use bitly_get_qr_code_analytics.
Inputs
bitlink_idstringrequired- The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')
dimensionstringrequired- The report to return: a facet breakdown (countries, cities, devices, referrers, referring_domains), 'over_time' (click time series), 'summary' (total clicks), 'engagements' (time series with clicks/scans/button breakdown), 'engagements_summary' (totals with that breakdown), or 'agentic_traffic' (clicks from AI agents, broken down by agent).one of
agentic_trafficcitiescountriesdevicesengagementsengagements_summaryover_timereferrersreferring_domainssummary response_formatstring- 'text' (default) or 'json'
sizenumber- Maximum number of results to return (default varies)
unitstring- Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: dayone of
minutehourdayweekmonth unit_referencestring- ISO 8601 timestamp for the END of the time range. The range is the last 'units' periods ending on this date (e.g. '2025-02-28T00:00:00+0000' with units=28 gives all of February). For a full month, use the last day of that month (e.g. 2026-02-28 for Feb 2026). Omit for default: now.
unitsstring- Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.
bitlymcp_bitly_get_organizationsGet all organizations that the authenticated user has access to.Read-onlyBitly Get Organizations
Get all organizations that the authenticated user has access to. Returns organization details including organization ID, name, tier information, role, creation/modification dates, and associated custom domains, also known as branded short domains (BSDs). Use this to understand organizational context and access permissions.
Inputs
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_qr_codeGet full details for a QR code by its ID: title, destination URL, group, type, archived status, and dynamic routing rules.Read-onlyBitly Get Qr Code
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 and need its metadata or current routing. To find QR codes when you don't have an ID, list them with bitly_get_group_qr_codes.
Inputs
qrcode_idstringrequired- The unique identifier of the QR code
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_qr_code_analyticsGet scan analytics for a single QR code.Read-onlyBitly Get Qr Code Analytics
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 countries, cities, device_os (operating system), or browsers; 'over_time' for a time series of scans; or 'summary' for total scan counts. For a single link's clicks/engagements use bitly_get_link_analytics; for QR scans across a whole group use bitly_get_group_analytics with dataset 'qr_scans'.
Inputs
dimensionstringrequired- The report to return: a facet breakdown (countries, cities, device_os, browsers), 'over_time' (time series), or 'summary' (totals).one of
browserscitiescountriesdevice_osover_timesummary qrcode_idstringrequired- The unique identifier of the QR code
response_formatstring- 'text' (default) or 'json'
sizenumber- Maximum number of results to return (default varies)
unitstring- Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: dayone of
minutehourdayweekmonth unit_referencestring- ISO 8601 timestamp for the END of the time range. The range is the last 'units' periods ending on this date (e.g. '2025-02-28T00:00:00+0000' with units=28 gives all of February). For a full month, use the last day of that month (e.g. 2026-02-28 for Feb 2026). Omit for default: now.
unitsstring- Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.
bitlymcp_bitly_get_qr_code_imageReturn a QR code's image as a base64 data URI (SVG default, or PNG).Read-onlyBitly Get Qr Code Image
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 details page (included in bitly_get_qr_code and bitly_create_qr_code responses) to download the image. Only call this tool if you are certain you can process raw base64 image data.
Inputs
qrcode_idstringrequired- The unique identifier of the QR code
formatstring- Image format: 'svg' or 'png' (default: svg)one of
svgpng response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_short_link_detailsGet complete metadata for a short link in your account: title, destination URL, creation time, creator, tags, custom domains, campaign and QR-code IDs, deeplinks, and dynamic routing rules.Read-onlyBitly Get Short Link Details
Get complete metadata for a short link in your account: title, destination URL, creation time, creator, tags, custom domains, campaign and QR-code IDs, deeplinks, and dynamic routing rules. Use this when you need full details about a link you own. For a lightweight destination-only lookup of any bitlink (including links you don't own), use bitly_get_link_destination instead. For a custom-keyword link's override history, use bitly_get_custom_link_details.
Inputs
bitlink_idstringrequired- The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_userGet authenticated user information including profile details, email addresses, 2FA status, and default group.Read-onlyBitly Get User
Get authenticated user information including profile details, email addresses, 2FA status, and default group. Provides user context for other operations.
Inputs
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_apply_site_templateApply a template's content, appearance, and blocks to a Bitly Site, replacing the site's current content and styling.WriteBitly Apply Site Template
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_get_site_templates. The change is a draft; publish it with bitly_publish_site.
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
template_guidstringrequired- The template's GUID (from bitly_get_site_templates) to apply to the site.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_clone_siteClone a live Bitly Site into a new site at a different URI, copying its content and appearance.WriteBitly Clone Site
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 a draft; publish it with bitly_publish_site.
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
uristringrequired- The short URL for the cloned site. Pass just a keyword ('mysite-copy'), a domain and keyword ('bit.ly/mysite-copy'), or the full 'domain/m/keyword' form; the '/m/' path segment is added automatically, and a bare keyword assumes the bit.ly domain. Must be different from the source site's URI.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_create_bulk_uploadCreate links, QR codes, or both from a CSV or XLSX file in one step.WriteBitly Create Bulk Upload
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 background, and Bitly sends an email with a report when it is complete. Upload types: - "link": Bulk create shortened links only - "qr_code": Bulk create QR codes only (requires template_id) - "coupled_link": Bulk create both QR codes AND shortened links for each URL (requires template_id) Template ID requirements: - Required for "qr_code" and "coupled_link" upload types - Use "QTDTmplWLogo" to include Bitly logo on QR codes - Use "QTDTmplNLogo" to exclude Bitly logo from QR codes Rows whose "Current Bitly Short Link" column references an existing link update that link's destination, title, tags, and expiration instead of creating a new one.
Inputs
domainstringrequired- Short domain for the created links and for the short link inside each QR code. Pass a custom domain of the group. When the user names no domain, use the group's preferred domain from bitly_get_group_preferences. For third-party integrations, Bitly domains such as bit.ly return INVALID_DOMAIN.
file_contentstringrequired- The file content: the CSV text for a .csv file, or the base64-encoded file for a .xlsx file. The first row must have a Long URL column.
filenamestringrequired- Logical filename for the bulk upload (for example, "contacts.csv" or "links.xlsx").
group_guidstringrequired- The unique identifier of the group (workspace)
organization_guidstringrequired- The organization that owns the bulk uploads. Get it from bitly_get_organizations.
upload_typestringrequired- Type of bulk upload. Must be exactly one of: "link", "qr_code", or "coupled_link".
response_formatstring- 'text' (default) or 'json'
template_idstring- Bulk upload template ID. Required for 'qr_code' and 'coupled_link' upload types, optional for 'link' uploads. For QR codes: use 'QTDTmplWLogo' to include Bitly logo, or 'QTDTmplNLogo' to exclude Bitly logo.
bitlymcp_bitly_create_complimentary_domainRegister a new domain as the organization's complimentary custom domain, at no cost to the user.WriteBitly Create Complimentary Domain
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. Before calling: pick the domain with bitly_search_available_domains, confirm the exact domain with the user, and get the user's acceptance of Bitly's Domain Name Use Agreement from bitly_get_domain_agreements. This cannot be undone and uses the organization's complimentary allowance. It also replaces any domain the organization is still connecting, so check bitly_get_organization_custom_domains for one that never verified ('pending', or 'error' with verification failed) and warn the user. Requires an organization admin. Afterwards the domain stays pending for up to 24-48 hours and cannot shorten links or be attached to groups until it is verified. Nothing attaches it or notifies the user automatically, so ask the user to come back once it is verified, then attach it with bitly_update_group and bitly_update_group_preferences. Errors: ALREADY_RECEIVED_COMPLIMENTARY_DOMAIN means the allowance is used or the plan has none. DOMAIN_UNAVAILABLE means the domain was taken, so search again and confirm a new one with the user. INVALID_ARG_AGREEMENT_KEYS means the keys are stale, so call bitly_get_domain_agreements again. After a timeout, check bitly_get_organization_custom_domains before retrying, because the registration may have completed.
Inputs
agreement_keysarrayrequired- Every agreement key returned by bitly_get_domain_agreements for this domain. Send them only after the user accepted the agreement.
domainstringrequired- The root domain to register, e.g. 'example.link'. Pick it from the results of bitly_search_available_domains; subdomains cannot be registered.
organization_guidstringrequired- The unique identifier of the organization that owns (or will own) the custom domain. The caller must belong to this organization, and must be one of its admins for any tool that creates or changes a domain. Get it from bitly_get_organizations.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_create_custom_domainConnect a domain the user already owns to an organization as a custom domain and queue its DNS verification.WriteBitly Create Custom Domain
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_prevalidate_custom_domain first to confirm the domain. After this call, use bitly_get_custom_domain_dns to give the user the DNS records to create at their registrar; verification is asynchronous (up to 24-48 hours after the records propagate), no tool waits for it, and the domain reads 'pending' in bitly_get_custom_domain_details until it completes. Calling this again for a domain already verified in the organization re-requests verification (use it after fixing DNS records on a domain in 'error'). Each organization has a single pending slot: adding a second domain before the first verifies replaces the first claim.
Inputs
custom_domainstringrequired- The custom domain, e.g. 'links.example.com' (a subdomain) or 'example.link' (a root domain).
organization_guidstringrequired- The unique identifier of the organization that owns (or will own) the custom domain. The caller must belong to this organization, and must be one of its admins for any tool that creates or changes a domain. Get it from bitly_get_organizations.
group_guidsarray- Optional GUIDs of the groups (workspaces) that may shorten links with this domain. Omit to attach later with bitly_update_group; an organization with a single group attaches it automatically.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_create_qr_codeCreate 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.WriteBitly Create Qr Code
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 when the user wants a QR code for a destination that already exists. If they want a brand-new short link AND a QR code for it, use bitly_create_short_link_with_qr instead so one approval covers both. The group's default domain is not applied automatically here as it is by bitly_create_short_link: to brand the auto-generated short link, pass the domain parameter explicitly, or create the link first with bitly_create_short_link and pass its bitlink_id. Dynamic routing is only supported on QR codes with a long_url destination (decoupled); for a QR backed by an existing short link (coupled), set routing on the link via bitly_update_short_link instead. If the QR code has a long_url destination, do not reveal the serialized content to the user.
Inputs
group_guidstringrequired- The GUID of the group to create the QR code in
archivedboolean- Whether the QR code should be archived (default: false)
bitlink_idstring- Existing short link ID to use as destination
domainstring- Preferred short domain for the QR code's auto-generated short link (e.g. bit.ly). Only applies when using long_url; ignored when bitlink_id is provided. A Bitly domain (bit.ly, j.mp) is a preference, not a guarantee: if the destination site has a branded domain configured, that domain is used instead. A branded domain the group owns is used as requested. The returned short link ID shows the domain that was actually used.
dynamic_routingarray- Optional dynamic routing rules that redirect visitors to different destinations based on their country, region, device, or OS. Provide an array of up to 10 rule objects; each rule must include 'long_url' plus at least one match/exclude condition. All of a rule's conditions must match for it to apply, and rules are evaluated top to bottom — the first matching rule wins. Fields per rule: 'long_url' (string, required) — destination for matching visitors; 'country_match'/'country_exclude' (array of ISO 3166-1 alpha-2 codes, e.g. ["US","GB"]); 'region_match'/'region_exclude' (array of ISO 3166-2 codes formatted 'CC-SUB', e.g. ["US-CA"]; the region's country must also appear in country_match); 'device_match'/'device_exclude' (array of "mobile", "tablet", or "desktop"); 'os_match'/'os_exclude' (array of "ios" or "android"). Example: [{"long_url":"https://example.com/us","country_match":["US"],"os_match":["ios"]},{"long_url":"https://example.com/row","country_exclude":["US"]}]. Omit to leave existing routing unchanged. When updating, the provided rules replace all existing rules (not additive); pass an empty array ([]) to remove all rules.
expiration_atstring- Optional expiration timestamp in ISO 8601 format 'YYYY-MM-DDTHH:MM:SS+0000' (e.g. "2026-12-31T23:59:59+0000"). Only supported on QR codes with a long_url destination, not ones backed by an existing short link, and on accounts entitled to link expiration; the API rejects it otherwise. When updating, pass an empty string ("") to remove an existing expiration; omit to leave it unchanged.
long_urlstring- The destination URL for the QR code
render_customizationsobject- Customize the look of the QR code. Apply 'foreground' colors to all corners and the pips. Space gradient colors evenly if no offsets are specified. Strictly follow the naming and structure of this example (non-relevant values can be left out): { "background_color":"#ffffff", "dot_pattern_color":"#EF8000", "dot_pattern_type":"rounded", "corners":{ "corner_1":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" }, "corner_2":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" }, "corner_3":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" } }, "gradient":{ "style":"linear", "angle":45, "colors":[ { "color":"#c80404", "offset":10 }, { "color":"#042f86", "offset":90 } ], "exclude_corners":false }, "background_gradient":{ "style":"radial", "colors":[ { "color":"#c696ee", "offset":25 }, { "color":"#d4e1a8", "offset":50 } ] }, "logo":{ "image_guid":"bitlylogo" }, "frame":{ "id":"text_bottom", "colors":{ "primary":"#f55656", "background":"#ffffff" }, "text":{ "primary":{ "content":"QR Frame" }, "secondary":{ "content":"Frame Text" } } }, "branding":{ "bitly_brand":true }, "spec_settings":{ "error_correction":4 } }
response_formatstring- 'text' (default) or 'json'
titlestring- The title of the QR code
bitlymcp_bitly_create_short_linkCreate a compact, shareable Bitly link from a long URL, with optional title, tags, a custom back-half keyword, and dynamic routing rules.WriteBitly Create Short Link
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 user wants a short link only. If they also want a QR code for the same new link, use bitly_create_short_link_with_qr instead so one approval covers both. To choose the short domain: use the domain the user specified; otherwise check the group's preferred domain with bitly_get_group_preferences, then its available domains with bitly_get_group_details; if none apply, the link is unbranded (bit.ly). Set dynamic_routing here to send visitors to different destinations by country, region, device, or OS.
Inputs
bitlink_idstring- An existing Bitly link to add a custom back-half to. Use with keyword parameter. Required if long_url is not provided.
domainstring- Custom short domain to use (e.g., 'bit.ly', 'custom-domain.com'). Uses group default if not specified.
dynamic_routingarray- Optional dynamic routing rules that redirect visitors to different destinations based on their country, region, device, or OS. Provide an array of up to 10 rule objects; each rule must include 'long_url' plus at least one match/exclude condition. All of a rule's conditions must match for it to apply, and rules are evaluated top to bottom — the first matching rule wins. Fields per rule: 'long_url' (string, required) — destination for matching visitors; 'country_match'/'country_exclude' (array of ISO 3166-1 alpha-2 codes, e.g. ["US","GB"]); 'region_match'/'region_exclude' (array of ISO 3166-2 codes formatted 'CC-SUB', e.g. ["US-CA"]; the region's country must also appear in country_match); 'device_match'/'device_exclude' (array of "mobile", "tablet", or "desktop"); 'os_match'/'os_exclude' (array of "ios" or "android"). Example: [{"long_url":"https://example.com/us","country_match":["US"],"os_match":["ios"]},{"long_url":"https://example.com/row","country_exclude":["US"]}]. Omit to leave existing routing unchanged. When updating, the provided rules replace all existing rules (not additive); pass an empty array ([]) to remove all rules.
group_guidstring- GUID of the group to create the short link in. Uses user's default group if not specified.
keywordstring- Custom back-half keyword for the short link (e.g., 'summer-sale' creates 'bit.ly/summer-sale'). Must be unique. If omitted, a random hash is generated.
long_urlstring- The URL to be shortened. Must be a valid HTTP or HTTPS URL. Required if bitlink_id is not provided.
response_formatstring- 'text' (default) or 'json'
tagsarray- Array of strings to tag the short link for organization (e.g., ['campaign', 'social-media'])
titlestring- Custom title for the short link to help with organization and identification.
bitlymcp_bitly_create_short_link_with_qrCreate a new short link and a QR code that encodes that link in one step.WriteBitly Create Short Link With Qr
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, so a single approval covers both operations. The QR code is always tied to the newly created short link (bitlink_id from the create response). For link-only or QR-only workflows, use bitly_create_short_link or bitly_create_qr_code instead.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
archivedboolean- Whether the QR code should be archived (default: false).
bitlink_idstring- An existing Bitly link to reuse as the destination (with keyword to add a custom back-half). Optional: provide either long_url or bitlink_id.
domainstring- Custom short domain (e.g. bit.ly).
dynamic_routingarray- Optional dynamic routing rules that redirect visitors to different destinations based on their country, region, device, or OS. Provide an array of up to 10 rule objects; each rule must include 'long_url' plus at least one match/exclude condition. All of a rule's conditions must match for it to apply, and rules are evaluated top to bottom — the first matching rule wins. Fields per rule: 'long_url' (string, required) — destination for matching visitors; 'country_match'/'country_exclude' (array of ISO 3166-1 alpha-2 codes, e.g. ["US","GB"]); 'region_match'/'region_exclude' (array of ISO 3166-2 codes formatted 'CC-SUB', e.g. ["US-CA"]; the region's country must also appear in country_match); 'device_match'/'device_exclude' (array of "mobile", "tablet", or "desktop"); 'os_match'/'os_exclude' (array of "ios" or "android"). Example: [{"long_url":"https://example.com/us","country_match":["US"],"os_match":["ios"]},{"long_url":"https://example.com/row","country_exclude":["US"]}]. Omit to leave existing routing unchanged. When updating, the provided rules replace all existing rules (not additive); pass an empty array ([]) to remove all rules.
keywordstring- Custom back-half for the short link.
long_urlstring- URL to shorten. Required unless bitlink_id is provided (same rules as bitly_create_short_link).
qr_titlestring- Title for the QR code; defaults to the link title when omitted.
render_customizationsobject- QR appearance (same as bitly_create_qr_code). Example shape: { "background_color":"#ffffff", "dot_pattern_color":"#EF8000", "dot_pattern_type":"rounded", "corners":{ "corner_1":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" }, "corner_2":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" }, "corner_3":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" } }, "gradient":{ "style":"linear", "angle":45, "colors":[ { "color":"#c80404", "offset":10 }, { "color":"#042f86", "offset":90 } ], "exclude_corners":false }, "background_gradient":{ "style":"radial", "colors":[ { "color":"#c696ee", "offset":25 }, { "color":"#d4e1a8", "offset":50 } ] }, "logo":{ "image_guid":"bitlylogo" }, "frame":{ "id":"text_bottom", "colors":{ "primary":"#f55656", "background":"#ffffff" }, "text":{ "primary":{ "content":"QR Frame" }, "secondary":{ "content":"Frame Text" } } }, "branding":{ "bitly_brand":true }, "spec_settings":{ "error_correction":4 } }
response_formatstring- 'text' (default) or 'json'
tagsarray- Tags for the short link.
titlestring- Title for the short link.
bitlymcp_bitly_create_siteCreate a new, empty Bitly Site (link-in-bio page) for a group at a short URL, using default appearance.WriteBitly Create Site
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 with bitly_create_site_block and bitly_create_site_container, style it with bitly_update_site_appearance, then make it live with bitly_publish_site.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
uristringrequired- The short URL for the site. Pass just a keyword ('mysite'), a domain and keyword ('bit.ly/mysite'), or the full 'domain/m/keyword' form; the '/m/' path segment is added automatically, and a bare keyword assumes the bit.ly domain. The domain must be bit.ly, another Bitly domain, or a branded short domain the group can use.
display_namestring- The site's display name (heading). Defaults to a system value when omitted.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_create_site_blockAdd a content block to a Bitly Site: a bitlink button, social icon, YouTube video, image, digital business card, or text block.WriteBitly Create Site Block
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) by default. The change is a draft; publish it with bitly_publish_site. For a YouTube block, call bitly_prevalidate_site_button first to resolve the video. To nest the block in a grid/carousel, create the container first with bitly_create_site_container and pass its ID as 'parent'.
Inputs
contentobjectrequired- The block's content object, whose shape depends on content_type. Examples: bitlink -> {"bitlink_id":"bit.ly/abc","link_title":"My link"}; social -> {"channel":"instagram","url":"https://instagram.com/me"}; youtubeVideo -> {"video_id":"...","link_title":"..."} (prevalidate first with bitly_prevalidate_site_button); image -> {"image_guid":"...","image_url":"..."}; digital_business_card -> {"layout":"card","first_name":"John","last_name":"Doe","company":"...","job_title":"...","download_enabled":false,"contacts":[{"contact_method":"phone","method_type":"mobile","value":"555-555-1234","sort_order":0},{"contact_method":"website","method_type":"personal","value":"https://example.com/jon","sort_order":1}]} (layout is REQUIRED: one of 'button', 'card', 'inline'; contact fields like phone/email/website/location/note go in the contacts array, NOT as top-level keys; each contact needs a contact_method of phone|email|location|website|note, a method_type (e.g. phone: mobile/home/work/personal/main/fax/office/other; email: work/personal/home/other; website: personal/work/company/homepage/other; location: address/home/work/other), a value, and a unique sort_order that is sequential across contacts; link_title is required only when layout is 'button'); text_block -> {"text":"..."}. The API validates the shape for the given content_type.
content_typestringrequired- The kind of content block: 'bitlink' (a link to a short link), 'social' (a social channel icon), 'youtubeVideo' (an embedded video), 'image', 'digital_business_card', or 'text_block'.one of
bitlinksocialyoutubeVideoimagedigital_business_cardtext_block site_idstringrequired- The unique identifier of the Bitly Site
appearanceobject- Optional appearance object; only applies to text_block content (alignment, font_size, colors).
is_activeboolean- Whether the block is active (visible) on the site. When creating a block, this defaults to true if omitted; when updating, omitting it leaves the current state unchanged.
is_pinnedboolean- Whether the block is pinned. Only blocks on the root (no parent container) can be pinned.
parentstring- Optional container block ID to nest this block inside (a grid or carousel created with bitly_create_site_container). Omit to place it at the root.
response_formatstring- 'text' (default) or 'json'
schedule_endstring- Optional RFC 3339 timestamp when the block should become inactive.
schedule_startstring- Optional RFC 3339 timestamp when the block should become active.
bitlymcp_bitly_create_site_containerCreate a container (a grid or carousel) on a Bitly Site to group content blocks.WriteBitly Create Site Container
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 blocks with bitly_create_site_block, passing the returned container's block ID as the 'parent'.
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
typestringrequired- The container type: 'grid' or 'carousel'.one of
gridcarousel response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_create_site_imageRegister an already-uploaded image for use on a Bitly Site (e.g.WriteBitly Create Site Image
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 and URL first; this associates it with the site for a given use. Returns the image's URL and GUID to reference in appearance or content updates.
Inputs
image_guidstringrequired- The GUID of the previously uploaded image.
image_usestringrequired- How the image is used on the site (its position/role, e.g. avatar or background). Must be a valid site image use.
site_idstringrequired- The unique identifier of the Bitly Site
urlstringrequired- The URL of the uploaded image.
cropstring- Optional crop coordinates as a JSON-encoded rectangle string.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_discard_site_draftDiscard a Bitly Site's unpublished draft, reverting in-progress edits back to the currently published version.WriteBitly Discard Site Draft
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 site down, use bitly_delete_site.
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_export_dataExport link or QR data as CSV.WriteBitly Export Data
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, base64, or data_uri into chat; tell the user the file is ready to download. Dates: use unix_from_date and unix_to_date as YYYY-MM-DD (UTC); the server converts to timestamps. For relative ranges (e.g. "last 30 days", "this month"), derive dates from system context. Choose export_type by what the user asked for: link_engagements_timeseries — one CSV row per calendar day (never monthly). REQUIRED when the user says daily, by day, each day, per day, time series, engagements over time, or any daily metrics export — even without an explicit date range. Never use link_engagements_batch for those. One known link: bitlinks=["domain.com/backhalf"] (fully qualified short URL). Multiple links: filter (tags, destination, domain, query, etc.) for dashboard link-performance columns (Date, Short Link, Destination, Clicks, QR Scans, Button Clicks, Total Engagements) — one row per link per day. For link_engagements_timeseries always set unix_from_date and unix_to_date: use the user's range if given; otherwise default to the last 30 days from system context. link_engagements_batch — one row per link with period totals (Link, Title, clicks/scans/button_clicks for the whole range). Use only for summary tables with no daily breakdown (e.g. "total engagements per link"). links_list — link metadata CSV (filter required; optional include_metrics). qr_codes_list — QR metadata CSV (filter required; optional include_metrics). For link_engagements_timeseries and link_engagements_batch: provide bitlinks OR filter, not both. For link_engagements_timeseries, always pass unix_from_date/unix_to_date (default last 30 days if the user did not specify a range). For link_engagements_batch and list exports, omitting dates falls back to the tier max-history window. Filter tips: filter.destination (hostname, hostname/path, or path) for "links pointing to destination.com" — prefer over filter.query; filter.tags for tag-based sets; filter.query for free-text search on title/tags/URLs. Row caps: up to 200 matched links for engagement exports (bitlinks list or filter resolution); if truncated is true, only the first 200 links were included — say the export is partial and ask the user to narrow filter (tags, destination, domain, dates, campaign, query) or split bitlinks into batches of 200 or fewer. If the API returns EXPORT_TOO_LARGE, the link×day grid exceeds the inline limit — ask the user to narrow the date range or filter to fewer links. Do not state or infer a total match count. For links_list/qr_codes_list with include_metrics, cap is 200 rows; without metrics, 1000. Do not auto-retry bitly_export_data — wait for the user.
Inputs
export_typestringrequired- Which export shape to produce. "link_engagements_timeseries" — one row per calendar day (use for daily/by-day/time-series requests; never monthly). "link_engagements_batch" — one row per link with period totals only (no daily breakdown). "links_list" — link metadata list. "qr_codes_list" — QR metadata list. See the tool description for columns, filters, and date parameters.
group_guidstringrequired- The unique identifier of the group (workspace)
bitlinksarray- Explicit list of fully qualified bitlinks (e.g. "bit.ly/abc"). Used by link_engagements_timeseries and link_engagements_batch when you already know the exact bitlinks. Mutually exclusive with `filter` (provide one or the other). Hard-capped at 200 matched links; oversized lists set truncated=true.
filterobject- Server-side filter object resolved against the user's brand. Required for export_type "links_list" and "qr_codes_list"; optional for "link_engagements_batch" and "link_engagements_timeseries" (mutually exclusive with `bitlinks`). Accepted fields: "tags" (string array), "domain" (string), "archived" ("on"/"off"/"both"), "query" (free-text search across title, tags, and URLs), "destination" (hostname, hostname/path, or path prefix — matches link destination URLs; prefer over query for "links pointing to destination.com"), "created_after_date" ("YYYY-MM-DD", UTC start-of-day inclusive — preferred over created_after), "created_before_date" ("YYYY-MM-DD", UTC start-of-following-day exclusive — preferred over created_before), "campaign_guid" (string; ignored for qr_codes_list).
include_metricsboolean- For links_list and qr_codes_list only. Appends clicks, scans, button_clicks columns (requires unix_from_date/unix_to_date). Row cap is 200 instead of 1000. Ignored for link_engagements_batch and link_engagements_timeseries.
response_formatstring- 'text' (default) or 'json'
unix_from_datestring- Start of the metrics date range as "YYYY-MM-DD" (UTC). Maps to midnight (00:00:00 UTC) of that day. Required for link_engagements_timeseries (default last 30 days if the user did not specify a range). Also used by link_engagements_batch and list exports with include_metrics=true. Clamped to the user's tier data window. Example: "2026-05-01".
unix_to_datestring- End of the metrics date range as "YYYY-MM-DD" (UTC). Maps to 23:59:59 UTC of that day (inclusive). Must be the same day as or after unix_from_date when both are set. Example: "2026-05-18".
bitlymcp_bitly_get_bulk_uploadGet the status of one bulk upload.WriteBitly Get Bulk Upload
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: - "pending": the file is uploaded and waits for processing - "in_progress": the file is being processed - "success": every row was processed - "partial_success": some rows failed; the report lists them - "failure": no rows were processed When processing is complete, report_url links to the report with the result of each row.
Inputs
bulk_upload_idstringrequired- The id that bitly_create_bulk_upload returned.
organization_guidstringrequired- The organization that owns the bulk uploads. Get it from bitly_get_organizations.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_bulk_uploadsList the organization's bulk uploads with their status, newest first.WriteBitly Get Bulk Uploads
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 upload appears in this list when processing starts; for an upload that still waits for processing, use bitly_get_bulk_upload with its id.
Inputs
organization_guidstringrequired- The organization that owns the bulk uploads. Get it from bitly_get_organizations.
response_formatstring- 'text' (default) or 'json'
search_afterstring- Pagination cursor for retrieving the next page of results
sizestring- Number of bulk uploads to return (default: 50, max: 100)
upload_typestring- Return only bulk uploads of this type.one of
linkqr_codecoupled_link
bitlymcp_bitly_get_custom_domain_detailsGet one custom domain's setup state and settings: verification status ('pending', 'ok', or 'error') with any verification error, attached groups, and, once verified, HTTPS/HSTS, redirect, and SSL certificate details.WriteBitly Get Custom Domain Details
Get one custom domain's setup state and settings: verification status ('pending', 'ok', or 'error') with any verification error, attached groups, and, once verified, HTTPS/HSTS, redirect, and SSL certificate details. Works for domains still being set up, so use it to check whether a domain added with bitly_create_custom_domain has verified yet. Requires membership in a group the domain is attached to, or an admin role in the owning organization.
Inputs
custom_domainstringrequired- The custom domain, e.g. 'links.example.com' (a subdomain) or 'example.link' (a root domain).
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_custom_domain_dnsGet the DNS records a custom domain needs at its registrar, the records currently resolving, and whether they match.WriteBitly Get Custom Domain Dns
Get the DNS records a custom domain needs at its registrar, the records currently resolving, and whether they match. Use this right after bitly_create_custom_domain to tell the user exactly which records to create (a subdomain needs one CNAME; a root domain needs two A records), and again when a domain stays 'pending' or reports 'error'. Only answers for a domain already added to the organization (pending counts), so call bitly_create_custom_domain first. A fresh record can take time to propagate; empty current records do not mean the records are wrong.
Inputs
custom_domainstringrequired- The custom domain, e.g. 'links.example.com' (a subdomain) or 'example.link' (a root domain).
organization_guidstringrequired- The unique identifier of the organization that owns (or will own) the custom domain. The caller must belong to this organization, and must be one of its admins for any tool that creates or changes a domain. Get it from bitly_get_organizations.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_domain_agreementsGet 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, and the agreement keys to send with the registration.WriteBitly Get Domain Agreements
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, and the agreement keys to send with the registration. Show the user the title and link of the agreement and get an explicit acceptance, then pass all of the agreement keys to bitly_create_complimentary_domain. The keys are internal IDs, not agreements: never show or describe them to the user. Never accept the agreement for the user.
Inputs
domainstringrequired- The root domain to register, e.g. 'example.link'. Pick it from the results of bitly_search_available_domains; subdomains cannot be registered.
organization_guidstringrequired- The unique identifier of the organization that owns (or will own) the custom domain. The caller must belong to this organization, and must be one of its admins for any tool that creates or changes a domain. Get it from bitly_get_organizations.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_group_sitesList the Bitly Sites (link-in-bio pages / microsites) in a group (workspace), with URL filtering and pagination.WriteBitly Get Group Sites
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 by URL when you don't have its site ID. A Bitly Site is a landing page of buttons/links reachable at a short URL; manage an individual site with bitly_get_site, bitly_create_site, and bitly_update_site.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
response_formatstring- 'text' (default) or 'json'
search_afterstring- Pagination cursor for the next page of results
sites_url_paramstring- Filter sites by URL substring
sizestring- Number of sites to return (default: 50, max: 100)
bitlymcp_bitly_get_link_destinationLook up where a short link points: returns its destination long URL plus basic fields (creation time, link ID, and any dynamic-routing destination URLs).WriteBitly Get Link Destination
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 for any bitlink, including links you don't own. Use this when the user just wants a short link's destination or to verify where it redirects. For full owned-link metadata (tags, creator, campaigns, QR codes, routing rule conditions), use bitly_get_short_link_details instead.
Inputs
bitlink_idstringrequired- The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_organization_custom_domainsList the custom domains of an organization with their setup state: verification status ('pending', 'ok', or 'error'), attached groups, and, once verified, HTTPS/HSTS and redirect settings.WriteBitly Get Organization Custom Domains
List the custom domains of an organization with their setup state: verification status ('pending', 'ok', or 'error'), attached groups, and, once verified, HTTPS/HSTS and redirect settings. Includes domains still being set up. Requires an organization admin; without organization_guid it lists the domains of every organization the caller administers. Use this to check on a domain setup or to review an organization's domain configuration. For the plain list of domains the user can shorten with, use bitly_get_custom_domains instead.
Inputs
organization_guidstring- Optional organization GUID to list the custom domains of one organization. Omit to list the domains of every organization the caller administers.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_siteGet 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 changes.WriteBitly Get Site
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 changes. To find a site ID, list a group's sites with bitly_get_group_sites.
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_get_site_analyticsGet analytics for a single Bitly Site (link-in-bio page).WriteBitly Get Site Analytics
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 site), 'button_clicks' (clicks on the site's buttons/links), 'dbc_downloads' (digital business card downloads), 'overview' (a page-views + button-clicks rollup), or 'link_performance' (per-button click totals) — and a dimension: a facet breakdown (countries, cities, devices, referrers), 'over_time' (time series), 'summary' (a total), or 'top' (most-clicked buttons). Valid dimensions per dataset — button_clicks: cities, countries, devices, over_time, top; dbc_downloads: over_time; link_performance: summary; overview: summary; page_views: cities, countries, devices, over_time, referrers, summary. For a single short link's clicks use bitly_get_link_analytics; for a whole group use bitly_get_group_analytics.
Inputs
datasetstringrequired- What to measure: 'page_views' (site visits), 'button_clicks' (clicks on the site's buttons), 'dbc_downloads' (digital business card downloads), 'overview' (page-views + button-clicks rollup), or 'link_performance' (per-button click totals).one of
button_clicksdbc_downloadslink_performanceoverviewpage_views dimensionstringrequired- The report to return. Valid values depend on the dataset — button_clicks: cities, countries, devices, over_time, top; dbc_downloads: over_time; link_performance: summary; overview: summary; page_views: cities, countries, devices, over_time, referrers, summary.one of
citiescountriesdevicesover_timereferrerssummarytop site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
sizenumber- Maximum number of results to return (default varies)
unitstring- Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: dayone of
minutehourdayweekmonth unit_referencestring- ISO 8601 timestamp for the END of the time range. The range is the last 'units' periods ending on this date (e.g. '2025-02-28T00:00:00+0000' with units=28 gives all of February). For a full month, use the last day of that month (e.g. 2026-02-28 for Feb 2026). Omit for default: now.
unitsstring- Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.
bitlymcp_bitly_get_site_templatesList Bitly Site templates that can be applied to a site, optionally filtered by category.WriteBitly Get Site Templates
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.
Inputs
categorystring- Filter templates by category (e.g. 'Link-in-bio', 'Digital business card', 'Image gallery').
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_prevalidate_custom_domainCheck whether a domain the user already owns can be connected to an organization as a custom domain, without creating anything.WriteBitly Prevalidate Custom Domain
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, or blocklisted domain, one held by another Bitly account, and an organization at its custom domain limit. Use this before bitly_create_custom_domain to confirm the domain with the user; it is safe to call repeatedly. Requires an organization admin.
Inputs
custom_domainstringrequired- The custom domain, e.g. 'links.example.com' (a subdomain) or 'example.link' (a root domain).
organization_guidstringrequired- The unique identifier of the organization that owns (or will own) the custom domain. The caller must belong to this organization, and must be one of its admins for any tool that creates or changes a domain. Get it from bitly_get_organizations.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_publish_sitePublish a Bitly Site's draft so the current edits go live.WriteBitly Publish Site
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 has unpublished changes.
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_search_available_domainsSearch for new domains that Bitly can register for an organization as its complimentary custom domain, at no cost to the user.WriteBitly Search Available Domains
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 full domain ('acme.link') and returns up to 25 available root domains; a full domain also gets its own availability. Every result was available to register when the search ran. Use this when the user wants a new branded domain and does not own one; for a domain the user already owns, use bitly_prevalidate_custom_domain instead. Next steps: bitly_get_domain_agreements for the chosen domain, then bitly_create_complimentary_domain.
Inputs
organization_guidstringrequired- The unique identifier of the organization that owns (or will own) the custom domain. The caller must belong to this organization, and must be one of its admins for any tool that creates or changes a domain. Get it from bitly_get_organizations.
querystringrequired- A keyword or a full domain, at most 32 bytes (fewer characters for non-ASCII names), e.g. 'acme' or 'acme.link'. Use the brand or company name the user gave.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_update_custom_domainUpdate a verified custom domain's settings: where the bare domain and unknown paths redirect, and HTTPS/HSTS behavior.WriteBitly Update Custom Domain
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 fields are left as-is. Requires an admin of the owning organization; a domain that is not yet verified returns CUSTOM_DOMAIN_NOT_VERIFIED, so wait for verification rather than retrying. To attach the domain to a group use bitly_update_group; to make it a group's default use bitly_update_group_preferences.
Inputs
custom_domainstringrequired- The custom domain, e.g. 'links.example.com' (a subdomain) or 'example.link' (a root domain).
hsts_enabledboolean- Whether to send the HTTP Strict Transport Security header, forcing browsers to use HTTPS on later visits. Only send it when the user asked to change it.
https_enabledboolean- Whether links on this domain are served over HTTPS. Only send it when the user asked to change it.
response_formatstring- 'text' (default) or 'json'
root_redirectstring- URL that visitors to the bare domain (no path) are redirected to, e.g. 'https://www.example.com'. Pass an empty string ('') to clear it.
upgrade_insecure_requestsboolean- Whether to send the upgrade-insecure-requests header so browsers upgrade HTTP requests to HTTPS. Only send it when the user asked to change it.
wildcard_redirectstring- URL that visitors to an unknown or expired path are redirected to instead of a 404, e.g. 'https://www.example.com/not-found'. Pass an empty string ('') to clear it.
bitlymcp_bitly_update_groupRename a group (workspace) or change which custom domains it can shorten links with.WriteBitly Update Group
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, first read the current list with bitly_get_group_details and pass it back with the new domain appended; omitting a domain the group has today detaches it. Only verified domains of the group's organization can be attached (see bitly_get_organization_custom_domains). Only the fields you send change. Requires a group admin. To make an attached domain the group's default for new links, use bitly_update_group_preferences.
Inputs
group_guidstringrequired- The unique identifier of the group (workspace)
bsdsarray- The complete list of custom domains the group may use, e.g. ["links.example.com"]. Replaces the current list, so include every domain that should stay attached. Pass an empty array ([]) to detach all domains. Omit to leave unchanged.
namestring- New name for the group. Omit to leave unchanged.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_update_group_preferencesSet a group's default (preferred) short domain, used when a link is created for the group without an explicit domain.WriteBitly Update Group Preferences
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 domain already attached to the group (see bitly_get_group_details; attach one with bitly_update_group). Requires a group admin. Use this as the last step of a custom domain setup once the domain is verified.
Inputs
domain_preferencestringrequired- The domain to use by default for new links in this group, e.g. 'links.example.com' or 'bit.ly'. Must already be attached to the group.
group_guidstringrequired- The unique identifier of the group (workspace)
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_update_group_short_linksUpdate the archive state or tags on up to 100 short links in a group at once.WriteBitly Update Group Short Links
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.
Inputs
actionstringrequired- `archive` updates archived state. `edit_tags` updates tagsone of
archiveedit_tags group_guidstringrequired- The unique identifier of the group (workspace)
linksarrayrequired- Short links in 'domain/hash' format, e.g. `bit.ly/ABC123`. Up to 100, all in the group.
add_tagsarray- Tags to add. Only valid when `action` is `edit_tags`.
archiveboolean- Whether to archive or unarchive the links. ALWAYS SEND when `action` is `archive`- an omitted value is interpreted as false.
remove_tagsarray- Tags to remove. Only valid when `action` is `edit_tags`.
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_update_qr_codeUpdate an existing QR code's title, visual customizations, archived status, expiration, or dynamic routing rules.WriteBitly Update Qr Code
Update an existing QR code's title, visual customizations, archived status, expiration, or dynamic routing rules. Use this to restyle a QR code, archive/unarchive it, or change its routing. Dynamic routing is only supported on QR codes with a long_url destination (decoupled); for a QR backed by an existing short link (coupled), set routing on the link via bitly_update_short_link instead. Rules you send replace all existing rules.
- Idempotent
Inputs
qrcode_idstringrequired- The QR code ID to update
archivedboolean- Whether the QR code should be archived
dynamic_routingarray- Optional dynamic routing rules that redirect visitors to different destinations based on their country, region, device, or OS. Provide an array of up to 10 rule objects; each rule must include 'long_url' plus at least one match/exclude condition. All of a rule's conditions must match for it to apply, and rules are evaluated top to bottom — the first matching rule wins. Fields per rule: 'long_url' (string, required) — destination for matching visitors; 'country_match'/'country_exclude' (array of ISO 3166-1 alpha-2 codes, e.g. ["US","GB"]); 'region_match'/'region_exclude' (array of ISO 3166-2 codes formatted 'CC-SUB', e.g. ["US-CA"]; the region's country must also appear in country_match); 'device_match'/'device_exclude' (array of "mobile", "tablet", or "desktop"); 'os_match'/'os_exclude' (array of "ios" or "android"). Example: [{"long_url":"https://example.com/us","country_match":["US"],"os_match":["ios"]},{"long_url":"https://example.com/row","country_exclude":["US"]}]. Omit to leave existing routing unchanged. When updating, the provided rules replace all existing rules (not additive); pass an empty array ([]) to remove all rules.
expiration_atstring- Optional expiration timestamp in ISO 8601 format 'YYYY-MM-DDTHH:MM:SS+0000' (e.g. "2026-12-31T23:59:59+0000"). Only supported on QR codes with a long_url destination, not ones backed by an existing short link, and on accounts entitled to link expiration; the API rejects it otherwise. When updating, pass an empty string ("") to remove an existing expiration; omit to leave it unchanged.
render_customizationsobject- Customize the look of the QR code. Apply 'foreground' colors to all corners and the pips. Space gradient colors evenly if no offsets are specified. Strictly follow the naming and structure of this example (non-relevant values can be left out): { "background_color":"#ffffff", "dot_pattern_color":"#EF8000", "dot_pattern_type":"rounded", "corners":{ "corner_1":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" }, "corner_2":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" }, "corner_3":{ "inner_color":"#EF8000", "outer_color":"#EF8000", "shape":"leaf" } }, "gradient":{ "style":"linear", "angle":45, "colors":[ { "color":"#c80404", "offset":10 }, { "color":"#042f86", "offset":90 } ], "exclude_corners":false }, "background_gradient":{ "style":"radial", "colors":[ { "color":"#c696ee", "offset":25 }, { "color":"#d4e1a8", "offset":50 } ] }, "logo":{ "image_guid":"bitlylogo" }, "frame":{ "id":"text_bottom", "colors":{ "primary":"#f55656", "background":"#ffffff" }, "text":{ "primary":{ "content":"QR Frame" }, "secondary":{ "content":"Frame Text" } } }, "branding":{ "bitly_brand":true }, "spec_settings":{ "error_correction":4 } }
response_formatstring- 'text' (default) or 'json'
titlestring- The new title for the QR code
bitlymcp_bitly_update_short_linkUpdate an existing short link's destination URL, title, tags, or archived status, and set its dynamic routing rules by country, region, device, or OS.WriteUpdate Short Link
Update an existing short link's destination URL, title, tags, or archived status, and set its dynamic routing rules by country, region, device, or OS. Dynamic routing rules provided here replace all existing rules; pass an empty array to clear them.
- Idempotent
Inputs
bitlink_idstringrequired- The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')
archivedboolean- Set to true to archive the short link, false to unarchive it. Archived links are hidden from most views but still work.
dynamic_routingarray- Optional dynamic routing rules that redirect visitors to different destinations based on their country, region, device, or OS. Provide an array of up to 10 rule objects; each rule must include 'long_url' plus at least one match/exclude condition. All of a rule's conditions must match for it to apply, and rules are evaluated top to bottom — the first matching rule wins. Fields per rule: 'long_url' (string, required) — destination for matching visitors; 'country_match'/'country_exclude' (array of ISO 3166-1 alpha-2 codes, e.g. ["US","GB"]); 'region_match'/'region_exclude' (array of ISO 3166-2 codes formatted 'CC-SUB', e.g. ["US-CA"]; the region's country must also appear in country_match); 'device_match'/'device_exclude' (array of "mobile", "tablet", or "desktop"); 'os_match'/'os_exclude' (array of "ios" or "android"). Example: [{"long_url":"https://example.com/us","country_match":["US"],"os_match":["ios"]},{"long_url":"https://example.com/row","country_exclude":["US"]}]. Omit to leave existing routing unchanged. When updating, the provided rules replace all existing rules (not additive); pass an empty array ([]) to remove all rules.
long_urlstring- New destination URL to redirect the short link to. Use this to change where the short link points.
response_formatstring- 'text' (default) or 'json'
tagsarray- Array of strings to replace the current tags. Pass empty array to remove all tags. Leave undefined to keep current tags.
titlestring- New title for the short link. Leave empty to keep current title unchanged.
bitlymcp_bitly_update_siteUpdate a Bitly Site's URI, display name, description, or attach a QR code.WriteBitly Update Site
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 string ('') clears display_name/description. Changing the URI creates a redirect from the old one. To attach a QR code: create it first with bitly_create_qr_code, then pass its qr_code_id here (a site can only be attached to one QR code).
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
descriptionstring- New description; pass an empty string ('') to clear it, omit to leave unchanged.
display_namestring- New display name; pass an empty string ('') to clear it, omit to leave unchanged.
qr_code_idstring- The ID of a QR code to attach to this site. The site must not already have a QR code attached. Create one first with bitly_create_qr_code.
response_formatstring- 'text' (default) or 'json'
uristring- New short URL. Pass just a keyword ('mysite'), a domain and keyword ('bit.ly/mysite'), or the full 'domain/m/keyword' form; the '/m/' path segment is added automatically, and a bare keyword assumes the bit.ly domain. Changing it creates a redirect from the previous URI.
bitlymcp_bitly_update_site_appearanceReplace a Bitly Site's appearance: theme, layout, fonts, and colors.WriteBitly Update Site Appearance
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 set. Fetch the current appearance with bitly_get_site (response_format 'json') first to see the existing values. The change is a draft; publish it with bitly_publish_site.
Inputs
appearanceobjectrequired- The full appearance object to set. Fields include: 'theme_id' (number), 'layout' (string), 'layout_v2' (number), 'font' (string), 'style_preference' (string, e.g. 'theme' or 'custom'), 'hide_bitly_logo' (bool), color hex strings 'background_color', 'text_color', 'description_color', 'bottom_background_color', and a nested 'header_appearance' object. Colors are hex codes like '#FFFFFF'. When style_preference is 'custom', theme_id must be 0.
site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_update_site_blockUpdate an existing block on a Bitly Site, replacing its content (and appearance for text blocks).WriteBitly Update Site Block
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 destination, title, or description; for other blocks it depends on the block type. The block type is taken from the stored block, so it cannot be changed. Fetch the block's ID with bitly_get_site. The change is a draft; publish it with bitly_publish_site.
Inputs
block_idstringrequired- The unique identifier of the block to update
contentobjectrequired- The block's content object, whose shape depends on content_type. Examples: bitlink -> {"bitlink_id":"bit.ly/abc","link_title":"My link"}; social -> {"channel":"instagram","url":"https://instagram.com/me"}; youtubeVideo -> {"video_id":"...","link_title":"..."} (prevalidate first with bitly_prevalidate_site_button); image -> {"image_guid":"...","image_url":"..."}; digital_business_card -> {"layout":"card","first_name":"John","last_name":"Doe","company":"...","job_title":"...","download_enabled":false,"contacts":[{"contact_method":"phone","method_type":"mobile","value":"555-555-1234","sort_order":0},{"contact_method":"website","method_type":"personal","value":"https://example.com/jon","sort_order":1}]} (layout is REQUIRED: one of 'button', 'card', 'inline'; contact fields like phone/email/website/location/note go in the contacts array, NOT as top-level keys; each contact needs a contact_method of phone|email|location|website|note, a method_type (e.g. phone: mobile/home/work/personal/main/fax/office/other; email: work/personal/home/other; website: personal/work/company/homepage/other; location: address/home/work/other), a value, and a unique sort_order that is sequential across contacts; link_title is required only when layout is 'button'); text_block -> {"text":"..."}. The API validates the shape for the given content_type.
site_idstringrequired- The unique identifier of the Bitly Site
appearanceobject- Optional appearance object; only applies to text_block content (alignment, font_size, colors).
is_activeboolean- Whether the block is active (visible) on the site. When creating a block, this defaults to true if omitted; when updating, omitting it leaves the current state unchanged.
is_pinnedboolean- Whether the block is pinned. Only blocks on the root (no parent container) can be pinned.
parentstring- Optional container block ID to nest this block inside (a grid or carousel created with bitly_create_site_container). Omit to place it at the root.
response_formatstring- 'text' (default) or 'json'
schedule_endstring- Optional RFC 3339 timestamp when the block should become inactive.
schedule_startstring- Optional RFC 3339 timestamp when the block should become active.
bitlymcp_bitly_delete_short_linkPermanently delete a non-customized short link.DestructiveDelete Short Link
Permanently delete a non-customized short link. Only works for links without overrides, campaigns, deeplinks, or page usage, and requires group administrator access. Analytics data is preserved, but the deletion itself cannot be undone.
- Idempotent
Inputs
bitlink_idstringrequired- The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_delete_siteDeactivate (delete) a Bitly Site.DestructiveBitly Delete Site
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 instead.
Inputs
site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_delete_site_blockDelete 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 container (which also deletes the blocks inside it).DestructiveBitly Delete Site Block
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 container (which also deletes the blocks inside it). Fetch the block's ID with bitly_get_site. The change is a draft; publish it with bitly_publish_site.
Inputs
block_idstringrequired- The ID of the block to delete.
site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
bitlymcp_bitly_delete_site_redirectDelete a redirect from a Bitly Site.DestructiveBitly Delete Site Redirect
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 old domain and keyword. Inspect a site's redirects with bitly_get_site (response_format 'json').
Inputs
domainstringrequired- The redirect's domain (e.g. 'bit.ly').
keywordstringrequired- The redirect's keyword (the path after the domain).
site_idstringrequired- The unique identifier of the Bitly Site
response_formatstring- 'text' (default) or 'json'
No tools match.