{"title":"Supermetrics MCP Changelog","format":"markdown","content":"# Changelog\n\nAll notable changes to the Supermetrics MCP server will be documented in this file.\n\n<!-- next-release -->\n\n## [1.9.38] - 2026-08-06\n\n### Fixed\n\n- Queries that stall after completing no longer leave results loading indefinitely. `get_async_query_results` now returns a clear error for such a query so it can be re-run, instead of reporting it as still running forever.\n\n## [1.9.35] - 2026-08-05\n\n### Fixed\n\n- `contact_supermetrics`: support tickets are now created reliably and return a working ticket link. Previously a ticket could report success with an invalid link ending in `/None` while not actually reaching Supermetrics support; the tool now confirms the ticket was created and returns a clear error if it was not.\n- `contact_supermetrics`: support tickets submitted without a category are no longer rejected. A general category is now applied automatically when none is provided, so the ticket is accepted instead of failing.\n\n## [1.9.33] - 2026-08-03\n\n### Added\n\n- Campaign management: Google Ads Performance Max asset groups accept their own `product_filter` in an `ad_groups[]` entry's `platform_settings`, applied to that asset group alone. Previously the only option was the campaign-level filter, which rebuilds the listing groups of every asset group in the campaign — unusable for changing one group in a campaign that has many.\n- Campaign management: the accepted Performance Max image aspect ratios (1.91:1, 1:1, 4:5) are now stated in the `assets` description, so an image can be corrected before it is submitted rather than after Google rejects it.\n\n### Fixed\n\n- Campaign management: `status` on an ad group / asset group entry is now honoured when creating Google Ads Performance Max asset groups. Previously the requested status was discarded and the asset group was always created ENABLED, so an asset group added to a live campaign began serving immediately despite an explicit `PAUSED` request.\n- Campaign management: new Performance Max asset groups in a Merchant Center-linked campaign now get an all-products listing group when no `product_filter` is given. Previously they were created with no listing group at all, so they served no products while reporting success.\n- Campaign management: warnings returned by the campaign API now appear in the response's top-level `notes`. Previously they were nested one level deeper and easy to miss.\n\n### Changed\n\n- Campaign management: `status` is now a documented field on ad group / asset group entries. New Performance Max asset groups default to PAUSED unless a status is given, and the guidance now requires explicit user approval before an ad group or asset group is enabled — previously the approval step covered campaigns only.\n- Campaign management: the campaign-level `product_filter` description now states that it rebuilds the listing groups of every ad group in the campaign, and the guidance on omitting it for all products now matches actual behaviour.\n\n## [1.9.32] - 2026-07-29\n\n### Fixed\n\n- `field_discovery` no longer returns an empty field list when `filter` terms are separated by spaces instead of commas (e.g. `impressions clicks spend`). Previously such a filter matched nothing, which could leave an assistant unable to name any fields for a query. Multi-word terms that match a field name (e.g. `impression share`) still match as a phrase.\n\n### Changed\n\n- The `field_discovery` `filter` parameter description now states that terms are comma-separated.\n\n## [1.9.31] - 2026-07-28\n\n### Added\n\n- Campaign management: Google Ads (AW) now supports radius/proximity targeting. Use `location_details` with `type=custom_location`, `latitude`, `longitude`, `radius`, and `distance_unit` (mile or kilometer) to target people within a radius of a point. Works for local service campaigns.\n- Campaign management: Google Business Profile locations can now be linked to Google Ads campaigns via `extensions.locations` with a `place_id`. Requires the GBP to be linked to the Google Ads account first.\n\n## [1.9.29] - 2026-07-27\n\n### Added\n\n- Campaign management: Google Ads (AW) now supports city-level geo targeting. Pass numeric geo target constant IDs in `locations` (e.g. `[\"DE\", \"1001062\"]`) or use `location_details` with city/region entries. Use targeting search with `type=city` or `type=location` to discover geo IDs by name.\n- Campaign management: Google Ads `geo_target_type` setting — set `PRESENCE` in platform_settings to target people physically present in the location (default: `PRESENCE_OR_INTEREST`).\n\n## [1.9.25] - 2026-07-21\n\n### Added\n\n- `field_discovery` now marks non-aggregatable metrics (e.g. Reach, Frequency, Users, and rate/ratio metrics like CTR, CPC, ROAS) with `is_non_aggregatable: true`, and adds a note clarifying that these metrics can still be broken down by dimensions or dates within a single query, but their returned values must not be summed or averaged across rows afterward. Previously these metrics were returned with no such indication, so summing them (for example, adding daily Reach into a weekly total) silently produced inflated, double-counted figures.\n\n## [1.9.23] - 2026-07-21\n\n### Fixed\n\n- Publishing a dashboard to Supermetrics Studio now warns when the uploaded board contains no live `smQuery` calls. Previously a static, data-baked-in board could be published silently and would never refresh — leaving viewers to reconnect every source by hand. The upload response now flags this so the board can be rebuilt with live queries and re-uploaded.\n- Campaign management: end dates no longer shift +1 day for ad accounts in timezones east of UTC. Previously, setting `end_date=2026-09-30` could display as October 1st in Meta Ads Manager.\n\n### Added\n\n- Campaign management: `start_date` and `end_date` now accept an optional time-of-day in ISO 8601 format (e.g. `2026-09-30T18:00:00`), in addition to the existing date-only format (`YYYY-MM-DD`). This lets you schedule campaigns to start or stop at a specific hour.\n\n## [1.9.22] - 2026-07-21\n\n### Added\n\n- Campaign management: saved audiences are now included when listing audiences (`type=saved`). Previously only custom/remarketing/lookalike audiences were returned.\n- Campaign management: geo-location search is now available via targeting search. Use `type=city`, `type=region`, `type=country`, `type=zip`, `type=geo_market`, or `type=location` (all types) to find Meta geo keys for sub-country targeting in `location_details`.\n\n## [1.9.21] - 2026-07-20\n\n### Changed\n\n- Campaign management: `destination_type` documentation now covers all objectives (WEBSITE, ON_AD, APP, etc.), not just messaging ads. Helps avoid trial-and-error when setting conversion location for non-messaging campaigns.\n- Campaign management: `platforms` field now lists valid Meta publisher platforms (facebook, instagram, audience_network, messenger). `placements` field documents cross-platform shortcuts (feed, reels).\n- Campaign management: creative asset documentation reordered to highlight `asset_url` (public URL) as the recommended path for uploading new media. Both `campaign_create` and `campaign_update` tool descriptions now mention available creative options.\n\n## [1.9.20] - 2026-07-17\n\n### Changed\n\n- Dashboards built for Supermetrics Studio now come with more flexible dates and period comparison. Date pickers offer a wider set of ranges — including last 90 days and other multi-day/week/month/year windows — plus fully custom start/end dates and derived ranges like this/last quarter and year to date. When you want to compare performance, dashboards can now apply a single comparison — previous period or the same period last year — consistently across every widget, including time-series charts, not just individual scorecards.\n\n## [1.9.19] - 2026-07-17\n\n### Removed\n\n- Reverted the \"Query stalled\" detection for async queries (introduced in 1.9.16 and refined in 1.9.18). `get_async_query_results` no longer marks a query as stalled based on it running without scheduled work — that signal proved unreliable for some data sources (for example Adobe Analytics), which can run in that state for several minutes and still complete, so healthy queries were being failed. Such queries now continue polling until they finish, as they did before 1.9.16.\n\n## [1.9.18] - 2026-07-16\n\n### Fixed\n\n- `get_async_query_results` no longer fails a query with a \"Query stalled\" error just because it is briefly reported as running without any work scheduled yet — a normal state in the first seconds after a query is submitted. A query is now only reported as stalled if it stays in that state for a sustained period across polls, so newly submitted queries that simply need a moment to start are allowed to finish. This removes spurious stall errors (and empty dashboard tiles) that could appear for queries that would otherwise complete normally.\n\n## [1.9.17] - 2026-07-16\n\n### Added\n\n- After a dashboard is published to Supermetrics Studio, the assistant now invites you to share feedback on your overall Studio experience (once per session, non-blocking, and skippable). If you share feedback, it is delivered to the Supermetrics team.\n\n## [1.9.16] - 2026-07-14\n\n### Fixed\n\n- `get_async_query_results` no longer polls forever on a query that has stalled. When a query is reported as running but has no work actually scheduled or running — a state it can never recover from on its own — it is now returned as a failed query instead of an endless \"keep polling\" response. The stalled query's cached schedule is cleared, so re-running it (or reloading the page) submits a fresh query that completes normally. Previously such a query could stall indefinitely and repeated attempts kept reusing the same stuck query for up to ~53 minutes.\n\n## [1.9.15] - 2026-07-09\n\n### Fixed\n\n- Query results are no longer automatically compressed. Compression now only applies when you explicitly pass `compress=true`. Previously, results were sometimes returned in a compact text format even when raw data was requested, which broke integrations that expected standard JSON arrays.\n\n## [1.9.13] - 2026-07-09\n\n### Fixed\n\n- `manage_dashboards` `upload`/`edit`: when Supermetrics Studio rejects a dashboard for invalid code (for example, the same top-level function declared twice, or truncated/unparseable code), the error now shows Studio's full, actionable message — which problem it is, where it is, and how to fix it — instead of a generic, truncated \"HTTP 422\" response. This lets the dashboard be corrected and re-uploaded without guesswork.\n\n## [1.9.11] - 2026-07-09\n\n### Fixed\n\n- Large query results (over 10,000 rows) no longer crash the server. Results above 10K rows are automatically compressed and skip the result cache to stay within memory limits. Previously, very large results (e.g. a full product catalog) could cause a server crash with no actionable error message.\n\n## [1.9.10] - 2026-07-09\n\n### Fixed\n\n- `manage_dashboards` `upload`: uploading no longer fails when the `title` is missing or blank. A title is now derived from the dashboard code — its `<title>`, otherwise the first heading, otherwise \"Untitled dashboard\" — so the board is created instead of the whole upload being rejected. Set `title` explicitly to control the display name.\n\n## [1.9.9] - 2026-07-08\n\n### Fixed\n\n- `manage_dashboards` `upload`: uploading now rejects a `code` value that is a file path (e.g. `/home/claude/board.html`) or other non-dashboard text before the board is created, with an actionable error telling you to pass the file's contents instead. Previously such a value was stored verbatim, so the shared Studio link showed the literal path text instead of a rendered dashboard.\n\n## [1.9.7] - 2026-07-07\n\n### Added\n\n- `manage_dashboards` `upload`: you can now set an optional `description` (a short subtitle/summary of the dashboard, up to 2000 chars) when uploading. It is stored on the board and shown in the board list, and is returned by `get`. Previously only the title, code, and access settings could be set.\n\n### Fixed\n\n- Campaign approval errors now show the actual rejection reason from the ad platform instead of a generic \"HTTP 502\" error\n\n## [1.9.6] - 2026-07-07\n\n### Fixed\n\n- `manage_dashboards`: after building a dashboard, the assistant now always offers to publish it to Supermetrics Studio for a shareable, always-fresh link, instead of just showing the in-chat preview and stopping. The upload still happens only after you confirm — this just makes sure you're always told the option exists.\n\n## [1.9.5] - 2026-07-07\n\n### Added\n\n- `manage_dashboards` `upload`: the response now includes a `code_warnings` list when an uploaded board looks likely to render empty — specifically when it queries Supermetrics data but never maps columns via `result.data.requested_field_ids`. The warning names the fix so the board can be corrected and re-uploaded before sharing, instead of the data-wiring problem only surfacing when someone opens the board. Advisory and non-blocking: the upload still succeeds.\n\n### Fixed\n\n- `manage_dashboards`: the in-chat preview shown before uploading is now a static page with your real data baked in, so it actually renders here instead of coming up empty. Previously the preview reused the live Studio version (which fetches data through a Studio-only helper), so it showed no data and came with a confusing \"won't pull data outside Studio\" note. The version uploaded to Supermetrics Studio is still the live, always-fresh one.\n\n## [1.9.4] - 2026-07-07\n\n### Fixed\n\n- `manage_dashboards` `upload`: a dashboard is now shown to you in the chat first and you're asked before it's published to Supermetrics Studio as a shareable link, instead of being uploaded and shared unprompted. If you explicitly ask to publish or share it to Studio (e.g. \"put this in Studio and give me a share link\"), it still uploads right away.\n\n## [1.9.3] - 2026-07-06\n\n### Fixed\n\n- `manage_dashboards` `upload`: dashboards you generate now render their data on the first view instead of frequently coming up empty until fixed in the Studio editor. The `code` guidance now documents the exact shape `smQuery` returns (data is a 2D array at `result.data.data` — row 0 headers, rows 1+ data — with columns mapped by `result.data.requested_field_ids`, not the display labels), so the generated board code parses query results correctly out of the box.\n\n## [1.9.2] - 2026-07-06\n\n### Changed\n\n- `manage_dashboards` `edit`: region-replace patches (`from`/`to`) now replace the whole region **including** the anchor marker lines, matching the Supermetrics Studio edit AI. Write the complete new block in `replace` and reproduce the `from`/`to` marker lines inside it (the server forces this behavior, so a restated anchor no longer duplicates a declaration). Requires the paired dazl-backend change that adds `include_anchors` support.\n\n## [1.8.4] - 2026-07-03\n\n### Changed\n\n- `manage_dashboards` `upload` and `get` responses now omit the board review-status fields unless the board has been blocked by content review — in which case the status and reason are included so you can surface a remediation notice. Previously these fields were always returned, even for the benign default state.\n\n## [1.8.3] - 2026-07-03\n\n### Changed\n\n- `manage_dashboards` `upload` no longer echoes back the dashboard code you just submitted — the response now returns only the dashboard metadata (id, title, view URL). Use the `get` action to retrieve the stored code when you need it.\n\n## [1.8.1] - 2026-07-03\n\n### Added\n\n- TikTok Ads (TIK) REACH campaigns now support frequency cap settings. Set `frequency` (max impressions per user) and `frequency_schedule` (period in days) in ad group `platform_settings`. Previously these fields were silently dropped, blocking all REACH campaign creation.\n- TikTok Ads (TIK) ad groups now support additional `optimization_goal` values (`ENGAGED_VIEW`, `CONVERSION`, `INSTALL`) and the `CPV` `billing_event`.\n- TikTok Ads (TIK) campaigns now support Campaign Budget Optimization (CBO). Set `budget_optimize_switch: \"ON\"` in campaign `platform_settings` to manage budget at the campaign level — ad groups no longer require their own budget when CBO is enabled.\n- TikTok Ads (TIK) placement type is now auto-detected: when `placements` are specified (in targeting or platform_settings), `placement_type` is automatically set to `PLACEMENT_TYPE_NORMAL`. This fixes VIDEO_VIEWS campaigns that previously failed with \"This ad objective only supports manual placement.\"\n\n### Fixed\n\n- TikTok Ads (TIK) campaign read-back now includes `budget_type` (DAILY/LIFETIME) on ad groups when the data is available from TikTok's API.\n\n## [1.8.0] - 2026-07-02\n\n### Fixed\n\n- Meta Ads (FA) ad set creation no longer fails with \"you need to enable or disable the Advantage audience feature.\" Advantage+ Audience now defaults to disabled when not specified — your targeting is applied as-is. Set `advantage_audience` to `true` in targeting to let Meta expand beyond your specified audience. Both the flat key and Meta's nested `targeting_automation.advantage_audience` format are accepted.\n\n## [1.7.0] - 2026-07-02\n\n### Added\n\n- New `manage_dashboards` tool: upload dashboards to Supermetrics Studio. Studio dashboards have live data and refresh without spending tokens (unlike dashboards in Claude) and can be shared with anyone.\n\n## [1.6.2] - 2026-07-02\n\n### Added\n\n- PMax asset group UPDATE: you can now update an existing Performance Max asset group by providing its ID. Headlines, descriptions, images, and other assets are replaced in-place instead of requiring a new asset group. Set `ad_groups[].id` to the existing asset group ID.\n- Warnings for silent transformations: the `notes` array now reports when portrait images (4:5 ratio) may not appear on all PMax surfaces, and confirms when search themes are applied as optimization signals.\n\n### Changed\n\n- The `campaign_update` tool description now documents the extensions payload schema (callouts, sitelinks, structured snippets) including field names and required formats.\n- Sitelinks now accept both `text` and `link_text` as the display text field name, for compatibility with Google Ads API conventions.\n- Structured snippet `header` field description now lists all valid English enum values.\n\n## [1.6.1] - 2026-06-30\n\n### Changed\n\n- The campaign change-approval page now shows the full proposed change — campaign fields, plus a card per ad group and ad with each changed field (headline, primary text, CTA, final URL, page, image) shown as old → new on edits — instead of collapsed lines like \"Ad groups updated\".\n\n## [1.6.0] - 2026-06-29\n\n### Added\n\n- Campaign changes that go live — enabling a campaign, or editing a campaign that is already live — can now require your explicit approval. When approval is required, the response includes a secure approval link; opening it shows a summary of the change and applies it only after you click Approve. Validation errors are surfaced first, so you only ever approve a change that is ready to apply. If applying the approved change fails, the page shows the specific reason; if it applies with caveats (for example, an ad pending platform review), those notes are shown too. The link works in any client.\n\n## [1.5.18] - 2026-06-28\n\n### Fixed\n\n- **Connecting an unconnected data source now gives clear next steps** — when `accounts_discovery` finds no connected account for a data source, the response already includes a connection link. Previously the appended guidance also told the assistant to call `accounts_discovery` again (the tool that just reported the problem), which could cause it to loop instead of helping the user connect. The guidance now tells the assistant to share the connection link with the user so they can connect the data source, then retry.\n\n## [1.5.17] - 2026-06-28\n\n### Fixed\n\n- **`accounts_discovery` no longer shows a connection link for connectors that don't use an account list** — some data sources (e.g. free-text connectors) have no account list to browse, and some require no connection at all. Calling `accounts_discovery` for those used to return a misleading \"connect this data source\" login link. It now returns clear guidance computed from the connector: whether an account is supplied as a free-text identifier in `ds_accounts`, and a connection link only when the data source actually needs to be connected. For no-auth data sources, the connection is set up automatically so accounts can be listed without a login step.\n\n## [1.5.16] - 2026-06-26\n\n### Fixed\n\n- **Runtime connector errors are no longer mislabelled as an invalid data source** — when a query against a valid connector failed at runtime with a message like \"Data Source Error: Not Found\" (seen with Google BigQuery), `get_async_query_results` would wrongly append \"Did you mean …?\" suggestions and tell you to pick a different data source. The original connector error is now returned unchanged, without the misleading data-source suggestion.\n\n## [1.5.15] - 2026-06-25\n\n### Fixed\n\n- **Meta Ads (FA) campaign tools now accept ad-account IDs with or without the `act_` prefix** — campaign tools (list, create, update, status, assets, forecast, audiences, conversions, …) no longer fail with \"Connection expired\" when an `account_id` is supplied without the `act_` prefix. Both `1234567890` and `act_1234567890` now work.\n\n## [1.5.14] - 2026-06-25\n\n### Added\n\n- **Add or remove keywords on an ad group (Google Ads & Microsoft Advertising)** — `campaign_create` and `campaign_update` now accept `add_keywords` and `remove_keywords` on an ad group. `add_keywords` appends positive keywords (skipping duplicates) without touching the ad group's other targeting; `remove_keywords` deletes matching keywords. Use these for incremental keyword edits — `targeting.keywords` still replaces the whole set.\n\n### Fixed\n\n- **`campaign_update` no longer silently does nothing when keywords are passed at the top level** — previously, calling `campaign_update` with keywords (e.g. under an invented `action` argument) instead of nesting them under an ad group returned success while changing nothing. Such keywords are now routed to the intended ad group when it's unambiguous (an `ad_group_id` or a single ad group is given), and otherwise return a clear error explaining the correct shape.\n\n## [1.5.13] - 2026-06-25\n\n### Added\n\n- **Sub-country location targeting for Meta Ads campaigns** — `campaign_create`, `campaign_update`, and forecast/reach-estimate tools now accept `location_details` in `targeting` for city, region, ZIP, geo-market, and custom-location targeting. Use `targeting_search` to look up Meta geo keys.\n- **Facebook Ads carousel, video, and boosted-post creatives** — `campaign_create` and `campaign_update` now expose `carousel_cards`, `object_story_id`, and `asset_type` on ad creatives, making it possible to create carousel ads (2–10 cards), boost existing Page/Instagram posts by ID, and explicitly mark uploaded media as video.\n\n## [1.5.11] - 2026-06-24\n\n### Fixed\n\n- **`campaign_update` tool guidance** — tool and parameter descriptions now explain that `campaign_update` is also used to create new ad groups/ads inside an existing campaign, and that operations are inferred from the presence/absence of `id` fields (there is no `update_type` parameter).\n\n## [1.5.10] - 2026-06-18\n\n### Added\n\n- `user_info` now reports license warnings (such as an expired credit card) in the license details on every call.\n- When your account has a license warning like an expired credit card, the warning — including a link to update your card — is now surfaced as a note once per session, on the first tool you use.\n\n## [1.5.9] - 2026-06-16\n\n### Added\n\n- **AI-generated logos in campaign creatives** — `campaign_create` and `campaign_update` now accept `logo_prompt` on ad creatives, generating the logo from a text prompt. Combined with `asset_prompt`, visuals can be supplied end-to-end without opening the media picker.\n\n### Changed\n\n- **Clearer error when uploading local files** — passing a local file path or unsupported URL scheme to image upload or the image proxy now returns a specific message explaining the issue, instead of the generic \"Only HTTPS URLs are supported\".\n\n## [1.5.8] - 2026-06-15\n\n### Changed\n\n- **Leaner tool responses** — presentation fields (`title`, `subtitle`, `source_url`) are now included only for clients that render them as cards (Microsoft Copilot). All other clients receive smaller responses without these fields, reducing token usage.\n- **Null `error` omitted** — tool responses no longer include the `error` field when it is null; it appears only on actual failures.\n- **`get_async_query_results`** — the redundant `message` field is dropped from polling responses (`polling_instruction` already explains how to poll), and the tool description now clarifies that result rows are in `data.data` (the inner `data` field), not directly in the top-level `data`.\n- **Currency recommendation** — when a query returns monetary values without a currency dimension, the recommendation is now more concise and names the specific currency field IDs available for that data source so you know exactly what to add.\n\n### Added\n\n- **Query result field IDs** — `get_async_query_results` now includes a `requested_field_ids` list in completed responses: the field IDs you requested, in the same order as the data columns (`requested_field_ids[i]` labels the i-th value in each row). This makes it easier to map result columns back to the fields that were requested.\n- **Field remapping visibility** — when a requested field ID resolves to a different canonical ID (e.g. an alias, different casing, or underscores), `get_async_query_results` also returns a parallel `canonical_field_ids` list (same order) so clients can reconcile any stored field IDs (for example in a saved dashboard) against the canonical values. A note additionally highlights substantive remaps (aliases/synonyms); cosmetic differences that only involve casing or underscores are left out of the note since they resolve automatically. When nothing was remapped, `canonical_field_ids` is omitted.\n\n## [1.5.7] - 2026-06-14\n\n### Changed\n\n- **AI image generation branding** — image generation in the media picker is now clearly branded as SuperAI, by Supermetrics. The generate tab, prompt placeholder, generated-image badges, tooltips, and the ready toast all carry SuperAI/Supermetrics attribution, and a note reminds users to review generated images before publishing.\n- **Campaign tool descriptions** — trimmed verbose prose from campaign tool descriptions and parameter docstrings to reduce token usage while preserving all enum values, format hints, and critical constraints. Added `ad_groups`/`ad_group`/`adgroups` aliases to `resource_type` normalization so LLMs that hallucinate these values are silently redirected to `campaigns` instead of erroring.\n\n## [1.5.6] - 2026-06-11\n\n### Changed\n\n- **Contact Supermetrics** — the `contact_supermetrics` tool now directs users to buy standard plans online at https://supermetrics.com/pricing and reserves sales enquiries for special needs (many data sources, accounts, users, or other custom requirements). Reduces unnecessary sales tickets for purchases that can be self-served.\n\n## [1.5.5] - 2026-06-10\n\n### Changed\n\n- **Campaign and resource listing** — the `campaign_and_resource_get` tool now documents that list results (campaigns, assets, pages, posts) default to 50 and explains how to use `max_rows` to retrieve more. Previously the 50-result default was undocumented, so large accounts could appear capped at 50 entities.\n\n## [1.5.0] - 2026-06-08\n\n### Added\n\n- **Google Drive integration** — import images and videos from Google Drive directly into the media picker. Select individual files, multiple files, or entire folders. Supports multiple Google accounts with automatic session caching.\n\n## [1.4.14] - 2026-06-02\n\n### Added\n\n- **Assign users to subscription** — new `add_user_to_subscription` action in the `manage_user_and_team` tool lets you assign team members to a license. Requires `license_id` and `user_ids` parameters.\n\n## [1.4.13] - 2026-06-02\n\n### Added\n\n- **Product feed filtering for Google Ads Shopping and PMax campaigns** — use `product_filter` in `platform_settings` to target specific products from your Merchant Center feed by custom labels, product IDs, brand, condition, or product type. Supports both include and exclude modes.\n\n## [1.4.7] - 2026-05-30\n\n### Fixed\n\n- **Data query date handling** — queries no longer fail with \"Missing value for query start date\" when the AI places date parameters (`start_date`, `end_date`, `date_range_type`) inside the `settings` object or uses alternate key names (`date_from`, `date_to`).\n\n## [1.4.5] - 2026-05-27\n\n### Removed\n\n- **Logout action** — removed the `logout` action from the `manage_user_and_team` tool.\n\n## [1.4.4] - 2026-05-27\n\n### Added\n\n- **AI image generation in asset picker** — the AI Generate tab is now available for all clients, including Claude.\n\n## [1.4.3] - 2026-05-24\n\n### Added\n\n- **Structured output for all tools**\n\n## [1.4.2] - 2026-05-24\n\n### Added\n\n- **Structured output for query tools** — `data_query` and `get_async_query_results` now declare their response shape via MCP `outputSchema`, so clients know the expected fields (schedule_id, status, data rows, error) at discovery time. Responses include typed `structuredContent` alongside the text content for backwards compatibility.\n\n## [1.4.0] - 2026-05-22\n\n### Added\n\n- **Team management tool** — new `manage_user_and_team` tool replaces `user_info` with expanded capabilities. Use `action` parameter to:\n  - `get_info` — get your profile, license, team members, pending invitations, and other teams you belong to\n  - `invite_member` — invite someone to your team by email and role\n  - `login_data_source` — get a login link for a data source\n- The previous `user_info` tool continues to work for existing sessions.\n\n## [1.3.4] - 2026-05-20\n\n### Changed\n\n- **Data source configuration** — large option lists for countries, timezones, currencies, and languages are now replaced with concise descriptions of accepted values, significantly reducing response size. When the same option list appears across multiple report types, it is included once and referenced by pointer.\n\n## [1.2.21] - 2026-05-19\n\n### Added\n\n- **Campaign forecast tool** — estimate ad performance at different spend levels before creating a campaign. Supports Google Ads (keyword forecasts) and Facebook Ads (audience reach estimates).\n\n## [1.2.20] - 2026-05-18\n\n### Added\n\n- ChatGPT Ads integration: you can now create and update ChatGPT Ads campaigns, and fetch data about them.\n\n## [1.2.18] - 2026-05-18\n\n### Added\n\n- Data source discovery now supports a `filter` parameter for narrowing results. If exactly one data source matches, its full configuration is returned automatically.\n\n## [1.2.11] - 2026-05-09\n\n### Added\n\n- Support for Meta's Advantage+ Audience with expand_audience parameter.\n\n## [1.2.10] - 2026-05-08\n\n### Added\n\n- Query results now include a note when dimensions were requested after metrics, since the API always returns dimensions first regardless of request order.\n\n## [1.2.1] - 2026-05-07\n\n### Added\n\n- Asset picker UI for creating ad creatives.\n\n## [1.1.23] - 2026-05-05\n\n### Changed\n- Account discovery no longer returns ds_user or ds_user_display_name.\n\n## [1.1.21] - 2026-05-05\n\n### Added\n- Account discovery now returns `tags` when present, and the `filter` parameter matches against tag values.\n\n### Changed\n- Account discovery only returns group name and currency if they are not empty.\n\n## [1.1.11] - 2026-04-28\n\n### Added\n- **Posts resource type** — list Facebook Page posts that can be promoted as ads via `resource_type='posts'`. Optionally pass `page_id` to pick a specific page, or let it auto-select the first available one.\n\n## [1.1.8] - 2026-04-26\n\n### Added\n\n- New \"Create Campaign\" prompt to guide you through setting up an ad campaign step by step. Optionally specify the ad platform upfront, or let it ask you.\n\n### Fixed\n\n- Pre-defined starter prompts were returning garbled JSON instead of plain text due to a serialization bug. They now work as intended.\n\n## [1.0.6] - 2026-04-17\n\n### Added\n\n- Targeting search now supports LinkedIn Ads — search for interests, industries, job titles, employers, schools, fields of study, skills, degrees, seniorities, and job functions. Six targeting types (interest, industry, school, field_of_study, employer, job_title) now work across both Meta Ads and LinkedIn Ads.\n\n## [1.0.1] - 2026-04-16\n\n### Fixed\n\n- Health check for Facebook Ads was returning ad set IDs instead of campaign IDs due to a legacy field naming mismatch (`campaign_id` = ad set in FA). This caused subsequent campaign detail requests to fail with \"nonexisting field (objective)\".\n- Campaign tools now show a login link when a data source account is not connected, instead of returning a raw \"NO_TOKEN_FOR_ACCOUNT\" error. This matches the behavior already present in data query and account discovery tools.\n\n## [1.0.0] - 2026-04-15\n\n### Changed\n\n- Supermetrics MCP server is out of beta. Starting from this release, the project follows semantic versioning: major versions for breaking changes, minor versions for new features, and patch versions for bug fixes.\n\n## [0.18.5] - 2026-04-14\n\n### Added\n\n- Campaign management now supports LinkedIn Ads (LIA) — create, update, and manage LinkedIn campaigns alongside Google Ads, Meta Ads, Microsoft Ads, and TikTok Ads.\n\n## [0.18.3] - 2026-04-14\n\n### Changed\n\n- Bearer tokens must now use a recognised prefix (`api_` or `otok_`). Tokens with other formats are rejected with 401 instead of being passed to the downstream API.\n\n## [0.18.2] - 2026-04-14\n\n### Fixed\n\n- In some cases, we were caching data query errors, which caused them to be returned repeatedly, even if the underlying issue was fixed. We no longer cache errors.\n\n## [0.18.1] - 2026-04-14\n\n### Added\n\n- `campaign_create` and `campaign_update` tools now accept an optional `url_tags` parameter for campaign-level URL tracking parameters.\n\n### Changed\n\n- Campaign management tools beta is now opened to everyone: `campaign_create`, `campaign_update`, and `campaign_and_resource_get`.\n- Queries without date parameters no longer default to `last_30_days`; the API handles defaults server-side\n\n### Fixed\n\n- Date range types not in the hardcoded whitelist (e.g. `last_31_days`) are now passed through to the API correctly instead of being silently replaced with `last_30_days`\n\n## [0.17.5] - 2026-04-13\n\n### Fixed\n\n- Field discovery filter now matches against report type names (e.g., filtering by 'Posts' returns fields belonging to that report type)\n\n### Fixed\n\n- `get_async_query_results` now correctly signals expired OAuth tokens so clients can refresh automatically, instead of returning a generic error.\n\n## [0.17.4] - 2026-04-11\n\n### Added\n\n- Amazon Ads data source\n\n## [0.15.13] - 2026-04-02\n\n### Added\n\n- New campaign management tools in beta: `campaign_create`, `campaign_update`, and `campaign_and_resource_get`. Create, update, and manage advertising campaigns on Google Ads, Meta Ads, Microsoft Ads, and TikTok Ads directly from conversations. Includes ad group/ad set and ad creation, targeting, extensions, image and video creatives (including AI-generated images), and a full change history with undo support. This functionality will be available for everyone soon; to get access to the beta, please contact Supermetrics support or your customer success contact.\n\n## [0.15.8] - 2026-03-31\n\n### Added\n\n- Data Blending and Semrush Analytics are now available as data sources.\n\n### Changed\n\n- The list of available data sources now reflects your team's actual access, including invite-only and early access sources you've been granted. The list also includes any private connectors your team owns, distinguished by the `is_private` property. Previously, some sources your team had access to may not have appeared.\n- Data source list responses are now leaner: the `status` field is only included for non-released sources (e.g. \"Early access\", \"Invite only\"). The values are now in proper case instead of all caps. The same for categories: `Paid media` instead of `PAID_MEDIA`.\n\n## [0.15.7] - 2026-03-31\n\n### Added\n\n- New `sales` contact type in `contact_supermetrics` tool for submitting sales enquiries and demo requests via HubSpot.\n\n## [0.15.6] - 2026-03-30\n\n### Changed\n\n- The `filter` parameter in `field_discovery` and `accounts_discovery` now supports multiple comma-separated values (e.g. `\"click,impression\"`), returning items matching any of them.\n\n## [0.15.1] - 2026-03-23\n\n### Added\n\n- New `contact_supermetrics` tool: send product feedback or create support tickets directly from conversations.\n\n## [0.14.6] - 2026-03-18\n\n### Added\n\n- New optional `max_rows` parameter for data queries. Defaults to 1000 if not specified. Increase to retrieve larger datasets (up to 10,000 recommended).\n\n## [0.14.5] - 2026-03-18\n\n### Added\n\n- New `filter` parameter for field discovery: case-insensitive text search across field ID, name, description, group, and type. Replaces the `field_type` parameter, which still works for backward compatibility.\n\n### Changed\n\n- Field discovery now returns report types as compact integer indices with a `report_type_legend` array, reducing response size for data sources with many report types.\n\n## [0.14.3] - 2026-03-16\n\n### Added\n\n- Public `/datasources` endpoint listing available connectors.\n\n## [0.14.2] - 2026-03-16\n\n### Changed\n\n- All responses now include `trace_id` in metadata for easier request correlation in support scenarios.\n\n### Fixed\n\n- Tool responses now include the correct server version in metadata.\n- Supermetrics OAuth errors are now always raised as 401 to ensure MCP clients trigger token refresh.\n\n## [0.13.8] - 2026-03-11\n\n### Fixed\n\n- Data queries no longer fail when `report_type` is included for data sources that don't support report type selection.\n- Error messages for unknown fields, incompatible field combinations, and invalid report types now include actionable guidance (e.g. \"call field_discovery\") instead of returning raw API errors.\n\n## [0.13.3] - 2026-03-06\n\n### Added\n\n- Data queries now return a login link when authentication is missing, so users can connect directly from the error message.\n\n### Changed\n\n- Auto-connection creation for no-auth data sources is now dynamic — any connector with `authentication_status: NOT_REQUIRED` is supported, not just a hardcoded list.\n\n## [0.13.1] - 2026-03-06\n\n### Added\n\n- Support for 118 new data sources.\n\n\n## [0.13.0] - 2026-03-05\n\n### Changed\n\n- Tool response notes are now returned as a `notes` array instead of a single `note` string.\n\n## [0.12.9] - 2026-03-05\n\n### Fixed\n\n- Direct tool endpoint (`POST /mcp/{tool_name}`) now correctly handles the settings parameter.\n- Data queries now rescue misplaced settings (e.g. `country`, `list_type`) from root-level parameters into the `settings` object automatically.\n\n## [0.12.4] - 2026-03-04\n\n### Added\n\n- Trace ID in error responses — when a tool call fails, the response now includes a trace ID that users can provide to Supermetrics support for faster troubleshooting.\n\n## [0.12.0] - 2026-03-03\n\n### Added\n\n- Config mode for data source discovery — passing a `ds_id` now returns full data source configuration (capabilities, report types, settings).\n- Authentication status checks with login link generation for unconnected data sources.\n- 10 new data sources: Facebook Pages, Apple Search Ads, Adobe Analytics, Callrail, Google Trends, Instagram Public Data, Snapchat, Taboola, YouTube.\n- Report types included in field discovery output for multi-report-type data sources.\n- Contextual account hints in data query error responses.\n- For some data sources, report type property to field discovery to indicate which fields are compatible.\n\n### Changed\n\n- `ds_accounts` and `fields` are now optional in data queries, supporting data sources that don't require them.\n- Updated tool descriptions to guide agents through a config-driven workflow.\n\n## [0.11.3] - 2026-03-02\n\n### Added\n\n- Filter parameter for account discovery to narrow results by keyword.\n\n## [0.11.2] - 2026-03-02\n\n### Changed\n\n- Improved subtitle for data query tool responses.\n\n## [0.11.1] - 2026-02-26\n\n### Added\n\n- Purchase note on license error responses to guide users toward resolving access issues.\n\n### Changed\n\n- Improved tool titles across all tools for clearer agent integration.\n\n## [0.11.0] - 2026-02-25\n\n### Added\n\n- authentication_status property to data source discovery, with values AUTHENTICATED, NOT_AUTHENTICATED and NOT_REQUIRED.\n\n## [0.10.0] - 2026-02-18\n\n### Added\n\n- Prompts.\n- Title, subtitle and source_url properties to all tool responses.\n"}