From 1dbf1fc9d50b58613c7afa8d7066f035f54ecd5d Mon Sep 17 00:00:00 2001 From: Darshil Rathod <69842641+RathodDarshil@users.noreply.github.com> Date: Wed, 2 Sep 2026 19:13:09 +0530 Subject: [PATCH 1/5] docs(mcp): token capabilities and read-only ad-account tools (LIN-2470) Documents the capability choice when generating an MCP token, the four ad-account tools (get_ad_insights, list_ad_entities, get_ad_entity, ad_network_reference), how to read ad-network numbers next to Linkrunner numbers, the caching and budget behaviour, and the new troubleshooting entries for missing capability, expired connections, rate limits and spend mismatches. Co-Authored-By: Claude Fable 5.1 --- features/mcp.mdx | 106 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 6 deletions(-) diff --git a/features/mcp.mdx b/features/mcp.mdx index 2fbbcb9..59b4cd1 100644 --- a/features/mcp.mdx +++ b/features/mcp.mdx @@ -18,6 +18,14 @@ dashboard, add it as a Custom Connector in Claude.ai, and ask things like: - "How much of my growth is organic?" - "Where do users drop off between install and checkout?" +With the ad-accounts capability, Claude can also read straight from the Meta +and Google accounts you have connected: + +- "How much did we spend on Meta last week, by campaign?" +- "Which Google ad groups are paused right now?" +- "What targeting does our retargeting ad set use?" +- "Compare Meta's reported spend with Linkrunner's installs for yesterday." + Claude can also make a defined set of changes for you: - "Create a Meta campaign for the Diwali sale pointing at our sneakers page." @@ -50,11 +58,23 @@ connector with a team. 1. Open the [Linkrunner dashboard](https://dashboard.linkrunner.io) and switch to the project you want to connect. 2. Click **MCP** in the sidebar. -3. Click **Generate Token**. -4. The dashboard shows a one-time **Server URL** with the token already +3. Choose what the token may do: + - **Read Linkrunner data** is always on. + - **Make changes in Linkrunner** lets Claude use the editing tools listed + under [What Claude can change](#what-claude-can-change). Turn it off for + a read-only token. + - **Read connected ad accounts** lets Claude read your connected Meta and + Google accounts. See + [What Claude can read from your ad accounts](#what-claude-can-read-from-your-ad-accounts). +4. Click **Generate Token**. +5. The dashboard shows a one-time **Server URL** with the token already embedded as a query parameter. Copy it now. The full URL will not be shown again. +Capabilities are fixed once a token exists. To change them, generate a new +token and revoke the old one. Tokens created before capabilities existed keep +read and change access, and no ad-account access. + The URL contains the token as a query parameter. Treat it like a password: don't paste it into shared documents, screenshots, or chat threads. Revoke it @@ -124,6 +144,46 @@ response rather than reported as zero, so Claude never mistakes "not fetched" for "measured zero". Ask for a metric by name and Claude will fetch it. +## What Claude can read from your ad accounts + +Tokens created with **Read connected ad accounts** get four more tools. They +read from the Meta Marketing API and the Google Ads API using the ad accounts +already connected to the project under Settings, and nothing else. They cannot +change anything on Meta or Google. + +| Tool | Use it for | +|------|------------| +| `get_ad_insights` | Spend, impressions, clicks, CTR, CPC, CPM, reach, frequency, conversions and ROAS as the ad network reports them, at account, campaign, ad set or ad group, or ad level. Optional breakdown by date, device, platform, country, age or gender. | +| `list_ad_entities` | Campaigns, ad sets or ad groups, ads, creatives, audiences, conversion actions and keywords, with status, budget and objective. | +| `get_ad_entity` | Every readable field of one object, such as an ad set's targeting or a campaign's bidding strategy. | +| `ad_network_reference` | The list of metrics, breakdowns and entity types each network supports. Claude reads it before its first ad-account question. | + +A few things to know when you read these numbers: + +- **They are the ad network's numbers.** Meta and Google count conversions + with their own attribution windows and view-through rules. Linkrunner's + installs and sign-ups are measured differently. Claude reports the two side + by side and will not merge them. +- **Currency and timezone come from the ad account**, which may differ from + your project's display currency. +- **The last three days are provisional.** Networks keep adjusting spend and + conversions for a few days, so recent numbers can move. +- **Meta has no single "conversions" number.** Claude reads the actions Meta + reports (app installs, purchases, leads and so on) and names the one it is + quoting. +- **Answers may come from a short cache.** Closed date ranges are cached for a + day, open ranges for ten minutes, and object lists for five minutes. Claude + mentions the age when it matters. +- **Reads are budgeted.** Each token gets a daily allowance of live reads, and + Linkrunner reserves part of its Google Ads quota for attribution. When a + limit is hit, Claude gets a wait time and a cached copy if one exists, + instead of an error loop. +- **Meta connections expire** roughly every 60 days. If Claude reports that + the connection has expired, reconnect Meta under Settings. + +Only Meta and Google are covered. Accounts on other networks still appear in +`list_ad_accounts` for campaign setup but cannot be queried. + ## What Claude can change Ask in plain language ("create a campaign for the Diwali sale") and Claude picks @@ -241,6 +301,9 @@ project. For each token you can see: - The user who created it. - The last time it was used (helps spot stale tokens). +Each token also shows its capabilities: **Read**, **Changes**, and **Ad +accounts**. + Click the trash icon next to a token to revoke it. Anyone using that token in Claude will be disconnected immediately. Revocation is not reversible. Mint a new token if you need to reconnect. @@ -256,7 +319,14 @@ revoke an unused token before creating a new one. project role, so the connector cannot do anything that person could not do in the dashboard. - Every change made through the connector is recorded with the action, the - token, the person who created it, and what was changed. + token, the person who created it, and what was changed. Every ad-account + read is recorded the same way, with the account, the query type and the + date range, but never the returned data. +- Ad-account access is read-only and opt-in per token. The Meta and Google + credentials stay on Linkrunner's servers; the connector never receives them, + and they are removed from every response and log. +- An ad-account token can only reach accounts connected to its own project. + Passing another project's account is refused. - Claude cannot delete campaigns, funnels, domains, or projects, cannot manage members, and cannot disconnect an ad-network account. Those stay in the dashboard. @@ -267,9 +337,9 @@ revoke an unused token before creating a new one. - Per-project token cap of 10 limits the blast radius if one leaks. -A token that can read your data can also change it. If you only want someone to -read, give them a token created by a project member whose role cannot edit, or -revoke the token when the work is done. +If you only want someone to read, turn off **Make changes in Linkrunner** when +you generate their token. A read-only token does not even list the editing +tools, so Claude cannot attempt a change with it. ## Troubleshooting @@ -304,6 +374,28 @@ Linkrunner only stores an endpoint that answers `200` or `201` to the sample payload, and it must answer directly rather than redirecting. An endpoint that returns `202` or `204` cannot be saved. +**Claude says the token does not have the ad-accounts capability.** +The token was generated without **Read connected ad accounts**. Generate a new +token with it turned on and re-add the connector. Capabilities cannot be added +to an existing token. + +**Claude says the Meta or Google connection has expired.** +The stored ad-network credential is no longer valid. Open Settings, reconnect +the account, and ask again. Meta connections expire on their own roughly every +60 days. + +**Claude says it has to wait before reading the ad account again.** +A rate limit or daily allowance was reached, either on the ad network or on the +token. Claude is given a wait time and uses a cached answer when one exists. +Ask again after the wait, or narrow the question so fewer live reads are +needed. + +**Ad-network spend does not match the spend Linkrunner shows.** +The two are expected to differ. Ad-account tools return what Meta or Google +report for the ad account, in the account's currency and timezone. Linkrunner's +campaign spend is synced periodically and shown in your display currency. Ask +Claude for both and it will label which is which. + **Claude cannot rename a custom channel.** Renaming needs the channel's internal id, which Claude only sees right after it creates or edits a campaign. In a later chat it has no way to look the id up. @@ -322,6 +414,8 @@ behind, which changes the channel's reporting name and splits its history. programmatic writes. - Not a way to delete things. Campaigns, funnels, domains, and projects can only be deleted from the dashboard. +- Not a way to edit ads. The ad-account tools read from Meta and Google; they + cannot pause a campaign, change a budget, or edit targeting there. - Not a generic SQL/Postgres bridge. It calls the same endpoints the dashboard uses, with the same access controls. - Not a substitute for webhooks. Use [webhooks](/features/webhooks) for From 3893c7e0d78b9d4235ef1bf2fd9de0022ea0cdf5 Mon Sep 17 00:00:00 2001 From: Darshil Rathod <69842641+RathodDarshil@users.noreply.github.com> Date: Wed, 2 Sep 2026 23:29:34 +0530 Subject: [PATCH 2/5] docs(mcp): document query_ad_network and the catalog-backed reference (LIN-2470) Co-Authored-By: Claude Fable 5.1 --- features/mcp.mdx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/features/mcp.mdx b/features/mcp.mdx index 59b4cd1..38eada3 100644 --- a/features/mcp.mdx +++ b/features/mcp.mdx @@ -146,7 +146,7 @@ for "measured zero". Ask for a metric by name and Claude will fetch it. ## What Claude can read from your ad accounts -Tokens created with **Read connected ad accounts** get four more tools. They +Tokens created with **Read connected ad accounts** get five more tools. They read from the Meta Marketing API and the Google Ads API using the ad accounts already connected to the project under Settings, and nothing else. They cannot change anything on Meta or Google. @@ -156,7 +156,15 @@ change anything on Meta or Google. | `get_ad_insights` | Spend, impressions, clicks, CTR, CPC, CPM, reach, frequency, conversions and ROAS as the ad network reports them, at account, campaign, ad set or ad group, or ad level. Optional breakdown by date, device, platform, country, age or gender. | | `list_ad_entities` | Campaigns, ad sets or ad groups, ads, creatives, audiences, conversion actions and keywords, with status, budget and objective. | | `get_ad_entity` | Every readable field of one object, such as an ad set's targeting or a campaign's bidding strategy. | -| `ad_network_reference` | The list of metrics, breakdowns and entity types each network supports. Claude reads it before its first ad-account question. | +| `query_ad_network` | Anything the three tools above cannot express, using the network's own field names: video metrics, impression share, quality rankings, placements, hourly and search-term reports, country, age and gender on Google, attribution-window comparisons on Meta, filters on any field, sorting, and object types such as pixels, labels, saved audiences and asset groups. | +| `ad_network_reference` | Searches the field catalogs of both networks. Claude uses it to find exact names before a `query_ad_network` call, and to explain what a metric means. | + +The catalogs behind these tools come from the networks themselves: Google's +own field schema and Meta's official Marketing API field lists. Every name +Claude passes is checked against them before a request is made, so Claude +cannot ask for a field that does not exist, and a name that is wrong comes +back with suggestions instead of a failed call. Almost everything the two +reporting APIs expose for reading is reachable this way. A few things to know when you read these numbers: @@ -184,6 +192,11 @@ A few things to know when you read these numbers: Only Meta and Google are covered. Accounts on other networks still appear in `list_ad_accounts` for campaign setup but cannot be queried. +A few Google reports need a specific resource rather than a breakdown. Country +uses `geographic_view`, age and gender use `age_range_view` and `gender_view`, +and search queries use `search_term_view`. Claude picks these through +`query_ad_network` when you ask. + ## What Claude can change Ask in plain language ("create a campaign for the Diwali sale") and Claude picks From d1093dae0f4839643d18aca1e0c6507e52095d1f Mon Sep 17 00:00:00 2001 From: Darshil Rathod <69842641+RathodDarshil@users.noreply.github.com> Date: Thu, 3 Sep 2026 00:17:08 +0530 Subject: [PATCH 3/5] docs(mcp): Linkrunner-first source table and the enrichment tool (LIN-2470) Co-Authored-By: Claude Fable 5.1 --- features/mcp.mdx | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/features/mcp.mdx b/features/mcp.mdx index 38eada3..7a68ef2 100644 --- a/features/mcp.mdx +++ b/features/mcp.mdx @@ -146,14 +146,15 @@ for "measured zero". Ask for a metric by name and Claude will fetch it. ## What Claude can read from your ad accounts -Tokens created with **Read connected ad accounts** get five more tools. They +Tokens created with **Read connected ad accounts** get six more tools. They read from the Meta Marketing API and the Google Ads API using the ad accounts already connected to the project under Settings, and nothing else. They cannot change anything on Meta or Google. | Tool | Use it for | |------|------------| -| `get_ad_insights` | Spend, impressions, clicks, CTR, CPC, CPM, reach, frequency, conversions and ROAS as the ad network reports them, at account, campaign, ad set or ad group, or ad level. Optional breakdown by date, device, platform, country, age or gender. | +| `enrich_campaigns_from_ad_network` | Adds the network's delivery figures (spend, impressions, clicks, reach, frequency, CPM) and its own reported outcomes beside your Linkrunner campaigns, with a note explaining any gap between the two. | +| `get_ad_insights` | Spend, impressions, clicks, CTR, CPC, CPM, reach and frequency as the ad network reports them, at account, campaign, ad set or ad group, or ad level, with the network's own conversions under `network_reported`. Optional breakdown by date, device, platform, country, age or gender. | | `list_ad_entities` | Campaigns, ad sets or ad groups, ads, creatives, audiences, conversion actions and keywords, with status, budget and objective. | | `get_ad_entity` | Every readable field of one object, such as an ad set's targeting or a campaign's bidding strategy. | | `query_ad_network` | Anything the three tools above cannot express, using the network's own field names: video metrics, impression share, quality rankings, placements, hourly and search-term reports, country, age and gender on Google, attribution-window comparisons on Meta, filters on any field, sorting, and object types such as pixels, labels, saved audiences and asset groups. | @@ -166,7 +167,27 @@ cannot ask for a field that does not exist, and a name that is wrong comes back with suggestions instead of a failed call. Almost everything the two reporting APIs expose for reading is reachable this way. -A few things to know when you read these numbers: +### Which source answers which question + +Linkrunner stays the source of truth, and connecting an ad account does not +change any answer you already get. It adds to them. + +| Question | Source | Why | +|----------|--------|-----| +| Installs, reinstalls, sign-ups, events, purchases, revenue | Linkrunner | Attributed per device and per user, deduplicated across networks, and the same numbers as the dashboard. | +| Retention, active users, funnels, attribution detail | Linkrunner only | Only Linkrunner has the user-level history. | +| Cost per install, cost per sign-up, ROAS | Linkrunner | Synced ad spend divided by Linkrunner outcomes, the same as the dashboard. | +| Spend, impressions, clicks, reach, frequency, CTR, CPC, CPM | Ad network | The network bills it, and its live figure is the latest. | +| Status, budgets, bids, targeting, placements, creatives, audiences, keywords | Ad network only | Only the network knows. | + +The network's own conversion counts are still available, but always under a +`network_reported` label, and Claude quotes them as the network's claim +("Meta reports 12 purchases") rather than as the count. When the two sides +disagree, Claude explains why (attribution window, view-through, SKAN delay, +cross-network deduplication, or a campaign that is not linked) instead of +picking one. + +A few things to know when you read network numbers: - **They are the ad network's numbers.** Meta and Google count conversions with their own attribution windows and view-through rules. Linkrunner's From e727bda3c5e831a4780727fa10d64f0da2e52726 Mon Sep 17 00:00:00 2001 From: Darshil Rathod <69842641+RathodDarshil@users.noreply.github.com> Date: Thu, 3 Sep 2026 00:54:01 +0530 Subject: [PATCH 4/5] docs(mcp): explain that Google installs come from DOWNLOAD conversion actions Co-Authored-By: Claude Fable 5.1 --- features/mcp.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/features/mcp.mdx b/features/mcp.mdx index 7a68ef2..5d45539 100644 --- a/features/mcp.mdx +++ b/features/mcp.mdx @@ -200,6 +200,11 @@ A few things to know when you read network numbers: - **Meta has no single "conversions" number.** Claude reads the actions Meta reports (app installs, purchases, leads and so on) and names the one it is quoting. +- **Google's "Conversions" column is not installs.** It adds up every + conversion action the account bids on (installs, trials, purchases). When + comparing installs, Claude uses only Google's install conversion actions + (the DOWNLOAD category, such as Android first open) and names the action it + used. - **Answers may come from a short cache.** Closed date ranges are cached for a day, open ranges for ten minutes, and object lists for five minutes. Claude mentions the age when it matters. From 53ab4080282495b848e51c6154fba8ed6a0b8614 Mon Sep 17 00:00:00 2001 From: Darshil Rathod <69842641+RathodDarshil@users.noreply.github.com> Date: Thu, 3 Sep 2026 11:24:50 +0530 Subject: [PATCH 5/5] [verified] docs(mcp): add setup guides for supported clients --- features/mcp.mdx | 305 ++++++++++++++++++------------ images/mcp/connect-linkrunner.png | Bin 0 -> 35497 bytes 2 files changed, 188 insertions(+), 117 deletions(-) create mode 100644 images/mcp/connect-linkrunner.png diff --git a/features/mcp.mdx b/features/mcp.mdx index 5d45539..b602c53 100644 --- a/features/mcp.mdx +++ b/features/mcp.mdx @@ -1,15 +1,15 @@ --- -title: "Linkrunner MCP for Claude" +title: "Connect Linkrunner to AI assistants" sidebarTitle: "MCP" -description: "Ask Claude questions about your campaigns, attribution, and revenue from chat." +description: "Connect Linkrunner to Claude, ChatGPT, Claude Code, or Codex with MCP." icon: "sparkles" --- ## Overview -Linkrunner ships a Model Context Protocol (MCP) server that lets Claude answer -questions about your project's data directly from chat. Generate a token in the -dashboard, add it as a Custom Connector in Claude.ai, and ask things like: +Linkrunner ships a remote Model Context Protocol (MCP) server. Connect it to a +supported AI assistant, then ask questions about your project's data directly +from chat: - "How did my campaigns perform last week?" - "Compare my Meta vs Google performance for the last 7 days." @@ -18,26 +18,26 @@ dashboard, add it as a Custom Connector in Claude.ai, and ask things like: - "How much of my growth is organic?" - "Where do users drop off between install and checkout?" -With the ad-accounts capability, Claude can also read straight from the Meta -and Google accounts you have connected: +With the ad-accounts capability, the assistant can also read from the Meta and +Google accounts you have connected: - "How much did we spend on Meta last week, by campaign?" - "Which Google ad groups are paused right now?" - "What targeting does our retargeting ad set use?" - "Compare Meta's reported spend with Linkrunner's installs for yesterday." -Claude can also make a defined set of changes for you: +The assistant can also make a defined set of changes for you: - "Create a Meta campaign for the Diwali sale pointing at our sneakers page." - "Pause every campaign with no installs in the last 30 days." - "Save a funnel for install, sign up, then purchase." -Editing tools act on your live project, not a sandbox. Claude can create and -edit campaigns, funnels, domains, store listings, webhooks, and postback event -mappings. A few of these send real traffic to third parties or cannot be undone. -Read [What Claude can change](#what-claude-can-change) before you share the -connector with a team. +Editing tools act on your live project, not a sandbox. The connector can create +and edit campaigns, funnels, domains, store listings, webhooks, and postback +event mappings. A few of these send real traffic to third parties or cannot be +undone. Read [What the connector can change](#what-the-connector-can-change) +before you share the connector with a team. ## Prerequisites @@ -45,11 +45,11 @@ connector with a team. - A project on Linkrunner that you have access to. - The **Admin** or **Member** role on that project. **Influencers** cannot mint MCP tokens. +- A supported client: Claude Code, Claude on Desktop or web, Codex CLI, or + ChatGPT web. - Editing tools run as the person who created the token, using that person's project permissions. A role that cannot edit in the dashboard cannot edit - through Claude either. -- A Claude.ai account on a plan that supports Custom Connectors (Pro, Team, or - Enterprise). + through the connector either. ## Setup @@ -60,12 +60,13 @@ connector with a team. 2. Click **MCP** in the sidebar. 3. Choose what the token may do: - **Read Linkrunner data** is always on. - - **Make changes in Linkrunner** lets Claude use the editing tools listed - under [What Claude can change](#what-claude-can-change). Turn it off for - a read-only token. - - **Read connected ad accounts** lets Claude read your connected Meta and - Google accounts. See - [What Claude can read from your ad accounts](#what-claude-can-read-from-your-ad-accounts). + - **Make changes in Linkrunner** lets the assistant use the editing tools + listed under + [What the connector can change](#what-the-connector-can-change). Turn it + off for a read-only token. + - **Read connected ad accounts** lets the assistant read your connected + Meta and Google accounts. See + [What the connector can read from your ad accounts](#what-the-connector-can-read-from-your-ad-accounts). 4. Click **Generate Token**. 5. The dashboard shows a one-time **Server URL** with the token already embedded as a query parameter. Copy it now. The full URL will not be shown @@ -81,35 +82,102 @@ don't paste it into shared documents, screenshots, or chat threads. Revoke it from the dashboard if it leaks, and generate a new one. -### 2. Add the connector in Claude - -Under **Register the Linkrunner MCP server**, the dashboard shows a ready-made -command with your server URL already filled in. Copy it and run it in a -terminal: - -```bash -claude mcp add linkrunner --scope user --transport http "" -``` - -The token is part of the URL, so no separate authentication step is needed. +### 2. Connect your client + +Choose your client in the dashboard to see its setup instructions. The +token is part of the Server URL, so no separate authentication step is needed. + +![Choose a client for the Linkrunner MCP connection](/images/mcp/connect-linkrunner.png) + + + + Copy the command under **Register the Linkrunner MCP server** and run it in + a terminal: + + ```bash + claude mcp add linkrunner --scope user --transport http "" + ``` + + Start a new Claude Code session and run `/mcp` to verify the connection. + + + + These steps work in Claude Desktop and at [claude.ai](https://claude.ai). + + On Free, Pro, or Max: + + 1. Open **Customize → Connectors**. + 2. Select **+ → Add custom connector** and name it `Linkrunner`. + 3. Paste the Server URL from the dashboard. + + On Team or Enterprise, an Owner or Primary Owner first adds the Server URL + under **Organization settings → Connectors**. Members then open + **Customize → Connectors** and connect Linkrunner. + + In a chat, select **+ → Connectors** and enable Linkrunner for that + conversation. + + See [Anthropic's custom connector guide](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp) + for current plan and organization details. + + + + Copy the command under **Register the Linkrunner MCP server** and run it in + a terminal: + + ```bash + codex mcp add linkrunner --url "" + ``` + + Start a new Codex session and run `/mcp` to verify the connection. + + + + + Custom MCP apps currently work in ChatGPT on the web. ChatGPT Desktop is + not supported. Pro apps can use read and fetch tools only. Turn off + **Make changes in Linkrunner** before generating a token on Pro. Full MCP + support, including write tools, is rolling out in beta to Business and + Enterprise/Edu workspaces. + + + 1. Enable Developer mode: + - On Pro, open **Settings → Apps → Advanced settings**. + - On Business, an admin or owner enables Developer mode from + **Workspace settings → Apps → Create**. + - On Enterprise/Edu, an admin grants access under **Permissions & Roles + → Connected Data**. Enabled users then turn on Developer mode under + **Settings → Apps → Advanced settings**. + 2. Open **Settings → Apps → Create**. On Business, an admin or owner uses + **Workspace settings → Apps → Create** instead. + 3. Name the app `Linkrunner` and paste the Server URL as the MCP endpoint. + 4. Choose no authentication, then select **Scan tools** and **Create**. + 5. Test the draft in a new chat. To make it available to workspace members, + an admin or owner opens **Workspace settings → Apps → Drafts** and + selects **Publish**. + 6. Start a chat, select **Apps**, and choose Linkrunner. + + See [OpenAI's MCP apps guide](https://help.openai.com/en/articles/12584461) + for current plan and role requirements. + + -You only need one connector per project. If you manage several Linkrunner -projects, generate a token for each project and add a separate Claude -connector for each one with a clear name. Tokens are scoped to a single -project. +You only need one connection per client and project. If you manage several +Linkrunner projects, generate a token for each project and add a separate +connection with a clear name. Tokens are scoped to a single project. ### 3. Try it -Open a new chat in Claude, make sure your Linkrunner connector is enabled in -the chat's tools, and ask one of the starter prompts above. Claude will fetch -data through the connector and answer in plain language. +Open a new chat or CLI session, make sure Linkrunner is enabled, and ask one of +the starter prompts above. The assistant fetches data through the connector +and answers in plain language. -## What Claude can answer +## What you can ask -The connector exposes the following tools. Claude picks them automatically -based on your question. +The connector exposes the following tools. Your assistant picks them +automatically based on your question. | Tool | Use it for | |------|------------| @@ -133,18 +201,19 @@ based on your question. | `list_postback_event_maps` | Event mappings sent to each ad network, and which are network defaults. | | `get_webhook` | Whether a webhook is configured, its host, and its organic setting. | -Claude reads these tools' descriptions and decides which to call. You don't -need to invoke them manually. +Your assistant reads these tools' descriptions and decides which to call. You +don't need to invoke them manually. `list_campaigns`, `get_channel_performance`, and `get_organic_performance` -return only the metric groups Claude asks for (installs, spend, retention, -custom events, and so on). A group that wasn't requested is absent from the -response rather than reported as zero, so Claude never mistakes "not fetched" -for "measured zero". Ask for a metric by name and Claude will fetch it. +return only the metric groups your assistant asks for (installs, spend, +retention, custom events, and so on). A group that wasn't requested is absent +from the response rather than reported as zero, so the assistant never +mistakes "not fetched" for "measured zero". Ask for a metric by name and it +will fetch it. -## What Claude can read from your ad accounts +## What the connector can read from your ad accounts Tokens created with **Read connected ad accounts** get six more tools. They read from the Meta Marketing API and the Google Ads API using the ad accounts @@ -158,14 +227,14 @@ change anything on Meta or Google. | `list_ad_entities` | Campaigns, ad sets or ad groups, ads, creatives, audiences, conversion actions and keywords, with status, budget and objective. | | `get_ad_entity` | Every readable field of one object, such as an ad set's targeting or a campaign's bidding strategy. | | `query_ad_network` | Anything the three tools above cannot express, using the network's own field names: video metrics, impression share, quality rankings, placements, hourly and search-term reports, country, age and gender on Google, attribution-window comparisons on Meta, filters on any field, sorting, and object types such as pixels, labels, saved audiences and asset groups. | -| `ad_network_reference` | Searches the field catalogs of both networks. Claude uses it to find exact names before a `query_ad_network` call, and to explain what a metric means. | +| `ad_network_reference` | Searches the field catalogs of both networks. Your assistant uses it to find exact names before a `query_ad_network` call, and to explain what a metric means. | The catalogs behind these tools come from the networks themselves: Google's -own field schema and Meta's official Marketing API field lists. Every name -Claude passes is checked against them before a request is made, so Claude -cannot ask for a field that does not exist, and a name that is wrong comes -back with suggestions instead of a failed call. Almost everything the two -reporting APIs expose for reading is reachable this way. +own field schema and Meta's official Marketing API field lists. Every name the +assistant passes is checked against them before a request is made, so it cannot +ask for a field that does not exist. A wrong name comes back with suggestions +instead of a failed call. Almost everything the two reporting APIs expose for +reading is reachable this way. ### Which source answers which question @@ -181,9 +250,9 @@ change any answer you already get. It adds to them. | Status, budgets, bids, targeting, placements, creatives, audiences, keywords | Ad network only | Only the network knows. | The network's own conversion counts are still available, but always under a -`network_reported` label, and Claude quotes them as the network's claim +`network_reported` label. Your assistant quotes them as the network's claim ("Meta reports 12 purchases") rather than as the count. When the two sides -disagree, Claude explains why (attribution window, view-through, SKAN delay, +disagree, it explains why (attribution window, view-through, SKAN delay, cross-network deduplication, or a campaign that is not linked) instead of picking one. @@ -191,28 +260,28 @@ A few things to know when you read network numbers: - **They are the ad network's numbers.** Meta and Google count conversions with their own attribution windows and view-through rules. Linkrunner's - installs and sign-ups are measured differently. Claude reports the two side - by side and will not merge them. + installs and sign-ups are measured differently. Your assistant reports the + two side by side and will not merge them. - **Currency and timezone come from the ad account**, which may differ from your project's display currency. - **The last three days are provisional.** Networks keep adjusting spend and conversions for a few days, so recent numbers can move. -- **Meta has no single "conversions" number.** Claude reads the actions Meta - reports (app installs, purchases, leads and so on) and names the one it is - quoting. +- **Meta has no single "conversions" number.** Your assistant reads the actions + Meta reports (app installs, purchases, leads and so on) and names the one it + is quoting. - **Google's "Conversions" column is not installs.** It adds up every conversion action the account bids on (installs, trials, purchases). When - comparing installs, Claude uses only Google's install conversion actions - (the DOWNLOAD category, such as Android first open) and names the action it - used. + comparing installs, the assistant uses only Google's install conversion + actions (the DOWNLOAD category, such as Android first open) and names the + action it used. - **Answers may come from a short cache.** Closed date ranges are cached for a - day, open ranges for ten minutes, and object lists for five minutes. Claude - mentions the age when it matters. + day, open ranges for ten minutes, and object lists for five minutes. The + assistant mentions the age when it matters. - **Reads are budgeted.** Each token gets a daily allowance of live reads, and Linkrunner reserves part of its Google Ads quota for attribution. When a - limit is hit, Claude gets a wait time and a cached copy if one exists, + limit is hit, the assistant gets a wait time and a cached copy if one exists, instead of an error loop. -- **Meta connections expire** roughly every 60 days. If Claude reports that +- **Meta connections expire** roughly every 60 days. If your assistant reports that the connection has expired, reconnect Meta under Settings. Only Meta and Google are covered. Accounts on other networks still appear in @@ -220,19 +289,19 @@ Only Meta and Google are covered. Accounts on other networks still appear in A few Google reports need a specific resource rather than a breakdown. Country uses `geographic_view`, age and gender use `age_range_view` and `gender_view`, -and search queries use `search_term_view`. Claude picks these through +and search queries use `search_term_view`. The assistant picks these through `query_ad_network` when you ask. -## What Claude can change +## What the connector can change -Ask in plain language ("create a campaign for the Diwali sale") and Claude picks -the right tool. Describe what you want changed, and confirm the summary it gives -you before it writes. +Ask in plain language ("create a campaign for the Diwali sale") and your +assistant picks the right tool. Describe what you want changed, and confirm the +summary it gives you before it writes. -Every tool below writes to your live project. Claude asks before making an -ambiguous change, but it is worth being specific about what you want, especially -for the tools marked as sending live traffic or being irreversible. +Every tool below writes to your live project. Your assistant asks before making +an ambiguous change, but it is worth being specific about what you want, +especially for the tools marked as sending live traffic or being irreversible. ### Campaigns @@ -245,7 +314,8 @@ for the tools marked as sending live traffic or being irreversible. A deep link has to be a full URL on one of your own tracking domains, for example `https://links.yourbrand.com/product/sneakers`. An external URL is -rejected. Ask Claude to list your domains if you are not sure which to use. +rejected. Ask your assistant to list your domains if you are not sure which to +use. Campaigns cannot be deleted through the connector. Pause them with @@ -292,12 +362,12 @@ first. Both tools deliver a real payload to your endpoint. Saving a webhook sends one by itself, because Linkrunner only stores an endpoint that answers `200` or `201`, so configuring a Slack webhook posts a real message to that channel. Ask -Claude to test afterwards only if you want a second message. +your assistant to test afterwards only if you want a second message. Replacing the URL cannot be undone. A project has one webhook, the new URL -overwrites the old one, and Claude cannot read the old value back to restore it -(`get_webhook` hides the path, because a Slack webhook path is itself a -credential). Keep a copy of the current URL before you replace it. +overwrites the old one, and the assistant cannot read the old value back to +restore it (`get_webhook` hides the path, because a Slack webhook path is +itself a credential). Keep a copy of the current URL before you replace it. ### Postback event mappings @@ -321,12 +391,13 @@ your own mapping for the same event. ## Built-in prompts -The connector also surfaces three starter prompts in Claude's prompt picker: +The connector includes three starter prompts. Clients that support MCP prompts +show them in their prompt picker: -- **Daily briefing** — yesterday's performance summary in 1-2 paragraphs. -- **Weekly review** — this week vs last week, with anomalies and a +- **Daily briefing:** yesterday's performance summary in 1-2 paragraphs. +- **Weekly review:** this week vs last week, with anomalies and a keep/cut/scale recommendation list. -- **Cut list** — the worst-performing active campaigns, with reasoning. +- **Cut list:** the worst-performing active campaigns, with reasoning. These are shortcuts. You can always ask the same questions in your own words. @@ -343,9 +414,9 @@ project. For each token you can see: Each token also shows its capabilities: **Read**, **Changes**, and **Ad accounts**. -Click the trash icon next to a token to revoke it. Anyone using that token in -Claude will be disconnected immediately. Revocation is not reversible. Mint a -new token if you need to reconnect. +Click the trash icon next to a token to revoke it. Anyone using that token will +be disconnected immediately. Revocation is not reversible. Mint a new token if +you need to reconnect. A project can have up to 10 active tokens at any time. If you hit the cap, revoke an unused token before creating a new one. @@ -366,7 +437,7 @@ revoke an unused token before creating a new one. and they are removed from every response and log. - An ad-account token can only reach accounts connected to its own project. Passing another project's account is refused. -- Claude cannot delete campaigns, funnels, domains, or projects, cannot manage +- The connector cannot delete campaigns, funnels, domains, or projects, cannot manage members, and cannot disconnect an ad-network account. Those stay in the dashboard. - The webhook URL is never fully readable. `get_webhook` returns the host but @@ -378,78 +449,78 @@ revoke an unused token before creating a new one. If you only want someone to read, turn off **Make changes in Linkrunner** when you generate their token. A read-only token does not even list the editing -tools, so Claude cannot attempt a change with it. +tools, so the assistant cannot attempt a change with it. ## Troubleshooting -**Claude says "Couldn't reach the MCP server."** +**The client says "Couldn't reach the MCP server."** The token may have been revoked, or the URL may be malformed. Generate a new -token, copy the full URL exactly, and re-add the connector. +token, copy the full URL exactly, and reconnect Linkrunner. -**Claude says it doesn't have access to the data.** -Make sure your Linkrunner connector is enabled in the current chat. Open the -chat's tool/connector menu and toggle it on. New chats don't always inherit -connector state from previous chats. +**The client does not show Linkrunner tools.** +Make sure Linkrunner is enabled in the current chat or session. Open the +client's app, tool, or connector menu and turn it on. New chats do not always +inherit connector state from previous chats. **Numbers don't match the dashboard.** The connector reads the same data the dashboard does. If you see a mismatch, -check that you and Claude are using the same date range and timezone, and -that any filters (network, platform) match. Linkrunner's ingestion is +check that you and the assistant are using the same date range and timezone, +and that any filters (network, platform) match. Linkrunner's ingestion is real-time, so there's no lag to account for. **Generating a token returns "Maximum of 10 active tokens reached."** You're at the per-project cap. Revoke an unused token from the same settings page before creating a new one. -**Claude says your deep link was rejected.** +**The assistant says your deep link was rejected.** A deep link has to be a full URL on one of your own tracking domains. An external address such as `https://example.com/promo` is refused, and so is a -bare path such as `/promo`. Ask Claude to list your domains and rebuild the URL -on one of them. +bare path such as `/promo`. Ask the assistant to list your domains and rebuild +the URL on one of them. **Saving a webhook fails with "Endpoint needs to return a status code of 200".** Linkrunner only stores an endpoint that answers `200` or `201` to the sample payload, and it must answer directly rather than redirecting. An endpoint that returns `202` or `204` cannot be saved. -**Claude says the token does not have the ad-accounts capability.** +**The assistant says the token does not have the ad-accounts capability.** The token was generated without **Read connected ad accounts**. Generate a new token with it turned on and re-add the connector. Capabilities cannot be added to an existing token. -**Claude says the Meta or Google connection has expired.** +**The assistant says the Meta or Google connection has expired.** The stored ad-network credential is no longer valid. Open Settings, reconnect the account, and ask again. Meta connections expire on their own roughly every 60 days. -**Claude says it has to wait before reading the ad account again.** +**The assistant says it has to wait before reading the ad account again.** A rate limit or daily allowance was reached, either on the ad network or on the -token. Claude is given a wait time and uses a cached answer when one exists. -Ask again after the wait, or narrow the question so fewer live reads are -needed. +token. The assistant is given a wait time and uses a cached answer when one +exists. Ask again after the wait, or narrow the question so fewer live reads +are needed. **Ad-network spend does not match the spend Linkrunner shows.** The two are expected to differ. Ad-account tools return what Meta or Google report for the ad account, in the account's currency and timezone. Linkrunner's campaign spend is synced periodically and shown in your display currency. Ask -Claude for both and it will label which is which. +your assistant for both and it will label which is which. -**Claude cannot rename a custom channel.** -Renaming needs the channel's internal id, which Claude only sees right after it -creates or edits a campaign. In a later chat it has no way to look the id up. -Rename the channel in the dashboard instead. +**The assistant cannot rename a custom channel.** +Renaming needs the channel's internal id, which the assistant only sees right +after it creates or edits a campaign. In a later chat it has no way to look the +id up. Rename the channel in the dashboard instead. -Asking Claude to rename a channel by editing the campaign does something +Asking the assistant to rename a channel by editing the campaign does something different. It points the campaign at a new channel and leaves the old one behind, which changes the channel's reporting name and splits its history. ## What this is not -- Not a full write API. Claude can make the changes listed above, and nothing - else. Use the [Linkrunner data API](/api-reference/data-apis) for +- Not a full write API. The connector can make the changes listed above, and + nothing else. Use the [Linkrunner data API](/api-reference/data-apis) for programmatic writes. - Not a way to delete things. Campaigns, funnels, domains, and projects can only be deleted from the dashboard. diff --git a/images/mcp/connect-linkrunner.png b/images/mcp/connect-linkrunner.png new file mode 100644 index 0000000000000000000000000000000000000000..0359dc9e61ce1465f70041aa4d21bef16afde6a1 GIT binary patch literal 35497 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