The Supermetrics MCP connector routes your AI agent's tool calls to Supermetrics's own MCP server through Scalekit. Each user signs in to Supermetrics once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 21 tools.
- Tools
- 21
- What they doRead · write · destructive
- 12 · 9 · 012 read9 write0 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
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 Supermetrics MCP connection
In AgentKit > Connections, create a Supermetrics MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Supermetrics 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
Supermetrics MCP uses Dynamic Client Registration (DCR) — no client ID or secret is required. The only step is creating a connection in Scalekit and authorizing your Supermetrics account.
-
Create a connection in Scalekit
- In the Scalekit dashboard, go to AgentKit → Connections → Create Connection.
- Search for Supermetrics MCP and click Create.
- Note the Connection name — use this as
connection_namein your code (e.g.,supermetricsmcp).
-
Authorize your Supermetrics account
Generate an authorization link and open it in a browser to complete the Supermetrics OAuth flow.
The user is redirected to Supermetrics to sign in and grant access. Scalekit stores the token and injects it automatically into every tool call — 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 = 'supermetricsmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Supermetrics 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: 'supermetricsmcp_data_source_discovery',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 = "supermetricsmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Supermetrics MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="supermetricsmcp_data_source_discovery",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_toolsupermetricsmcp_accounts_discoveryList connected ad accounts and profiles for a marketing or advertising data source.Read-onlyAccounts Discovery
List connected ad accounts and profiles for a marketing or advertising data source.
Inputs
ds_idstringrequired- Data source ID from data_source_discovery (e.g. 'FA', 'AW', 'GAWA')
compressstring- Always recommended. Encodes response as compact text, reducing size and token usage. In tables, an empty cell means not set and list values are |-joined.
filterstring- Case-insensitive filter against account ID, name, group, tags (comma-separated)
supermetricsmcp_campaign_and_resource_getRetrieve campaign details, performance metrics, or related resources from an advertising platform.Read-onlyCampaign And Resource Get
Retrieve campaign details, performance metrics, or related resources from an advertising platform.
Inputs
account_idstringrequired- Ad account or profile ID for the selected data source.
ds_idstringrequired- Data source identifier (e.g. `GA4`, `FA`, `ADWORDS`). Use `data_source_discovery` to list available IDs.
max_rowsstring- Maximum number of rows to return.
paramsstring- Resource-type-specific parameters. See ResourceParams for which fields apply to each resource_type.
resource_typestring- Type of resource to retrieve (e.g. `CAMPAIGN`, `AD_GROUP`).
supermetricsmcp_data_queryQuery marketing analytics data from any connected data source, with optional date ranges, field selection, and filters.Read-onlyData Query
Query marketing analytics data from any connected data source, with optional date ranges, field selection, and filters.
Inputs
ds_idstringrequired- Data source ID from data_source_discovery (e.g. 'FA', 'AW', 'GAWA')
compare_end_datestring- YYYY-MM-DD (when compare_type=custom)
compare_showstring- perc_change (default), abs_change, or value
compare_start_datestring- YYYY-MM-DD (when compare_type=custom)
compare_typestring- prev_range, prev_year, prev_year_weekday, or custom (with compare_start/end_date)
compressstring- Always recommended. Returns completed rows as a compact text table whose columns are the requested field IDs.
date_range_typestring- A date range is required for nearly all data sources (is_date_range_required=true in data_source_discovery config). Use a relative range: last_7_days, last_30_days, last_90_days, last_month, this_month, yesterday, etc. (append '_inc' to include the current period), or 'custom' with start_date/end_date. Pass as a root-level parameter, NOT inside settings.
ds_accountsstring- Account IDs from accounts_discovery, or free-text identifier when is_free_text_account_required=true. Required when has_account_list=true.
end_datestring- YYYY-MM-DD. Required when date_range_type=custom.
fieldsstring- Field IDs from field_discovery, comma-separated. List dimensions before metrics (e.g. 'date,clicks,cost'); if unsure whether a field is a dimension or metric, check field_discovery. All fields must share a common report_type if the source uses report types.
filtersstring- Filter expression: field_name operator value, combined with AND/OR. Operators: ==, !=, >, >=, <, <=, =@ (contains), !@ (not contains), =~ (regex), !~ (not regex), [] (in list). Example: "country == US AND clicks > 100"
freshstring- Skip stored results and run the query again. Use only to confirm a change right after a write, e.g. a budget or status update; it is slower and uses more quota. Only for campaign management data sources (e.g. Facebook Ads, Google Ads). Not available with API keys or for every client; the result notes say when it was not applied.
max_rowsstring- Max rows to return (default 1000). Higher values may be capped by your license.
settingsstring- Data source settings from data_source_discovery as a JSON object. Include report_type and all setting_ids here.
start_datestring- YYYY-MM-DD. Required when date_range_type=custom.
timezonestring- IANA timezone (e.g. 'America/New_York'). Default: UTC.
supermetricsmcp_data_source_discoveryList all available marketing and advertising data sources supported by Supermetrics.Read-onlyData Source Discovery
List all available marketing and advertising data sources supported by Supermetrics.
Inputs
compressstring- Always recommended. Encodes response as compact text, reducing size and token usage.
ds_idstring- When provided, returns full config for this source. Omit to list all.
filterstring- Case-insensitive filter against ID, name, categories (e.g. 'ads,social')
supermetricsmcp_field_discoveryList available metrics and dimensions for a specific data source.Read-onlyField Discovery
List available metrics and dimensions for a specific data source. Returns field names usable in `data_query`.
Inputs
ds_idstringrequired- Data source ID from data_source_discovery (e.g. 'FA', 'AW', 'GAWA')
compressstring- Always recommended. Encodes response as compact text, reducing size and token usage. In tables, an empty cell means not set and list values are |-joined.
filterstring- Case-insensitive filter against field ID, name, description, type, alias or report type. Comma-separated list of terms, e.g. 'click,impression'.
supermetricsmcp_get_async_query_resultsRetrieve results of an async `data_query` using the schedule ID returned by that query.Read-onlyGet Async Query Results
Retrieve results of an async `data_query` using the schedule ID returned by that query.
Inputs
schedule_idstringrequired- Schedule ID returned by `data_query` for async result retrieval.
compressstring- Whether to compress the response payload.
supermetricsmcp_get_business_contextRetrieve the durable business context a team has saved â guidelines, policies, and preferences â so analysis and changes follow them.Read-onlyGet Business Context
Retrieve the durable business context a team has saved â guidelines, policies, and preferences â so analysis and changes follow them. Context is stored at three scopes, each read independently (a read returns one scope's entries, not a merge): - **Team** â applies everywhere (e.g. "report currency in EUR"). - **Data source** â a specific platform (e.g. "for Meta, break out Advantage+ separately"). - **Account** â a specific account (e.g. "this client reports last-click only"). Choose the scope with the ids: no ids â team level; `ds_id` â that data source's level; `ds_id`+`account_id` â that account's level. `tags` filters by category â a record matches if it carries **any** of the tags you pass (OR), and commas are just separators, so `tags: ["a,b"]` and `["a","b"]` both match records tagged a or b. Omit `tags` to read all entries at the scope; `tags` with no ids searches across all scopes, so a tag lookup isn't confined to one level. Results are grouped as `team`/`data_source`/`account` (empty omitted); a single-source data-source list is keyed `data_source:<ds_id>`. Prefer what the discovery tools already surface: `data_source_discovery` and `accounts_discovery` include team- and data-source-level context, and a narrowed `accounts_discovery` inlines an account's own context. Call this for a scope a discovery response did not cover â e.g. an account you are about to act on â to read tags whose context was too large to inline, or to re-read after a save.
Inputs
account_idstring- Account ID; requires ds_id; scopes to account level
ds_idstring- Data source code (e.g. AW, FA); scopes to data-source level
tagsstring- Categories, comma-separated or JSON array, to filter by â a record matches any of them (OR). Omit to read every entry at the scope; with no ds_id/account_id, a tag lookup searches all scopes
supermetricsmcp_get_dashboardsRead Supermetrics Studio dashboards: 'list' the dashboards the user owns or has been shared with (metadata only, no code, newest first; optional 'filter' narrows by id, title, description or tag, and 'limit'/'offset' paginate â the response carries 'total'), 'get' one dashboard's source code and metadata by ID, or 'changelog' its version history.Read-onlyGet Dashboards
Read Supermetrics Studio dashboards: 'list' the dashboards the user owns or has been shared with (metadata only, no code, newest first; optional 'filter' narrows by id, title, description or tag, and 'limit'/'offset' paginate â the response carries 'total'), 'get' one dashboard's source code and metadata by ID, or 'changelog' its version history. Load the current code with 'get' before editing.
Inputs
actionstringrequired- 'get' to retrieve a dashboard's source code and metadata by ID, 'changelog' to view its version history, 'list' to list the dashboards the user owns or has been shared with (metadata only, no code)one of
getchangeloglist dashboard_idstring- UUID of the dashboard. Required for 'get' and 'changelog'
filterstring- 'list' only: narrow by id, title, description, or tag (case-insensitive substring)
limitstring- 'list' only: page size (max 500)
offsetstring- 'list' only: rows to skip for pagination
supermetricsmcp_get_support_ticketsList the user's Supermetrics support tickets, or read one ticket's thread by ticket_id.Read-onlyGet Support Tickets
List the user's Supermetrics support tickets, or read one ticket's thread by ticket_id. Only the caller's own tickets are accessible. Check this before creating a new ticket: if an open one already covers the issue, reply to it with contact_supermetrics instead.
Inputs
ticket_idstring- Zendesk ticket ID: read that ticket's thread; omit to list all your tickets
supermetricsmcp_get_todayGet the current UTC date and time.Read-onlyGet Today
Get the current UTC date and time. Use before `data_query` to resolve relative date references.
Inputs
This tool takes no inputs.
supermetricsmcp_get_user_and_teamRead your Supermetrics account and team: your profile, permissions, license details and team members (get_info); a data source's prioritised (pinned) accounts with the cap and monthly change quota (get_prioritised_accounts, ds_id); or a login link for a data source (login_data_source, ds_id).Read-onlyGet User And Team
Read your Supermetrics account and team: your profile, permissions, license details and team members (get_info); a data source's prioritised (pinned) accounts with the cap and monthly change quota (get_prioritised_accounts, ds_id); or a login link for a data source (login_data_source, ds_id). Use get_info to find license_id and team member user_ids before assigning users to a subscription.
Inputs
actionstringrequired- get_info: your profile, permissions, license details and team members; get_prioritised_accounts: a data source's prioritised (pinned) accounts with the cap and monthly change quota; login_data_source: a login link for a data sourceone of
get_infoget_prioritised_accountslogin_data_source ds_idstring- Data source code (e.g. AW, FA); required for login_data_source and get_prioritised_accounts
supermetricsmcp_supermetrics_guideExplain what Supermetrics can do for this user, or show what has changed recently.Read-onlySupermetrics Guide
Explain what Supermetrics can do for this user, or show what has changed recently.
Inputs
modestring- Use `tour` (the default) for what the user can do with Supermetrics, or `whats_new` for capabilities added recently.
supermetricsmcp_contact_supermetricsSend product feedback, create a support ticket, or submit a sales enquiry to Supermetrics.WriteContact Supermetrics
Send product feedback, create a support ticket, or submit a sales enquiry to Supermetrics.
Inputs
messagestringrequired- Detailed description with span IDs (feedback/support/sales), or the reply body (ticket_reply)
subjectstringrequired- Brief summary (required for feedback/support/sales)
typestringrequired- feedback, support, sales, or ticket_reply (post a follow-up to an existing ticket)one of
feedbacksupportsalesticket_reply categorystring- Support ticket category (support only). Pick the one that matches the user's issue: category_authentication_issue (login, token or permission errors, reconnecting a data source); category_help_with_the_queries (query or transfer errors; the fallback when nothing else fits); category_data_discrepancy (missing or mismatching data); category_manage_subscription (data sources, destinations, users, trials, plan changes); category_manage_billing (invoices, payments, VAT)
companystring- Company (required for sales)
countrystring- Country (required for sales)
ds_idstring- Related data source ID (e.g. 'FA', 'AW')
firstnamestring- First name (required for sales)
industrystring- Contact's industry. Used when type is 'sales'
lastnamestring- Last name (required for sales)
ticket_idstring- Zendesk ticket ID to reply to (ticket_reply)
supermetricsmcp_creative_pickerOpen the creative picker to browse, upload, AI-generate, or import ad creatives with visual preview.WriteCreative Picker
Open the creative picker to browse, upload, AI-generate, or import ad creatives with visual preview. Works with both image and video creatives. Use it whenever the user wants to add an image or video. Pass asset_url or asset_prompt in params to auto-start; if the user already has an asset URL or ID, pass it directly to manage_campaign instead.
Inputs
account_idstring- Ad account ID from accounts_discovery
actionstring- browse_assets (default; opens the picker) or create_upload_url.
asset_typestring- Filter: 'image' or 'video'
ds_idstring- Ad platform: AW, FA, AC, TIK, LIA, CGPTA or SCM
paramsstring- Optional parameters. asset_url: auto-start with a URL upload. file_data: base64 image bytes (or a data: URI) to store server-side with action upload_creative â optional filename/content_type â returns a reusable upload_ref for manage_campaign (images only; use the widget or a public asset_url for video). asset_prompt: auto-start AI image generation (optional: width, height, count, quality). quality: 'quick' (default) or 'high'. create_upload_url: filename, content_type, size â returns a signed upload URL and upload_ref.
supermetricsmcp_instagram_insightsInstagram and Facebook (Meta) social media analytics and insights, using the same parameters and result format as data_query.WriteInstagram Insights
Instagram and Facebook (Meta) social media analytics and insights, using the same parameters and result format as data_query. Returns rows when completed; otherwise pass schedule_id to get_async_query_results. Metrics include engagement, engagement rate, reach, accounts reached, accounts engaged, followers, fans, follower growth, impressions, profile and page views, website and link clicks, top posts and best-performing content, content performance, stories, reels, video views, saves, likes, comments, shares, and audience demographics. Data sources (pass one as ds_id): - "IGI" â your connected Instagram business/creator account insights (media, reels, stories, top posts, follower demographics); - "IGPD2" â public data on any Instagram profile or hashtag (competitor benchmarking, business discovery, hashtag search); - "FB" â organic Facebook Page insights (page and post engagement, reach, fans/followers, impressions); - "FA" â Facebook & Instagram paid ad performance (Meta Ads); add the "publisher_platform" dimension to separate Facebook from Instagram placements (values include facebook and instagram; filter or segment on publisher_platform = instagram for Instagram-only ad metrics). Then use accounts_discovery to find the account IDs to pass in ds_accounts, and field_discovery to find the available field/metric IDs (and report types) for your chosen ds_id. To create or update Instagram (or Facebook) ad campaigns, use the manage_campaign tool. For any other platform (Google Ads, GA4, LinkedIn Ads, TikTok, and 170+ other data sources), use the data_query tool.
Inputs
ds_idstringrequired- Data source ID from data_source_discovery (e.g. 'FA', 'AW', 'GAWA')
compare_end_datestring- YYYY-MM-DD (when compare_type=custom)
compare_showstring- perc_change (default), abs_change, or value
compare_start_datestring- YYYY-MM-DD (when compare_type=custom)
compare_typestring- prev_range, prev_year, prev_year_weekday, or custom (with compare_start/end_date)
compressstring- Always recommended. Returns completed rows as a compact text table whose columns are the requested field IDs.
date_range_typestring- A date range is required for nearly all data sources (is_date_range_required=true in data_source_discovery config). Use a relative range: last_7_days, last_30_days, last_90_days, last_month, this_month, yesterday, etc. (append '_inc' to include the current period), or 'custom' with start_date/end_date. Pass as a root-level parameter, NOT inside settings.
ds_accountsstring- Account IDs from accounts_discovery, or free-text identifier when is_free_text_account_required=true. Required when has_account_list=true.
end_datestring- YYYY-MM-DD. Required when date_range_type=custom.
fieldsstring- Field IDs from field_discovery, comma-separated. List dimensions before metrics (e.g. 'date,clicks,cost'); if unsure whether a field is a dimension or metric, check field_discovery. All fields must share a common report_type if the source uses report types.
filtersstring- Filter expression: field_name operator value, combined with AND/OR. Operators: ==, !=, >, >=, <, <=, =@ (contains), !@ (not contains), =~ (regex), !~ (not regex), [] (in list). Example: "country == US AND clicks > 100"
freshstring- Skip stored results and run the query again. Use only to confirm a change right after a write, e.g. a budget or status update; it is slower and uses more quota. Only for campaign management data sources (e.g. Facebook Ads, Google Ads). Not available with API keys or for every client; the result notes say when it was not applied.
max_rowsstring- Max rows to return (default 1000). Higher values may be capped by your license.
settingsstring- Data source settings from data_source_discovery as a JSON object. Include report_type and all setting_ids here.
start_datestring- YYYY-MM-DD. Required when date_range_type=custom.
timezonestring- IANA timezone (e.g. 'America/New_York'). Default: UTC.
supermetricsmcp_manage_business_contextStore and retrieve durable business context â guidelines, policies, and preferences a team wants applied consistently and shared with all members.WriteManage Business Context
Store and retrieve durable business context â guidelines, policies, and preferences a team wants applied consistently and shared with all members. Context can cover reporting conventions, analysis rules, brand and tone, data governance, naming, plans, or account-specific preferences. Stored at three scopes, each read independently (a `get` returns one scope's context, not a merge): - **Team** â applies everywhere (e.g. "report currency in EUR"). - **Data source** â a specific platform (e.g. "for Meta, break out Advantage+ separately"). - **Account** â a specific account (e.g. "this client reports last-click only"). **Actions:** - `get` â Retrieve context by scope, chosen by the ids (no cascade): no ids â team-level; `ds_id` â that data source's level; `ds_id`+`account_id` â that account's level. `tags` filters by tag â a record matches if it carries **any** of the tags you pass (OR); commas are just separators, so `tags: ["a,b"]` and `["a","b"]` both match records tagged a or b â handy for fetching several clients at once (e.g. one client tag per client, then `["acme,globex"]`). Omit `tags` to read all entries at the scope, and **`tags` with no ids searches across all scopes**, so a tag lookup isn't confined to one level. Returned grouped as `team`/`data_source`/`account` (empty omitted); a single-source data-source list is keyed `data_source:<ds_id>` (e.g. `data_source:AW`). To assemble everything applicable to an account, read the levels separately â or rely on the discovery tools, which surface applicable context automatically. - `save` â Create/update at a scope; needs `context_text` and `tags` (a tag can't contain a comma). Tags identify the entry within a scope, so a scope can hold several entries (one per tag set): `mode: "replace"` (default) overwrites the entry with those tags, `mode: "append"` concatenates to it, and a different tag set is saved as a separate entry rather than overwriting. - `delete` â Remove the single entry identified by scope (`ds_id`/`account_id`) **and** `tags` â it targets that one tag set, never the others at the scope. Omit `tags` to remove the untagged entry. Irreversible, so confirm first. **When to save:** when the user shares a plan, guidelines, or SOP; states a durable preference ("for this client, alwaysâ¦"); or corrects your approach â offer to save it so it applies in future sessions. Distill the key, reusable rules â do not store documents verbatim â and tag them (e.g. "data-analysis", "targeting", "naming-conventions", "brand-visuals", "brand-language"). Tags are how you retrieve an entry later â use category tags, or, to group context the scope can't (an agency client that spans several accounts and platforms), the client's name: a team-level entry tagged with a client name that maps the client to its accounts is a good pattern. Avoid tags that merely restate the scope (a data-source entry's own data source, an account's own id). **When to read:** prefer what the discovery tools already surface â `data_source_discovery` and `accounts_discovery` include team- and data-source-level context in their responses, and a narrowed `accounts_discovery` (â¤3 accounts) inlines an account's own context. When a discovery response surfaces a scope only as a tag list (its context was too large to inline), read the tags relevant to the action you're taking with `get`. Also call `get` for a scope a discovery response did not cover â e.g. an account you are about to act on that was not in a discovery result â or to re-read after you `save`. A discovery response also states when the team has no saved context yet, so don't call `get` merely to check whether any exists. Apply context when analysing data and making changes.
Inputs
actionstringrequired- save: create or update the entry; delete: remove itone of
savedelete account_idstring- Account ID; requires ds_id; scopes to account level
context_textstring- The context â guidelines, policies, or preferences. Required for 'save'. Up to 10,000 characters per entry; split larger material into separate tagged entries
ds_idstring- Data source code (e.g. AW, FA); scopes to data-source level
modestring- 'replace' (default) overwrites the entry with these tags; 'append' concatenates to it. A different tag set is saved as a separate entry
tagsstring- Categories, comma-separated or JSON array. Tags identify the entry within a scope: required for 'save'. 'delete' targets the single entry with these tags
supermetricsmcp_manage_campaignCreate or update a campaign (AW/FA/TIK/LIA/AC/CGPTA/SCM).WriteManage Campaign
Create or update a campaign (AW/FA/TIK/LIA/AC/CGPTA/SCM). Provide campaign_id to update an existing campaign; omit it to create a new one (budget_amount required when creating). On update only provided fields change. Also creates/updates ad groups/ads â see ad_groups (operations inferred from id presence). AW PMax: set ad_groups[].id to update asset groups. AW/AC keywords: ad_groups[].add_keywords/remove_keywords append/remove POSITIVE keywords; Partial success possible: check write_status and failures if present, otherwise notes; don't retry blindly. Creative: use asset_url (public https:// URL), asset_id, upload_ref (from creative_picker), or object_story_id (existing post). Use campaign_and_resource_get for full details after writing.
Inputs
account_idstringrequired- Ad account ID from accounts_discovery (e.g. '1234567890' or 'act_123456')
ds_idstringrequired- Ad platform: AW (Google), FA (Meta), AC (Microsoft), TIK (TikTok), LIA (LinkedIn), CGPTA (ChatGPT), SCM (Snapchat)
ad_groupsstring- Ad groups (AW/AC) or ad sets (FA/TIK). Operations are inferred from id presence: create new ad set [{name, ads: [...]}] (no id); create ads in an existing ad set [{id: 'ad_set_id', ads: [{name, creative, platform_settings}]}]; update ad set settings [{id: 'ad_set_id', budget_amount, ...}]. AW PMax: set ad_groups[].id to update asset groups.
bidding_strategystring- AW: MANUAL_CPC|MAXIMIZE_CLICKS|MAXIMIZE_CONVERSIONS|MAXIMIZE_CONVERSION_VALUE|TARGET_CPA|TARGET_ROAS. FA: LOWEST_COST_WITHOUT_CAP|LOWEST_COST_WITH_BID_CAP|COST_CAP|TARGET_ROAS (update requires CBO; ABO campaigns can't change strategy; LOWEST_COST_WITH_BID_CAP needs bid_amount on each ad set). AC: MAX_CLICKS|MAX_CONVERSIONS|MANUAL_CPC|ENHANCED_CPC|TARGET_CPA|TARGET_ROAS. SCM: AUTO_BID|LOWEST_COST_WITH_MAX_BID|TARGET_COST (set per ad squad, not campaign).
budget_amountstring- Budget in account currency
budget_typestring- DAILY or LIFETIME. LIA/CGPTA: LIFETIME only at campaign level.
campaign_idstring- Campaign ID from campaign_and_resource_get. Provide it to UPDATE an existing campaign; omit it to CREATE a new one.
contains_eu_political_adsstring- AW only. Google requires the advertiser to declare whether a campaign contains EU political advertising. Send it when creating an AW campaign, and when changing an AW campaign's location targeting if it has not been declared yet. Set false for an ordinary commercial campaign; set true only if it runs political ads in the EU. Ask the user if you are unsure â do not guess true. If omitted, false is declared.
end_datestring- YYYY-MM-DD or YYYY-MM-DDThh:mm:ss (required for LIFETIME budgets). FA update: does not move an existing ad set â set it in ad_groups[].platform_settings.
extensionsstring- Ad extensions (AW/AC only). On update this replaces the campaign's extensions.
namestring- Campaign name. Required when creating.
platform_settingsstring- AW: {campaign_type: SEARCH|DISPLAY|SHOPPING|PERFORMANCE_MAX|DEMAND_GEN|MULTI_CHANNEL (App), product_filter: {mode: include|exclude, conditions: [{dimension, values}]} for retail campaigns (e.g. {mode: include, conditions: [{dimension: custom_label_0, values: [top seller]}]}; omit the filter to serve all products; dimensions: custom_label_0..4, product_item_id, brand, condition, product_type_l1..l5, channel), shopping_setting: {merchant_id} (auto-detected when the account has one linked Merchant Center; set it to choose among several), geo_target_type (PRESENCE|PRESENCE_OR_INTEREST|SEARCH_INTEREST â PRESENCE reaches people in or regularly in the targeted locations, PRESENCE_OR_INTEREST also reaches people elsewhere who show interest in them, SEARCH_INTEREST triggers on searching for the location (Search and standard Shopping campaigns only); Campaign-level only, settable on create and update), network_settings ({search, search_partners, display}: true/false only â which networks serve; search_partners needs search, and on create defaults to search; Display campaigns cannot use search), negative_keyword_lists (not PMax/Demand Gen/Video; read current lists first via resource_type negative_keyword_lists; [{name, keywords?: [{text, match_type BROAD|PHRASE|EXACT, default PHRASE}]}] = the campaign's full set of shared lists, [] detaches all; new name+keywords creates; existing name+keywords (even []) replaces its keywords for EVERY campaign using it, named in notes; name alone attaches), ai_max_enabled (bool, default false; SEARCH only â enables AI Max: Google optimizes keywords, creatives and landing pages), final_url_expansion (bool, default true; false opts out of expanding to other landing pages; PMax, and Search when ai_max_enabled)}. AW PERFORMANCE_MAX also: {conversion_goals (category names e.g. PURCHASE,LEAD,SIGNUP to narrow the campaign to specific conversion goals; non-account goals are ignored with a note), brand_exclusions (brand names to exclude, resolved via Google; max 20), business_name, logo_url|logo_id|logo_data|logo_prompt (campaign-level brand assets, win over the same creative fields; on update each replaces the current one)}. AC: {campaign_type: SEARCH|AUDIENCE|SHOPPING|PERFORMANCE_MAX}. FA: {objective: OUTCOME_TRAFFIC|OUTCOME_ENGAGEMENT|OUTCOME_LEADS|OUTCOME_SALES|OUTCOME_AWARENESS, campaign_budget_optimization (true=CBO budget at campaign; false=ABO budget per ad set), special_ad_categories (HOUSING|EMPLOYMENT|CREDIT|ISSUES_ELECTIONS_POLITICS; create only), special_ad_category_country (ISO alpha-2 list, e.g. [NO]; settable on create AND update â strongly recommended whenever a category is set, required for ISSUES_ELECTIONS_POLITICS; without it the platform silently scopes the campaign to the ad account's tax country)}. TIK: {objective_type: TRAFFIC|WEB_CONVERSIONS|LEAD_GENERATION|REACH|VIDEO_VIEWS|ENGAGEMENT|APP_PROMOTION|PRODUCT_SALES (WEB_CONVERSIONS needs pixel_id and pixel_event in ad_groups[].platform_settings), budget_optimize_switch: ON|OFF (CBO â when ON, budget is managed at campaign level and ad groups don't need their own budget)}. TIK Smart+ (campaign read shows platform_details.is_smart_plus): TikTok's API usually allows only name, budget_amount, budget_type and status to be updated; other changes are refused, make them in TikTok Ads Manager. CGPTA: {locations limited to US|CA|AU|NZ}. SCM: {objective_v2_type: AWARENESS_AND_ENGAGEMENT|SALES|TRAFFIC|APP_PROMOTION|LEADS, profile_id (public profile UUID â required for ad creation; set once here, inherited by all ads)}. SCM budget min 20 in account currency, in regular amounts (micro-conversion is automatic). bidding_config: {target_roas (float, 3.5=350%), target_cpa (float), target_spend_cpc_bid_ceiling (float, account currency: AW MAXIMIZE_CLICKS max CPC)}. AW update also accepts ad_schedule (list of {day_of_week: MONDAY..SUNDAY, bid_modifier: a multiplier in 0.1-10 where 0.7 = -30% and 1.3 = +30%, same convention as bid_adjustments}; sets a day-of-week bid modifier without restricting which days serve. Add start_hour/end_hour to an entry to instead restrict serving to those hours on that day (dayparting)) and bid_adjustments. On update: campaign_type/objective cannot be changed after creation; AW product_filter rebuilds the listing groups of EVERY ad/asset group in the campaign (to change one group only, set product_filter in that ad_groups[] entry's platform_settings instead).
remove_ad_group_idsstring- Ad group IDs to remove (update only)
remove_ad_idsstring- Ad IDs to remove (update only)
start_datestring- YYYY-MM-DD or YYYY-MM-DDThh:mm:ss. FA update: does not move an existing ad set â set it in ad_groups[].platform_settings.
statusstring- On create: always forced to PAUSED. On update: ENABLED, PAUSED, or REMOVED.
targetingstring- Campaign-level targeting. On update: omitted fields kept, sent ones replaced, [] clears one (SCM: no [] clear). Existing ad groups get it on FA (all) and SCM (those in ad_groups[]); TIK/LIA: use ad_groups[].targeting.
url_tagsstring- Campaign-level URL tracking parameters (AW: Final URL suffix)
supermetricsmcp_manage_dashboardsUpload, retrieve, edit, or view version history for live Supermetrics Studio dashboards that re-query data on each view.WriteManage Dashboards
Upload, retrieve, edit, or view version history for live Supermetrics Studio dashboards that re-query data on each view.
Inputs
actionstringrequired- 'upload' to publish a new dashboard or replace an existing one, 'edit' to apply targeted patches to dashboard codeone of
uploadedit allowed_accountsstring- Per-data-source allow-list of the account IDs the dashboard queries ('upload'), e.g. {"AW": ["123"]}. This is a security boundary: viewers query on the owner's credentials, so list only the accounts the board uses.
allowed_toolsstring- MCP tool names the dashboard is allowed to call ('upload'). Must be an explicit list, e.g. ["data_query"]; never null or empty.
change_summarystring- Optional one-line summary of this version, shown in the dashboard changelog
codestring- Complete dashboard code (HTML or JSX) â a self-contained page that visualizes the data. Required for 'upload'. Query data with the host-injected smQuery(tool, params); see supermetrics_guide(mode='dashboard_bigquery') for BigQuery. Wrap each section in paired region markers so 'edit' can patch it.
dashboard_idstring- UUID of the dashboard. Required for 'edit'. For 'upload', omit to publish a new dashboard or provide to replace an existing one.
descriptionstring- Optional short description of the dashboard itself (what it shows, its purpose), stored on the board and shown in the board list ('upload').
patchesstring- Anchor-based patches for 'edit'. Types: region replace, find/replace, after/insert, before/insert. Applied sequentially and atomically.
titlestring- Display name of the dashboard ('upload'). If omitted or blank, a title is derived from the code (its <title>, else the first heading).
supermetricsmcp_manage_user_and_teamManage your Supermetrics account: get user profile, license, and team member info, invite new members, get a login link for a data source, or assign users to a subscription.WriteManage User And Team
Manage your Supermetrics account: get user profile, license, and team member info, invite new members, get a login link for a data source, or assign users to a subscription.
Inputs
actionstringrequired- invite_member: invite a new user to the team; add_user_to_subscription: assign team users to a subscription; set_prioritised_accounts: replace a data source's prioritised (pinned) account setone of
invite_memberadd_user_to_subscriptionset_prioritised_accounts account_idsstring- The COMPLETE desired prioritised set for set_prioritised_accounts: omitted accounts are unpinned, [] clears all. Each change uses ~1 of ~10 monthly changes (resets the 1st, UTC). Call get_user_and_team first to see current pins and remaining quota.
ds_idstring- Data source code (e.g. AW, FA); required for set_prioritised_accounts
emailstring- Invitee email; required for invite_member
license_idstring- Subscription/license ID; required for add_user_to_subscription. From get_user_and_team
rolestring- Invitee role (OWNER, ADMIN, EDITOR, FINANCE or VIEWER); required for invite_member
user_idsstring- Team member user IDs to assign (or a comma-separated string); required for add_user_to_subscription. From get_user_and_team
supermetricsmcp_marketing_utilitiesFree marketing utilities: no Supermetrics subscription or connected data source needed.WriteMarketing Utilities
Free marketing utilities: no Supermetrics subscription or connected data source needed. **Actions:** - utm_build: tag each of the urls with source/medium/campaign/term/content, correctly encoded (macros like {campaignid} kept), validated against your team's conventions. - utm_parse: audit the urls against your team's conventions and GA4 channel rules. For one campaign used in several places (an event's booth QR code, printed cards, follow-up email, social post), build one link per placement with a different utm_content, so reports show which placement worked. utm_build and utm_parse return suggested_url (the link with casing/separator fixed), fixed (what changed in it) and unresolved (issues that need a decision, e.g. an unapproved source). Show suggested_url and fixed in the same reply as the audit, then ask only about unresolved; never wait to be asked for a fixed link. - pagespeed_check: PageSpeed Insights for up to 10 urls (run in parallel; 30s-2min): scores, lab and field vitals, top fixes; detail="full" for every finding. Returns within ~45s; if checks are still running it returns status="running" and a job_id: poll with {"action":"pagespeed_check","job_id":...} about every 30s. Results are cached for 24h (cached=true, checked_at); pass refresh=true only after the page has changed. - link_check: follow up to 50 urls through redirects; do UTM and click-id params (gclid, fbclid...) reach the landing page, and at which hop are they lost. Also broken pages, loops, tagging mistakes. - web_vitals_trend: ~6 months of real-user LCP/INP/CLS/FCP/TTFB for up to 50 sites (bare domain) or pages. - safety_check: up to 50 urls, domains or email addresses (e.g. a cold-pitch sender) and every host they redirect through: Web Risk malware/phishing flags, invalid or expiring certificates, domains expiring soon or registered in the last 30 days, and senders with no working website. - link_preview: how up to 50 urls render when shared on LinkedIn, Facebook, X and Slack; flags missing or small og:image, missing description, truncated titles. - email_dns: SPF, DKIM, DMARC, MX and BIMI for up to 50 domains (urls may be domains, emails or URLs). - char_limits: exact lengths of up to 200 texts against Google Ads, Meta, LinkedIn and X limits (counted as each platform counts). Use it whenever copy must fit a limit; do not count characters yourself. Google asset fields (path, long_headline, business_name, callout, sitelink_text, sitelink_description) are checked only when named in field. **Results:** every result has input (as sent), url, status (ok|warning|critical|unknown) and findings[] of {code, severity, message, suggestion?, ...extras}; unknown results carry error {code, message} (e.g. quota_exhausted, daily_limit, no_data, url_throttled). Each batch has a summary of counts. **UTM conventions** come from business context (tags='utm-conventions'). A JSON object is enforced; every key is optional; lists are exact, case-sensitive matches: {"approved_sources":[...],"approved_mediums":[...],"blocklist":{"utm_campaign":["test"]}, "regex":{"utm_campaign":"\d{4}"},"max_length":{"utm_campaign":60},"casing":"lowercase"|"as_is", "separator":"-"|"_","require_all_core":true} When utm_source is a known ad network (google, bing, facebook/instagram, tiktok, linkedin, snapchat, pinterest), utm_build returns network {medium, campaign_macro, id_macro, click_id} and both actions flag macros written in another network's syntax, which that network would leave unfilled. utm results report conventions_source: team (JSON enforced), team_free_text (returned as team_conventions for you to apply) or defaults (lowercase, hyphens).
Inputs
actionstringrequired- utm_build (tag urls), utm_parse (audit urls), pagespeed_check, link_check (tracking survives redirects), web_vitals_trend (real-user history), safety_check (malware/phishing, certificate and domain expiry), link_preview (how a shared link renders), email_dns (SPF/DKIM/DMARC), char_limits (ad/social copy lengths)one of
utm_buildutm_parsepagespeed_checklink_checkweb_vitals_trendsafety_checklink_previewemail_dnschar_limits campaignstring- utm_campaign value (utm_build)
contentstring- utm_content value (utm_build)
detailstring- pagespeed_check: summary (scores, vitals, top 3 fixes) or full (all findings)
dkim_selectorstring- email_dns: your DKIM selector if it is custom (common ones are probed automatically)
fieldstring- char_limits: check only this field (e.g. rsa_headline for Google headlines, primary_text for Meta, post for X). Default: every field of each platform
job_idstring- pagespeed_check: poll a check that was still running (returned when it took over 45s)
mediumstring- utm_medium value (utm_build)
platformsstring- char_limits: platforms to check against (default: all)
refreshstring- pagespeed_check: ignore cached results (kept 24h) and re-test; use only after the page changed
sourcestring- utm_source value (utm_build)
strategystring- pagespeed_check device: MOBILE or DESKTOP
termstring- utm_term value (utm_build)
textsstring- char_limits: the headlines/captions to measure
urlsstring- URLs to act on (every action except char_limits). Max 10 for pagespeed_check, 50 otherwise. web_vitals_trend: a bare domain = whole site. email_dns: domains, e.g. example.com
No tools match.
Workflows
Discover available data sources
Use supermetricsmcp_data_source_discovery to list all marketing and advertising data sources connected to the user’s Supermetrics account.
const sources = await actions.executeTool({ connector: 'supermetricsmcp', identifier: 'user_123', toolName: 'supermetricsmcp_data_source_discovery', toolInput: {},});console.log(sources);sources = actions.execute_tool( connection_name="supermetricsmcp", identifier="user_123", tool_name="supermetricsmcp_data_source_discovery", tool_input={},)print(sources)Query marketing analytics data
Use supermetricsmcp_data_query to pull structured metrics and dimensions from a connected data source. Call field_discovery first to find valid field names, and get_today to resolve relative date references.
const report = await actions.executeTool({ connector: 'supermetricsmcp', identifier: 'user_123', toolName: 'supermetricsmcp_data_query', toolInput: { ds_id: 'GA4', fields: ['Sessions', 'Conversions', 'Date'], date_range_type: 'last_30_days', max_rows: 100, },});console.log(report);report = actions.execute_tool( connection_name="supermetricsmcp", identifier="user_123", tool_name="supermetricsmcp_data_query", tool_input={ "ds_id": "GA4", "fields": ["Sessions", "Conversions", "Date"], "date_range_type": "last_30_days", "max_rows": 100, },)print(report)Create an ad campaign
Use supermetricsmcp_campaign_create to create a new advertising campaign on a supported platform. Call accounts_discovery first to find the correct account ID.
const campaign = await actions.executeTool({ connector: 'supermetricsmcp', identifier: 'user_123', toolName: 'supermetricsmcp_campaign_create', toolInput: { ds_id: 'FA', account_id: 'act_123456789', name: 'Q1 Brand Awareness', status: 'PAUSED', budget_amount: '50.00', budget_type: 'DAILY', },});console.log(campaign);campaign = actions.execute_tool( connection_name="supermetricsmcp", identifier="user_123", tool_name="supermetricsmcp_campaign_create", tool_input={ "ds_id": "FA", "account_id": "act_123456789", "name": "Q1 Brand Awareness", "status": "PAUSED", "budget_amount": "50.00", "budget_type": "DAILY", },)print(campaign)