The LinklyHQ MCP connector routes your AI agent's tool calls to LinklyHQ's own MCP server through Scalekit. Each user signs in to LinklyHQ once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 25 tools.
- Tools
- 25
- What they doRead · write · destructive
- 13 · 7 · 513 read7 write5 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
What you can do
- Create and manage short links: shorten URLs, update destinations and tracking tags, and delete links one by one or in bulk
- Find links: list links or search them by name, destination URL, or note
- Analyze clicks: get click counts over time, break them down by country, platform, or browser, and export click details
- Get click webhooks: subscribe and unsubscribe webhook URLs for click events on one link or the whole workspace
- Manage custom domains: add, list, and remove custom domains and update their favicons
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 LinklyHQ MCP connection
In AgentKit > Connections, create a LinklyHQ MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for LinklyHQ MCP server, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.
Use your own OAuth app
LinklyHQ MCP uses Dynamic Client Registration (DCR), so you don’t need a client ID or secret. Create a connection in Scalekit, then have each user authorize their LinklyHQ account.
-
Create a connection in Scalekit
- In the Scalekit dashboard, go to AgentKit > Connections > Create Connection.
- Search for LinklyHQ MCP and click Create.
- Note the Connection name. Use it as
connection_namein your code, for examplelinklymcp.
-
Authorize your LinklyHQ account
Generate an authorization link and open it in a browser. The user signs in to LinklyHQ and grants access to their workspace.
Scalekit stores the token and adds it to every tool call, so no further configuration is needed.
-
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 = 'linklymcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize LinklyHQ 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: 'linklymcp_export_clicks',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 = "linklymcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize LinklyHQ MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="linklymcp_export_clicks",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_toollinklymcp_export_clicksExport detailed click records with full information including timestamp, browser, country, URL, platform, referrer, bot status, ISP, and URL parameters.Read-onlyExport Clicks
Export detailed click records with full information including timestamp, browser, country, URL, platform, referrer, bot status, ISP, and URL parameters.
Inputs
botsstring- Bot filteringone of
includeexcludeonly countrystring- Filter by country code
endstring- End date in YYYY-MM-DD format (default: yesterday)
link_idinteger- Filter by specific link ID
platformstring- Filter by platform
startstring- Start date in YYYY-MM-DD format (default: 30 days ago)
linklymcp_get_analyticsGet time-series click analytics data for charting.Read-onlyGet Analytics
Get time-series click analytics data for charting. Returns click counts over time with optional date range, link, and demographic filters.
Inputs
botsstring- Bot filtering: include (default), exclude, or onlyone of
includeexcludeonly browserstring- Filter by browser name
countrystring- Filter by country code (e.g., 'US', 'GB')
endstring- End date in YYYY-MM-DD format (default: today)
frequencystring- Time granularity: 'day' (default) or 'hour'one of
dayhour link_idinteger- Filter by specific link ID
platformstring- Filter by platform (e.g., 'desktop', 'mobile', 'tablet')
startstring- Start date in YYYY-MM-DD format (default: 30 days ago)
uniqueboolean- Count unique clicks only (by IP)
linklymcp_get_analytics_byGet click counts grouped by a dimension such as country, platform, or browser.Read-onlyGet Analytics by Dimension
Get click counts grouped by a dimension such as country, platform, or browser. Useful for breakdowns and top-N reports.
Inputs
counterstringrequired- Dimension to group by (required)one of
countryplatformrefererisplink_iddestinationbot_name botsstring- Bot filteringone of
includeexcludeonly countrystring- Filter by country code
endstring- End date in YYYY-MM-DD format (default: today)
link_idinteger- Filter by specific link ID
platformstring- Filter by platform
startstring- Start date in YYYY-MM-DD format (default: 30 days ago)
uniqueboolean- Count unique clicks only
linklymcp_get_clicksGet recent click data for the workspace, optionally filtered by a specific link ID.Read-onlyGet Clicks
Get recent click data for the workspace, optionally filtered by a specific link ID.
Inputs
link_idinteger- Filter clicks by link ID. Provide the integer ID of the link to scope results to that link only. If omitted, returns clicks across all links in the workspace.
linklymcp_get_linkGet details of a specific LinklyHQ link by its ID, including destination URL, slug, UTM parameters, and settings.Read-onlyGetLink
Get details of a specific LinklyHQ link by its ID, including destination URL, slug, UTM parameters, and settings.
Inputs
link_idintegerrequired- The ID of the link to retrieve
linklymcp_list_domainsList all custom domains configured in the LinklyHQ workspace.Read-onlyList Domains
List all custom domains configured in the LinklyHQ workspace.
Inputs
This tool takes no inputs.
linklymcp_list_link_webhooksList all webhook URLs subscribed to a specific LinklyHQ link's click events.Read-onlyList Link Webhooks
List all webhook URLs subscribed to a specific LinklyHQ link's click events.
Inputs
link_idintegerrequired- The ID of the link
linklymcp_list_linksList links in the workspace with optional sorting and search filtering.Read-onlyListLinks
List links in the workspace with optional sorting and search filtering.
Inputs
pageinteger- Page number for pagination
page_sizeinteger- Number of links per page
searchstring- Search query to filter links
sort_bystring- Field to sort results by
sort_dirstring- Sort direction: asc or descone of
ascdesc
linklymcp_list_webhooksList all webhook URLs subscribed to the LinklyHQ workspace.Read-onlyList Webhooks
List all webhook URLs subscribed to the LinklyHQ workspace. These webhooks receive click events for all links.
Inputs
This tool takes no inputs.
linklymcp_list_workspacesReturn details of the authenticated LinklyHQ workspace, including ID and name.Read-onlyListWorkspaces
Return details of the authenticated LinklyHQ workspace, including ID and name.
Inputs
This tool takes no inputs.
linklymcp_pingHealth check for the LinklyHQ MCP server.Read-onlyPing
Health check for the LinklyHQ MCP server.
Inputs
messagestringrequired- A message to ping
linklymcp_search_linksSearch for links by name, destination URL, or note.Read-onlySearch Links
Search for links by name, destination URL, or note. Returns matching links with click statistics.
Inputs
querystringrequired- Search query to match against link names, destination URLs, and notes. The search is performed across all three fields to find relevant links.
linklymcp_test_authenticationTest API authentication with LinklyHQ.Read-onlyTestAuthentication
Test API authentication with LinklyHQ. Use this to verify your credentials are valid.
Inputs
This tool takes no inputs.
linklymcp_create_domainAdd a custom domain to the LinklyHQ workspace.WriteCreate Domain
Add a custom domain to the LinklyHQ workspace. The domain must already be configured to point to LinklyHQ servers via DNS.
Inputs
namestringrequired- The fully-qualified domain name to add to the LinklyHQ workspace. The domain must already have DNS configured to point to LinklyHQ servers before calling this.
linklymcp_create_linkCreate a short link or URL shortener.WriteCreateLink
Create a short link or URL shortener. Use when the user asks to shorten a URL, create a short link, or make a link shorter. Supports UTM tracking, custom domains, pixel tracking, and link expiry.
Inputs
urlstringrequired- Destination URL for the short link
block_botsboolean- Block known bots and spiders
cloakingboolean- Hide destination URL by opening in an iframe
domainstring- Custom domain for the short link (without trailing /)
enabledboolean- Whether the link is active (default: true)
expiry_datetimestring- ISO 8601 datetime when the link expires
expiry_destinationstring- Fallback URL after expiry (404 if blank)
fb_pixel_idstring- Meta/Facebook Pixel ID for tracking
forward_paramsboolean- Forward URL parameters to destination
ga4_tag_idstring- Google Analytics 4 tag ID
gtm_idstring- Google Tag Manager container ID
hide_referrerboolean- Hide referrer information when users click
namestring- Nickname for the link
notestring- Private note about this link
og_descriptionstring- Open Graph description for social media previews
og_imagestring- Open Graph image URL for social media previews
og_titlestring- Open Graph title for social media previews
slugstring- Custom slug/suffix (must start with /)
utm_campaignstring- UTM campaign parameter
utm_contentstring- UTM content parameter
utm_mediumstring- UTM medium parameter
utm_sourcestring- UTM source parameter
utm_termstring- UTM term parameter
linklymcp_subscribe_link_webhookSubscribe a webhook URL to receive click events for a specific LinklyHQ link.WriteSubscribe Link Webhook
Subscribe a webhook URL to receive click events for a specific LinklyHQ link.
Inputs
link_idintegerrequired- The ID of the link
urlstringrequired- The webhook URL to receive click event notifications
linklymcp_subscribe_webhookSubscribe a webhook URL to receive click events for all links in the LinklyHQ workspace.WriteSubscribe Webhook
Subscribe a webhook URL to receive click events for all links in the LinklyHQ workspace.
Inputs
urlstringrequired- The webhook URL to receive click event notifications
linklymcp_update_domain_faviconUpdate the favicon URL for a custom domain in the LinklyHQ workspace.WriteUpdate Domain Favicon
Update the favicon URL for a custom domain in the LinklyHQ workspace.
- Idempotent
Inputs
domain_idintegerrequired- The integer ID of the domain whose favicon should be updated. Use list_domains to find the domain's ID.
favicon_urlstringrequired- The fully-qualified URL pointing to the favicon image to use for this custom domain (e.g., https://example.com/favicon.ico).
linklymcp_update_linkUpdate an existing LinklyHQ link by its ID.WriteUpdateLink
Update an existing LinklyHQ link by its ID. Modify the destination URL, name, UTM parameters, tracking pixels, or expiry settings.
Inputs
link_idintegerrequired- The ID of the link to update
block_botsboolean- Block bots
cloakingboolean- Enable URL cloaking
enabledboolean- Whether the link is active
expiry_datetimestring- Expiry datetime ISO 8601
expiry_destinationstring- Fallback URL after expiry
fb_pixel_idstring- Meta Pixel ID
forward_paramsboolean- Forward URL parameters
ga4_tag_idstring- Google Analytics 4 tag ID
gtm_idstring- Google Tag Manager ID
hide_referrerboolean- Hide referrer
namestring- New nickname for the link
notestring- New private note
og_descriptionstring- Open Graph description
og_imagestring- Open Graph image URL
og_titlestring- Open Graph title
urlstring- New destination URL
utm_campaignstring- UTM campaign parameter
utm_contentstring- UTM content parameter
utm_mediumstring- UTM medium parameter
utm_sourcestring- UTM source parameter
utm_termstring- UTM term parameter
linklymcp_update_workspaceUpdate workspace settings including the workspace name and webhook notification URL.WriteUpdateWorkspace
Update workspace settings including the workspace name and webhook notification URL.
Inputs
namestringrequired- Workspace name
webhooksarrayrequired- REPLACES the workspace's full webhook subscription list. Omit to leave webhooks unchanged; prefer subscribe_webhook / unsubscribe_webhook for adding or removing a single URL.
linklymcp_batchdeletelinksBatch delete multiple LinklyHQ links by their IDs.DestructiveBatch Delete Links
Batch delete multiple LinklyHQ links by their IDs. This action is permanent and cannot be undone.
Inputs
idsarrayrequired- Array of link IDs to delete
linklymcp_delete_domainRemove a custom domain from the LinklyHQ workspace.DestructiveDelete Domain
Remove a custom domain from the LinklyHQ workspace. This action is permanent.
Inputs
domain_idintegerrequired- The integer ID of the domain to permanently remove from the LinklyHQ workspace. Use list_domains to find the domain's ID before calling this.
linklymcp_delete_linkDelete a LinklyHQ link by its ID.DestructiveDeleteLink
Delete a LinklyHQ link by its ID. This action is permanent and cannot be undone.
Inputs
link_idintegerrequired- The ID of the link to delete
linklymcp_unsubscribe_link_webhookUnsubscribe a webhook URL from a specific LinklyHQ link's click events.DestructiveUnsubscribe Link Webhook
Unsubscribe a webhook URL from a specific LinklyHQ link's click events.
Inputs
link_idintegerrequired- The ID of the link
urlstringrequired- The webhook URL to unsubscribe
linklymcp_unsubscribe_webhookUnsubscribe a webhook URL from workspace-level click events.DestructiveUnsubscribe Webhook
Unsubscribe a webhook URL from workspace-level click events.
Inputs
urlstringrequired- The webhook URL to unsubscribe
No tools match.
Workflows
Check authentication status
Use linklymcp_test_authentication to verify the connection is active and your credentials are valid.
const result = await actions.executeTool({ connector: 'linklymcp', identifier: 'user_123', toolName: 'linklymcp_test_authentication', toolInput: {},});console.log(result);result = actions.execute_tool( connection_name="linklymcp", identifier="user_123", tool_name="linklymcp_test_authentication", tool_input={},)print(result)Create a short link with UTM tracking
Use linklymcp_create_link to shorten a URL and attach UTM parameters for campaign tracking.
const link = await actions.executeTool({ connector: 'linklymcp', identifier: 'user_123', toolName: 'linklymcp_create_link', toolInput: { url: 'https://example.com/landing-page', name: 'Summer Campaign', utm_source: 'newsletter', utm_medium: 'email', utm_campaign: 'summer2024', },});console.log(link.full_url);link = actions.execute_tool( connection_name="linklymcp", identifier="user_123", tool_name="linklymcp_create_link", tool_input={ "url": "https://example.com/landing-page", "name": "Summer Campaign", "utm_source": "newsletter", "utm_medium": "email", "utm_campaign": "summer2024", },)print(link["full_url"])Get click analytics by dimension
Use linklymcp_get_analytics_by to break down click counts by country, browser, or platform over a date range.
const analytics = await actions.executeTool({ connector: 'linklymcp', identifier: 'user_123', toolName: 'linklymcp_get_analytics_by', toolInput: { counter: 'country', start: '2024-01-01', end: '2024-01-31', },});console.log(analytics);analytics = actions.execute_tool( connection_name="linklymcp", identifier="user_123", tool_name="linklymcp_get_analytics_by", tool_input={ "counter": "country", "start": "2024-01-01", "end": "2024-01-31", },)print(analytics)