---
title: "Linkrunner MCP server"
url: "https://martechdb.com/vendors/linkrunner"
markdown_url: "https://martechdb.com/vendors/linkrunner.md"
api_url: "https://martechdb.com/api/v1/vendors/linkrunner.io"
updated: "2026-10-23"
---

# Linkrunner MCP server

Yes. Linkrunner publishes an official MCP server at https://mcp.linkrunner.io/mcp. It's hosted. It offers 44 tools. We last checked it on 24 Oct 2026. MartechDB lists only servers the vendor publishes itself, never community servers.

**Key facts:** As of 24 Oct 2026, Linkrunner's official MCP server scores 65/100 (provisional) on MartechDB's Agent Readiness Index (v1.1). It lists 44 tools.

- Website: [linkrunner.io](https://linkrunner.io)
- Categories: [Marketing attribution](https://martechdb.com/categories/marketing-attribution.md)

## Review

Linkrunner's Linkrunner MCP scores 65/100 on MartechDB's Agent Readiness Index: easy to connect an AI agent to, with a few gaps.

The good:

- Hosted by Linkrunner: connect by URL, with nothing to install
- Documented, with 44 tools known

Not checked yet: how you sign in; what agent access costs.

## Agent Readiness Index: 65/100 (provisional)

How friendly Linkrunner is to AI agents, from its best official MCP server. Anything not yet researched scores nothing, so this score may rise once it is. Methodology v1.1: https://martechdb.com/methodology.

- Official MCP server: 30/30 (Published by the vendor)
- Hosted by the vendor: 25/25 (Connect by URL, nothing to install)
- OAuth sign-in: pending (Sign-in: see vendor docs)
- Documented tools: 10/10 (A docs page, and its tools are known)
- Free to start, pay as you go: pending (Not checked yet)

## Linkrunner MCP

- Address: https://mcp.linkrunner.io/mcp
- Runs: Hosted
- Sign-in: Sign-in: see vendor docs (`unknown`)
- Official MCP Registry: not listed
- Documentation: https://linkrunner.io/ai
- How we know it's official: Documented on Linkrunner's own site, at linkrunner.io
- First seen: 2026-10-23
- Last checked: 2026-10-24

### Tools (44)

As the server lists them on 2026-10-24. Names and descriptions come from the vendor's server.

- `get_my_account` (read-only): Returns the signed-in Linkrunner user (email, first name, granted scopes), whether they can create a project (can\_create\_project, create\_project\_blocked\_reason) and the billing accounts a new project can join. Call this first in a conversation, together with list\_projects.
- `list_projects` (read-only): Lists the Linkrunner projects the signed-in user belongs to: id, name, company, role, store links, website, timezone and display currency. Pass a project's id as project\_id to every project tool. An empty list means the user has no project yet; offer to set one up (find\_app\_in\_store, then create\_project).
- `find_app_in_store` (read-only): Searches the App Store (Apple's iTunes Search API) or Google Play for a published app, or looks up a store URL the user pasted. Pass either \`url\`, or \`store\` and \`query\`; search one store per call (call twice for an app on both stores). Show the matches to the user and ask which one is theirs before calling create\_project with its url. Setup guide: https://docs.linkrunner.io/features/mcp. App projects need a live App Store or Play Store listing, so an app that is not published yet cannot be set up until it is.
- `create_project`: Creates a new Linkrunner project in the signed-in user's account and returns its project\_id and SDK token. Rules: (1) A company email is required to create a Linkrunner project; Gmail accounts cannot create projects. Check get\_my\_account first; if can\_create\_project is false, tell the user why and suggest a work email or support@linkrunner.io. (2) App projects need a live App Store or Play Store listing, so an app that is not published yet cannot be set up until it is. Use type app with app\_store\_link and/or play\_store\_link from find\_app\_in\_store; never create a website project for an app instead. Use type website only for a website with no app. Confirm the store listing, name, company and timezone with the user before calling. (3) If get\_my\_account lists billing\_accounts, ask the user which one this project belongs to and pass its id as billing\_account\_id. With none, leave it out and a new billing account is created. For a person's first project, ask once how they heard about Linkrun…
- `get_project_info` (read-only): Returns the connected Linkrunner project's name, timezone, and display currency. Call this once at the start of a session so subsequent answers use the right currency and timezone.
- `get_sdk_configuration` (read-only): Returns the connected project's active client-side project token plus canonical dashboard and official documentation links. Call this for SDK installation, initialization, setup, signing, or testing questions. Use the returned project\_token in customer-specific setup examples. Render dashboard and docs destinations as Markdown links instead of bare text. If has\_project\_token is false, direct the user to the returned project\_settings\_url instead of inventing a token.
- `list_event_names` (read-only): Lists the NAMES of every distinct custom event and revenue event the project has recorded. Names only — no counts, no amounts, no date range. Call this to learn what events exist before filtering by event name; for counts of an event use list\_campaigns with metrics including custom\_events.
- `get_project_stats` (read-only): Returns headline KPIs (clicks, installs, onboards, revenue) as both lifetime and current-month totals. Same totals as the dashboard's overview. Call this first for any 'how are we doing?' question. For a day-by-day trend of these same KPIs, use get\_metrics\_trend instead.
- `get_metrics_trend` (read-only): Daily trend for clicks, organic installs, sign-ups and revenue — 'how has X been trending', 'show me the trend for this month', 'which day had the spike'. CURRENT CALENDAR MONTH ONLY, one point per day — this is the only timeseries endpoint wired up today, so it cannot show a prior month, a custom range, or per-campaign/per-channel breakdown (list\_campaigns/get\_channel\_performance answer non-trend versions of those). installs\_per\_click and signups\_per\_install are daily conversion-rate trends, opt-in via \`metrics\` since they're rarely the question.
- `get_billing_usage` (read-only): Billing-only. Returns daily and cumulative install counts for the current month against the project's free-install allowance. Call this ONLY when the user explicitly asks about billing, plan limits, free installs, overage, invoice, or quota. Do NOT call it for performance questions ('how are my campaigns doing?') or routine briefings — it's not relevant there.
- `list_campaigns` (read-only): ONE ROW PER CAMPAIGN, for a date range. Use for any question that ranks, compares or filters campaigns — 'how are my campaigns performing', 'which campaign has the best ROAS', 'top 5 by installs'. Returns one sorted page of up to 200 campaigns, so prefer it over get\_campaign\_details unless the user named a single campaign. A large project has thousands of campaigns: do not page through all of them to add up a total; get\_channel\_performance gives totals across every campaign in one call (leave out its ORGANIC row). Ask only for the metrics you need via \`metrics\`: the response carries just those, and a metric you did not request is absent rather than zero. A row carrying \`system\_campaign: true\` is infrastructure the project never created — the per-domain 'MAIN\_DOMAIN' row that backs root-domain click resolution (one is auto-added by every create\_domain call) or the 'lr-test' SDK-console campaign. They are real, active campaigns that consume campaign credit, so they are reported rather t…
- `find_campaign` (read-only): Cheap id/display\_id/name lookup by substring match — NO metrics computed, just the campaign's identity fields. Use this to resolve a display\_id for get\_campaign\_details when the user names a specific campaign, instead of list\_campaigns (which computes full metrics for every match just to read off an id). Not for ranking or comparing campaigns — use list\_campaigns for that.
- `get_campaign_details` (read-only): ONE CAMPAIGN, day by day. Returns headline totals plus a daily time series — the only tool that gives a trend for a single campaign. Use only when the user names a specific campaign and wants its detail or trajectory. To compare campaigns or find the best one, use list\_campaigns, which returns them all in one call. Requires a display\_id — resolve it with find\_campaign (cheap, no metrics computed) rather than list\_campaigns (computes full metrics for every match just to read off an id). This tool cannot look a campaign up by name itself.
- `get_channel_performance` (read-only): ONE ROW PER CHANNEL — Meta, Google, TikTok, Snapchat, Apple Search Ads, Linkrunner Links, Organic — with installs, sign-ups, spend, revenue, retention and active users. Use for any question about a NETWORK rather than an individual campaign: 'which channel is working', 'Meta vs Google', 'where should I move budget'. For individual campaigns use list\_campaigns instead; rolling campaigns up into channels by hand double-counts web-to-app. Meta and Google appear as separate direct and web-to-app rows. Ask only for the metrics you need via \`metrics\`: the response carries just those, and a metric you did not request is absent rather than zero.
- `get_organic_performance` (read-only): The project's ORGANIC total: installs, sign-ups and revenue carrying no campaign and no ad network — users who found the app on their own. NOT filtered by any attribution window. Use to size the non-paid baseline or answer 'how much of my growth is organic'. Returns a single total, not a breakdown. get\_channel\_performance already includes an Organic row with the same numbers if you want it beside the paid channels. Ask only for the metrics you need via \`metrics\`: the response carries just those, and a metric you did not request is absent rather than zero.
- `search_event_log` (read-only): INDIVIDUAL EVENT ROWS — one per user action, with timestamp, event name, user, campaign, platform and device. A raw feed for investigating specific behaviour ('show me recent purchases', 'did this user finish signup'), NOT for counting. For counts of an event use list\_campaigns with metrics including custom\_events; for step-to-step drop-off use run\_funnel. Call list\_event\_names first to learn which names exist. IMPORTANT: the \`total\` in the response is an ALL-TIME count of matching events and ignores your date range — never quote it as a count for the window; count the rows you actually got.
- `list_funnels` (read-only): Names and step definitions of the funnels saved in the dashboard. Call this before run\_funnel when the user refers to a funnel by name, so you can pass its id rather than rebuilding the steps.
- `run_funnel` (read-only): Computes a conversion funnel: how many users reached each step and how many dropped off between them. Use for any 'where are users dropping off' or 'what % of installs reach checkout' question. Pass funnel\_id to run a saved funnel (from list\_funnels) OR steps to run an ad-hoc one — exactly one of the two. Step 1 defines the entry cohort and is the ONLY step bounded by the date range; later steps are unbounded forward, so someone entering on the last day can still convert afterwards.
- `create_funnel` (can delete or overwrite): Saves a new named funnel definition to the dashboard so it can be run later via run\_funnel(funnel\_id) or shown in list\_funnels, instead of re-typing steps every time. Same step rules as run\_funnel's ad-hoc steps: 2-10 steps, step 1 exactly one event (it defines the entry cohort), later steps up to 5 alternative events each.
- `update_funnel` (can delete or overwrite): Updates a saved funnel's name, description, and/or steps. All fields are optional but at least one must be provided. Passing \`steps\` replaces the entire step list — it is not a per-step patch. Get funnel\_id from list\_funnels.
- `lookup_attribution` (read-only): Returns the full attribution chain for a single install: the matching click, the campaign it was attributed to, and click parameters (gclid, ttclid, etc). Use this to answer 'why did this user attribute the way they did?' Pass either a customer\_user\_id (the id sent to Linkrunner via setUserId) or a device\_identifier (gaid, idfa, or install\_instance\_id). If both are supplied, customer\_user\_id wins.
- `list_domains` (read-only): Lists the domains configured for this project (primary domain first). Use to fill domain\_id on create\_campaign, or to confirm a fully-qualified link URL targets a valid domain. The primary domain is used automatically when domain\_id is omitted, so only call this when the user wants a non-default domain or the project may have more than one.
- `list_store_listings` (read-only): Lists custom App Store / Play Store listings configured for this project. Use to fill store\_listing\_ids on create\_campaign, or to get the row id needed by update\_store\_listing / delete\_store\_listing. At most one IOS and one ANDROID listing may be attached to a campaign.
- `list_ad_accounts` (read-only): Lists every live ad-network account (Meta, Google, TikTok, Snapchat, etc.) connected to this project in one array, each row tagged with its network\_name. There is no server-side network filter — this always returns every connected network's accounts; filter the result yourself if the user only cares about one network. Use to fill network\_account\_id on create\_campaign / edit\_campaign. An empty result means no ad-network account is connected yet — tell the user to connect one in the dashboard before retrying. Each row also carries \`health\` (read it for 'Meta is not getting my events', 'No META Account with Dataset ID and Access Token found', 'wrong dataset', 'reconnect' or stale spend questions): reauth\_required, latest\_metrics\_date and metrics\_freshness (fresh, stale, no\_metrics, unavailable; the newest day with ad metrics in Linkrunner, which is the real freshness signal, unlike last\_sync\_at), and findings \[{id, severity, owner, text}\] to quote. Meta rows add health.meta\_capi: dataset…
- `create_campaign` (can delete or overwrite): Creates a campaign in the connected project. Equivalent to the dashboard's 'Create Campaign' modal — both go through the same backend validation, so anything that works in the dashboard works here. Use when the user wants a new tracking link for an ad creative, an organic channel, an influencer, a web-to-app flow, etc. Recommended pre-flight when the user hasn't given you IDs: list\_ad\_accounts for network\_account\_id, list\_domains for domain\_id, list\_store\_listings for store\_listing\_ids. If a required field is missing, the response includes explicit guidance on which lookup tool to call next — surface that to the user. Returns the new campaign plus a dashboard\_url the user can open to view or edit it.
- `edit_campaign` (can delete or overwrite): Edits fields on an existing campaign. The campaign is identified by \`campaign\_display\_id\`, which is what the upstream route calls it — but \`display\_id\` is accepted as an alias here, since every other tool in this server uses that name. Pass either one (not both with different values). Resolve the id first with find\_campaign if you only have a name. At least one editable field must be provided. Every field is a partial update: an omitted field is left untouched, while an explicit null (or \[\] / "" where the field documents it) CLEARS the stored value.
- `create_deeplink` (can delete or overwrite): Creates or updates the deep-link destination for one ad entity (an ad set or an ad creative) under a Meta or Google ad-network campaign ONLY — a TikTok/Snapchat/LinkedIn/organic campaign is rejected with 'Deep links are only supported for Meta and Google campaigns', even though it may have its own ad network. Used for per-creative / per-adset deep linking, distinct from the campaign-level \`link\`. Requires the campaign's display\_id (find\_campaign) and the ad network's entity id for the ad set/creative. The value you send is REWRITTEN before it is stored, so what you read back will not match what you sent: the backend verifies the URL's host equals the campaign's own tracking domain and then stores only the path+query+fragment, dropping the scheme and host (send 'https://bld.linkrunner.io/promo/x', the stored deeplink is '/promo/x'). This is by design — the domain is implied by the campaign — so do NOT treat the shortened value as a failed write or re-send it to 'correct' it.
- `update_custom_channel` (can delete or overwrite): Renames a Linkrunner-link custom channel (the organic/influencer channel label shown in the dashboard, distinct from ad-network campaigns). Only the display name changes — the channel's internal slug (its stable reporting key) does not change to match, by design. IMPORTANT — obtaining custom\_channel\_id: it is only present in the \`custom\_channels\[\].id\` array of a create\_campaign / edit\_campaign RESPONSE. list\_campaigns and find\_campaign do NOT return it (they expose only custom\_channel\_code / custom\_channel\_name, which are the slug and label, not the id), and there is no list-custom-channels tool. So this tool is realistically only usable on a channel you created or edited earlier in the same session and whose numeric id you still have. Do not pass a channel code/slug or a name — it must be the positive integer row id, or the call fails with 'Custom channel id is missing or invalid!'.
- `delete_custom_channel` (can delete or overwrite): Deletes a Linkrunner-link custom channel. This only removes the channel label — it does not delete the underlying campaign. Low-risk / reversible-ish (the channel can be recreated by editing the campaign again), which is why it's included in this tool set. Same custom\_channel\_id caveat as update\_custom\_channel: the numeric id appears only in a create\_campaign / edit\_campaign response, never in list\_campaigns / find\_campaign output.
- `get_webhook` (read-only): Returns whether a webhook is configured for this project, its host, and its send\_organic setting — or null if none is set. The URL is PARTIALLY REDACTED and always will be: you get the scheme and host, but the path and query come back as '\[REDACTED\]' (e.g. 'https://hooks.slack.com/\[REDACTED\]'). That is deliberate — a Slack webhook path is a bearer credential — so this tool CANNOT be used to read the current URL in order to restore it later. Do not attempt to reconstruct or guess the full URL from it, and never pass a redacted value back into update\_webhook as if it were real. Use this to confirm WHETHER a webhook exists, which host it points at, and what send\_organic is — enough to troubleshoot an integration or to change send\_organic (update\_webhook can flip that without the URL). If the user needs the full URL, they must read it from their own dashboard or webhook provider.
- `update_webhook` (can delete or overwrite): Updates the project's single webhook — its URL and/or its send\_organic flag. Provide at least one of them. Requires the project to already have an active SDK/private key (generated in the dashboard). TO CHANGE ONLY send\_organic, OMIT \`url\` — the stored URL is reused automatically. Do this rather than trying to supply a URL you read from get\_webhook, because that value is redacted and passing it back would fail or clobber the real one. PROVIDING \`url\` IS DESTRUCTIVE AND IRREVERSIBLE: there is one webhook per project, the new URL replaces the old one, and the old one CANNOT be recovered afterwards — get\_webhook only ever returns a redacted path, so nothing in this server can restore it. Confirm with the user before replacing a URL you did not just set yourself, and make sure they have the previous value if they might want it back. IMPORTANT — saving is itself a LIVE send: before storing anything, the backend POSTs a real sample payload to the URL and only saves if the endpoint responds…
- `test_webhook` (can delete or overwrite): Fires a real sample payload to whatever webhook URL is already configured for this project — this is a LIVE test send, not a dry-run/validation check. It will show up wherever the webhook is wired (e.g. a real message in a Slack channel). Fails if no webhook is configured yet — call update\_webhook first. Note update\_webhook already sends one such payload of its own when it stores a URL, so calling this straight afterwards delivers a second message.
- `create_store_listing` (can delete or overwrite): Creates a custom App Store / Play Store listing (e.g. for a custom product page or store listing variant) that campaigns can route to. See list\_store\_listings for existing ones and create\_campaign / edit\_campaign's store\_listing\_id(s) for how to attach it to a campaign.
- `update_store_listing` (can delete or overwrite): Updates a custom store listing's name and/or its platform listing string. \`id\` is the Linkrunner row id (from list\_store\_listings). \`store\_listing\_id\` in the input is NOT that row id — it's the platform listing string being changed (same field name create\_store\_listing uses, different meaning than the URL's row id). Only the provided fields are changed.
- `delete_store_listing` (can delete or overwrite): Deletes a custom store listing by its row id (from list\_store\_listings). Low-risk / reversible-ish — it can be recreated with create\_store\_listing — which is why it's included in this tool set. BLOCKED, not silent, if any campaign still points at it: the backend rejects the delete with an error naming the campaign(s) using it. Remove the listing from those campaigns first (edit\_campaign with store\_listing\_id: null), or tell the user which campaigns are blocking it. On success the response body is null — no error means it worked.
- `create_domain` (can delete or overwrite): Registers a new domain (or subdomain) for the project's tracking links. DNS should already point it at Linkrunner for links to actually resolve, but this tool does NOT verify that — it accepts and saves any syntactically valid domain name, DNS-configured or not. Confirm with the user that DNS is set up, or warn them it needs to be. Since there is deliberately no delete\_domain tool in this set, a typo here becomes a permanent row — double-check the spelling before calling. Re-adding a previously deleted name restores that row instead of creating a new one. SIDE EFFECTS beyond adding the domain row, none of them undoable here: (1) a campaign named 'MAIN\_DOMAIN' is auto-created for each brand-new domain — it counts against the project's campaign credit limit and can never be renamed or deleted; (2) if this is the project's FIRST domain, an extra 'Test Campaign' (display\_id 'lr-test') is created too; (3) is\_primary: true DEMOTES the current primary domain, which silently changes which dom…
- `list_postback_event_maps` (read-only): Lists the project's event-name -\> ad-network-event-name postback mappings (which internal events get sent to which ad networks, and under what name). Optionally filter to one ad network. Use to find the \`id\` needed by update\_postback\_event\_map / delete\_postback\_event\_map, or to see what ad\_network\_id values are already in use before create\_postback\_event\_map. Rows are of two kinds and only one is editable: a SAVED mapping has a numeric \`id\` and canDelete: true, while an ad network's BUILT-IN DEFAULT has a string id like 'meta\_default\_0', canDelete: false, and no underlying row — it cannot be updated or deleted. Always read canDelete before passing an id to another tool; the defaults are listed FIRST, so taking the first row is usually wrong. Note the defaults only appear when you pass ad\_network\_id (and only for a connected network), so an unfiltered call can look like a network has no event mapping at all when in fact its defaults are active.
- `create_postback_event_map` (can delete or overwrite): Maps one of the project's internal event names to the name an ad network expects in its postback, optionally with revenue sharing. Creating a mapping for Meta/Google/TikTok/Snapchat/LinkedIn/Reddit immediately fires a test postback to every connected NetworkAccount for that network. Call list\_postback\_event\_maps first to check for an existing mapping and to see valid ad\_network\_id values.
- `update_postback_event_map` (can delete or overwrite): Updates fields on an existing postback event mapping. \`id\` is the mapping's row id, from list\_postback\_event\_maps. All body fields are optional — only the fields you provide are sent through, but at least one is required. IMPORTANT: exactly like create\_postback\_event\_map, EVERY successful update immediately fires a live test postback to every connected NetworkAccount for that mapping's network (Meta/Google/TikTok/Snapchat/LinkedIn/Reddit) — there is no dry-run. This injects a synthetic conversion event into the customer's real ad accounts, so avoid repeated or exploratory updates and confirm with the user first. Only rows with canDelete: true can be updated — the built-in network defaults list\_postback\_event\_maps returns (canDelete: false, string id like 'meta\_default\_0') have no database row and cannot be edited; add a real mapping for the same event\_name instead.
- `delete_postback_event_map` (can delete or overwrite): Deletes a postback event mapping by its row id (from list\_postback\_event\_maps). Low-risk / reversible-ish — it can be recreated with create\_postback\_event\_map — which is why it's included in this tool set. Only rows with canDelete: true can be deleted: list\_postback\_event\_maps also returns the ad network's built-in defaults, which carry canDelete: false and a STRING id like 'meta\_default\_0' and have no database row behind them. Those defaults are listed FIRST, so check canDelete before picking a row rather than taking the first one. On success the response body is null — no error means it worked.
- `get_postback_delivery_log` (read-only): Read this before answering 'Meta/Google is not receiving my events', 'Meta blocks my events', 'Meta shows fewer conversions than Linkrunner', or 'did my affiliate get this conversion'. Returns, for the project and a UTC window (default the last 7 days, at most 30 days, kept 90 days): \`summary\` with conversions, delivered, failed, not\_sent and success\_rate\_pct overall, \`by\_network\` (with the network's top error codes and messages) and \`by\_event\`; then \`deliveries\`, one row per conversion at its final attempt, newest first and paginated (\`pagination.total\`). A delivery row has the event as logged (\`event\_name\`; for Meta this is already the Meta event name), the event name inside the payload (\`network\_event\_name\`), \`status\` (delivered, failed, transport\_failed, not\_sent, fraud\_rejected, fraud\_withheld), \`http\_status\`, \`attempts\`, the campaign (display\_id, name), and \`error\` {error\_class, http\_status, code, subcode, type, message} when it failed (message is at most 200 characters, read fr…
- `check_link_setup` (read-only): Read this before answering 'is my iOS / Android link setup right', 'is my AASA or assetlinks correct', or 'the link opens the store instead of my installed app'. Checks, live: (1) \`config\`, the project's iOS bundle ID, App Store ID, Android package, app URI scheme and store links, and the saved association files parsed the way iOS and Android read them (team ID + bundle in the AASA; package, handle\_all\_urls relation and SHA-256 fingerprints in assetlinks); (2) \`domains\`, what each of the project's own link domains actually serves at /.well-known/apple-app-site-association and /.well-known/assetlinks.json (HTTP status, redirects, whether it matches what is saved); (3) \`link\_probe\`, what one campaign link does for iOS Safari, Android Chrome and the Facebook in-app browser on iOS and Android: each redirect hop, where it lands (App Store, Play Store, app scheme, web) and, for the Linkrunner link page, which app link and store it will try. \`findings\` lists each problem with an id, severity…
- `search_documentation` (read-only): Searches the current official docs.linkrunner.io content and returns canonical links plus relevant Markdown. You MUST call this before answering any Linkrunner how-to, setup, installation, configuration, integration, or troubleshooting question, including Meta Ads, Google Ads, SDK, deep linking, and iOS SKAN questions. Base the steps on the returned documentation and cite the returned URLs. Never invent a docs URL.
- `get_linkrunner_overview` (read-only): What Linkrunner is, which SDKs it supports, how to set it up through this connector, and what a new project needs. Works without signing in. Call it when the user asks what Linkrunner is, how to get started, or whether it fits their app.

### Connect it

Claude Code:

```sh
claude mcp add --transport http linkrunner https://mcp.linkrunner.io/mcp
```

- Add to Cursor: <cursor://anysphere.cursor-deeplink/mcp/install?name=linkrunner&config=eyJ1cmwiOiJodHRwczovL21jcC5saW5rcnVubmVyLmlvL21jcCJ9>
- Add to VS Code: <vscode:mcp/install?%7B%22name%22%3A%22linkrunner%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.linkrunner.io%2Fmcp%22%7D>
- Claude.ai and Claude Desktop: Customize, Connectors, "+", Add custom connector, then paste https://mcp.linkrunner.io/mcp
- ChatGPT: Settings, Apps, Advanced settings, turn on Developer mode, Create, then paste https://mcp.linkrunner.io/mcp (this usually works only with servers that use self-serve sign-in or none)

JSON for Cursor, Windsurf and other clients that connect to hosted servers:

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

## Questions

### Does Linkrunner have an official MCP server?

Yes. Linkrunner publishes its MCP server itself. Linkrunner's own documentation describes it. MartechDB only lists servers a vendor publishes, never community copies.

### What is the Linkrunner MCP server URL?

The address is https://mcp.linkrunner.io/mcp.

### How do I connect Linkrunner MCP to Claude, ChatGPT or Cursor?

In Claude, add https://mcp.linkrunner.io/mcp as a custom connector (Customize, Connectors, Add custom connector). In Cursor, use the Add to Cursor link on MartechDB's page, or paste the JSON settings into your mcp.json. In Claude Code, run: claude mcp add --transport http linkrunner https://mcp.linkrunner.io/mcp

### What can the Linkrunner MCP server do?

It offers 44 tools, including get\_my\_account, list\_projects, find\_app\_in\_store, create\_project and get\_project\_info (as listed on 24 Oct 2026). 27 are marked read-only and 16 can delete or overwrite data.

### Is the Linkrunner MCP server in the official MCP Registry?

No. Linkrunner hasn't published it to the official MCP Registry.

### Is the Linkrunner MCP server working?

Yes. It answered our most recent check. We last checked it on 24 Oct 2026.

### What are the alternatives to Linkrunner's MCP server?

In Marketing attribution, the most agent-friendly alternatives with an official MCP server are Seal Metrics (100/100), Admetrics (100/100), Airbridge (95/100), Factors.ai (91/100) and Dreamdata (91/100). Linkrunner scores 65/100 on the same index.

## Change history

- 2026-10-23: Added to MartechDB with Linkrunner MCP

## Alternatives to Linkrunner's MCP server

In Marketing attribution, the most agent-friendly first:

- [Seal Metrics](https://martechdb.com/vendors/seal-metrics.md) (sealmetrics.com), Agent Readiness Index 100/100
- [Admetrics](https://martechdb.com/vendors/admetrics.md) (admetrics.io), Agent Readiness Index 100/100
- [Airbridge](https://martechdb.com/vendors/airbridge.md) (airbridge.io), Agent Readiness Index 95/100
- [Factors.ai](https://martechdb.com/vendors/factorsai.md) (factors.ai), Agent Readiness Index 91/100
- [Dreamdata](https://martechdb.com/vendors/dreamdata.md) (dreamdata.io), Agent Readiness Index 91/100

## Get this data

- API: `curl https://martechdb.com/api/v1/vendors/linkrunner.io`
- MCP: `claude mcp add --transport http martechdb https://martechdb.com/mcp`, then ask about Linkrunner.
- Web page: https://martechdb.com/vendors/linkrunner
