MCP App Store
by KeenEthics
Business & Operations
Ad Superpowers icon

Ad Superpowers

by Ad Superpowers B.V.

Overview

Ad Superpowers is the control plane for supervised AI ad operations. It connects Claude to the advertising accounts a team already runs, so a question that normally means opening eight dashboards can be asked once. Supervision is the design, not a setting. Reads are the default: of 51 tools, 33 are read-only and 17 can write. Every tool declares readOnlyHint, destructiveHint and openWorldHint, so the client can prompt before anything changes state. New ads are created paused. Writes are scoped to the connected account, throttled per account to protect account standing, and capped by per-plan quotas. Actions land in an audit log the organisation can read and export. Client profiles are versioned and restorable, and nothing is deleted through MCP. It covers Meta, Google Ads, Google Analytics 4, Google Search Console, Google Tag Manager, Google Merchant Center, LinkedIn and TikTok. Alongside the tools it ships 120 skills and 29 workflows carrying the benchmarks and decision frameworks that make an answer useful rather than merely accurate: what counts as creative fatigue on TikTok versus Meta, which conversion number to trust when two platforms disagree, what a healthy cost per lead looks like on LinkedIn. Teams can write their own skills and workflows and save them to the organisation, so house method becomes something the assistant applies instead of something people have to remember. Agencies get client profiles as first-class context: budgets, channel goals, linked ad accounts and standing attention points per client, so an answer is framed by the account it concerns. This is ad management, not ad serving. It reports on and adjusts campaigns the user already owns, with credentials granted per platform and revocable at any time. It does not buy media, place inventory or deliver advertising. Built in Europe, for teams managing multiple clients, channels and people.

Tools

clients

ChatGPT
Read your organization's client profiles (agency clients, not users). Actions: - action="list" (default): compact rows for the WHOLE portfolio in one call — id, slug, name, status, budget_total, currency, channel platforms and linked-accounts count. No attention_points in list rows (use action="get" for the full profile). - action="get": the full profile (budgets, channels with goals, linked ad accounts, attention_points). Identify the client with either: client — its slug or UUID, or account_id — an ad-account id; answers "which client owns ad account X?" via the profile's linked_accounts. Profiles are business context written by your organization (goals, budgets, attention points) to make reports client-aware. Edit them with clients_update or in the dashboard.

clients_update

ChatGPT
Create or update a client profile for your organization. WRITE tool (non-destructive: no delete via MCP, every edit is versioned and restorable; the response echoes a changed map plus the new version). Never store end-customer personal data (no names, emails, phone numbers) - only business context like goals, budgets, and attention points. action="create": requires name. Optional status ("draft"|"active", default "active") and profile fields (budget_total, currency ISO-4217, overall_goal, channels, linked_accounts, attention_points). Idempotent on name: an existing non-archived same-name client is returned with already_existed=true (pass allow_duplicate_name=true to force a second). action="update": requires client (slug or UUID). Merge is non-destructive - omitted params are untouched; clear a top-level field via clear_fields=[...] (never pass null); channels/linked_accounts patch-merge by key, remove via remove_channels / remove_linked_accounts. Example: clients_update(action="create", name="Acme B.V.", currency="EUR", overall_goal="Grow EU leads") Full field reference - per-platform channel targets/metrics and units, manager assignment, legacy target fields, and the complete merge semantics: read MCP resource docs://tools/clients_update

ga4_list_properties

ChatGPT
List Google Analytics 4 properties that you have connected. Returns only properties you've connected in Ad Superpowers. Connect properties via the dashboard to make them available here.

ga4_run_report

ChatGPT
Run a Google Analytics 4 report with any metrics x dimensions combination. Runs against the Google Analytics Data API v1 (https://developers.google.com/analytics/devguides/reporting/data/v1). READ tool. Breaks GA4 data down by country, device, page, source/medium, channel, date, event, and more. Required: property_id (numeric), metrics (list). Dates: pass EITHER date_range (natural language, e.g. "last 7 days", "last 30 days", "this month", "yesterday") OR the start_date/end_date pair (YYYY-MM-DD) - not both. dimensions optional. limit: rows per call (omitted = the GA4 API's own default of 10,000). When more rows exist the response has partial=true and next_offset — pass that as offset to page. Common metrics: sessions, totalUsers, activeUsers, newUsers, screenPageViews, bounceRate, engagementRate, keyEvents (conversions), totalRevenue. Common dimensions: country, deviceCategory, pagePath, landingPage, source, medium, sessionDefaultChannelGroup, date, eventName. Example - traffic by channel: ga4_run_report(property_id, metrics=["sessions", "keyEvents"], dimensions=["sessionDefaultChannelGroup"], date_range="last 30 days") Full field reference - the full metric and dimension catalogues plus 14 ready-to-use recipes: read MCP resource docs://tools/ga4_run_report

google_ads_list_accounts

ChatGPT
List your connected Google Ads accounts. Returns a list of Google Ads accounts you've connected via the dashboard. Common user questions this tool can answer: - Which Google Ads accounts do I have access to? - How do I find my customer ID?

google_ads_mutate

ChatGPT
Create, update, or remove Google Ads entities in one atomic googleAds:mutate call. Runs against the Google Ads API googleAds:mutate endpoint (https://developers.google.com/google-ads/api/docs/mutating/overview). WRITE tool (destructiveHint). Changes take effect immediately unless validate_only=True (dry run). Supports temporary resource names (negative IDs like -1, -2) so newly created entities can be referenced within the same request. When to use: any Google Ads change - create/pause campaigns, edit budgets, keywords and negative keywords, bid strategies, ad extensions, bid modifiers, Shopping/PMax, conversion actions, portfolio bidding. For READS (performance, finding IDs, Merchant Center detection) use google_ads_run_gaql. Required: customer_id: 10 digits, no dashes. operations: list of dicts, each with exactly one *Operation key (e.g. campaignOperation, adGroupCriterionOperation, assetOperation). manager_id auto-detects for sub-accounts. Money is micros: 50000000 = $50.00. An ergonomic DSL form ({entity, action, data, resource_name}) is also accepted and may be mixed with native shapes. Example - pause a campaign: operations=[{"campaignOperation": {"updateMask": "status", "update": { "resourceName": "customers/{CID}/campaigns/{ID}", "status": "PAUSED"}}}] Full field reference - 25 ready-to-use recipes (full campaign builds, keywords, extensions, Shopping/PMax, conversions, portfolio bidding), the 18 DSL entities, geo/language constants, and asset limits: read MCP resource docs://tools/google_ads_mutate

google_ads_run_gaql

ChatGPT
Execute a GAQL (Google Ads Query Language) read query. Runs against the Google Ads API query service (https://developers.google.com/google-ads/api/docs/query/overview). READ tool for all Google Ads reporting and ID discovery: performance (impressions, clicks, CTR, CPC, cost, conversions), keywords, search terms, assets, audiences, Merchant Center detection, PMax/Shopping data. To CHANGE anything use google_ads_mutate instead. Required: customer_id: 10 digits, no dashes. query: the GAQL query string. manager_id auto-detects for sub-accounts. page_token: pass back a prior response's next_page_token to fetch the next page (partial:true means more pages remain). DURING date ranges: TODAY, YESTERDAY, LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, THIS_MONTH, LAST_MONTH, THIS_WEEK_SUN_TODAY, THIS_WEEK_MON_TODAY, LAST_WEEK_SUN_SAT, LAST_WEEK_MON_SUN. LAST_90_DAYS is NOT valid - use BETWEEN with explicit dates. cost_micros is millionths (5000000 = $5.00). Example: SELECT campaign.name, metrics.impressions, metrics.clicks, metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_30_DAYS ORDER BY metrics.cost_micros DESC Full field reference - 20+ ready-to-use GAQL recipes (campaigns, keywords, search terms, assets, Shopping, PMax, conversions, portfolio bidding): read MCP resource docs://tools/google_ads_run_gaql

google_ads_run_keyword_planner

ChatGPT
Generate keyword ideas using Google Ads Keyword Planner. Common user questions this tool can answer: - What keywords should I target? - What is the search volume for my keywords? - What CPC can I expect for these keywords? - What keywords are popular in the Netherlands? - What are Dutch search volumes for my keywords?

gsc_list_sites

ChatGPT
List Google Search Console properties (websites) and optionally their sitemaps. Returns only properties you've connected in Ad Superpowers. Connect properties via the dashboard to make them available here. Use include_sitemaps=True to also fetch sitemap status for each site (URL, type, last submitted, warnings, errors).

gsc_manage_url

ChatGPT
Manage URLs and sitemaps in Google Search Console. Three actions for URL-specific operations: - inspect: Check a page's indexing status, mobile usability, and rich results - submit_sitemap: Tell Google about a new or updated sitemap - delete_sitemap: Remove a sitemap from GSC tracking

gsc_search_analytics

ChatGPT
Query organic search performance data from Google Search Console. The power tool for all organic search data. Returns clicks, impressions, CTR, and average position for your website in Google Search results. Date range: provide ONE of: (a) start_date+end_date, (b) date_range ("last 7 days"), or (c) days (lookback from today). If none given, defaults to last 28 days.

gtm_audit

ChatGPT
Audit the live published GTM container version for issues and risks. The live version is the default and costs one API call. Pass workspace_path to audit a draft workspace instead; the literal "default" resolves the Default Workspace. Set compare_workspace=True on a live audit to also show whether that default draft is behind live. Live-version paths are read-only: call gtm_list_entities with a workspace source before using gtm_manage so you have writable paths and current fingerprints. Rate limit: GTM permits ~30 API calls per minute per user, and one tool call can fan out to several API calls. Call GTM tools sequentially, never in parallel, and pace batch or multi-container work; on a 429, wait ~60 seconds before retrying. A single audit can use several calls (more with compare_workspace=True); for many containers, space audits out or narrow them with checks=[...] / summary_only=True.

gtm_list_containers

ChatGPT
List Google Tag Manager containers connected to your Ad Superpowers account. Returns only containers you have connected in the dashboard. Each container includes its GTM-XXXXXXX public ID, type (web/server/android/ios/amp), and the account it belongs to. Connect containers at the Ad Superpowers dashboard to make them available. Returns container path, account info, public GTM ID, and container type. Rate limit: GTM permits ~30 API calls per minute per user, and one tool call can fan out to several API calls. Call GTM tools sequentially, never in parallel, and pace batch or multi-container work; on a 429, wait ~60 seconds before retrying.

gtm_list_entities

ChatGPT
List GTM tags, triggers, variables, and built-in variables. Runs against the Google Tag Manager API v2 (https://developers.google.com/tag-platform/tag-manager/api/v2). Use this tool to obtain the `tag_path and fingerprint required by gtm_manage for update_tag and delete_tag. source="workspace" lists an explicit workspace or auto-resolves the container's default workspace. source="live" shows the published truth, but its version paths are not writable: use paths from a workspace for writes. Results combine requested types in tag, trigger, variable, built-in-variable order, with numeric ids ascending inside each type. page is 1-based; page_size is clamped to 200 for slim results and 25 when include_config=True. total covers all matching entities and has_more` indicates whether a later page exists. Rate limit: GTM permits ~30 API calls per minute per user, and one tool call can fan out to several API calls. Call GTM tools sequentially, never in parallel, and pace batch or multi-container work; on a 429, wait ~60 seconds before retrying.

gtm_manage

ChatGPT
Manage GTM workspaces, entities, versions, imports, synchronization, and publishing. All writes validate access against container_path; workspace_path auto-resolves to the default workspace when omitted. Actions (required params): - create_workspace (name) · create_version (name) · publish (version_path — WARNING: goes live immediately) · sync_workspace - create_tag / create_trigger / create_variable ({tag,trigger,variable}_data) - update_tag / update_trigger / update_variable ({...}_path + {...}_data) - delete_tag / delete_trigger / delete_variable ({...}_path) - enable_built_in_variables (built_in_types) - import_container (import_data: GTM export JSON, max 20 entities; variables → triggers → tags with trigger-ID remapping). merge overlays imported fields on same-name entities and skips identical results; overwrite replaces same-name configurations and always writes. Both modes create absent entities. Updates: include a fingerprint to PUT directly; omit it and the entity is fetched, expected_name checked when supplied, your partial payload merged over it, and PUT with the fetched fingerprint (GTM 412 = race backstop). Get writable paths + fingerprints from gtm_list_entities. dry_run=True: client-side structural checks only, never writes (the GTM API has no server-side validateOnly; compiler feedback only via create_version). Rate limit: GTM permits ~30 API calls per minute per user, and one tool call can fan out to several API calls. Call GTM tools sequentially, never in parallel, and pace batch or multi-container work; on a 429, wait ~60 seconds before retrying. Full field reference, per-action requirements and the GTM tag-type code table: read the docs://tools/gtm_manage resource.

linkedin_get_analytics

ChatGPT
Get analytics data for LinkedIn Ads at account or campaign level. Returns account-level aggregates or performance for one campaign.

linkedin_get_creatives_with_images

ChatGPT
Get LinkedIn ad creatives with performance data and optional images. Fetches creatives with their text content and performance metrics. Set include_images=True to also embed images/video thumbnails as base64. Supports all LinkedIn ad types: image ads, video ads, spotlight ads, text ads. Common user questions this tool can answer: - Which LinkedIn creative is performing best? - What ad copy am I running on LinkedIn?

linkedin_list_ad_accounts

ChatGPT
List your connected LinkedIn ad accounts, or get details of a single account. When account_id is provided, returns detailed info for that specific account. Otherwise, returns a list of all connected ad accounts.

linkedin_manage

ChatGPT
Create, update, pause or delete LinkedIn campaign groups, campaigns and creatives. WRITE tool (destructiveHint). Full field reference, per-entity grid and ready-to-use recipes: read MCP resource docs://tools/linkedin_manage Creates always land DRAFT unless confirm_launch=True. Moving an existing entity to a serving status (action="status", target_status="ACTIVE") needs confirm_launch=True too, and issues NO request to LinkedIn without it -- {"activated": false, "reason": "confirm_launch_required", ...}. Moving to PAUSED, ARCHIVED or DRAFT never needs confirm_launch. Required: ad_account_id, object_type (campaign_group | campaign | creative), action (create | update | status | delete), payload (the request body; must be {} for action="status" -- target_status carries the value instead). entity_id: required for update/status/delete -- numeric id, or a full URN for creative. target_status: required for action="status", refused on every other action. One of LinkedIn's 8 documented statuses, case-sensitive, not normalised. Two fields you may NOT put in payload -- the tool owns them and refuses (never silently strips) either name, on every entity: status / intendedStatus -> use action="status" with target_status politicalIntent -> use the political_intent parameter Every campaign create, and every campaign update touching targetingCriteria, requires political_intent -- exactly "POLITICAL" or "NOT_POLITICAL", validated at runtime ("NOT_DECLARED" is refused). Valid only on object_type="campaign" -- refused on campaign_group/creative, and on action="status"/"delete". Carries the exact consent text to show the advertiser. Example - create a paused campaign: object_type="campaign", action="create", political_intent="NOT_POLITICAL", payload={"name": "Q3 launch", "campaignGroup": "urn:li:sponsoredCampaignGroup:1", "costType": "CPC", "locale": {"country": "NL", "language": "nl"}}

linkedin_query

ChatGPT
Query LinkedIn Ads entities (campaigns, campaign_groups, or creatives). Runs against the LinkedIn Marketing API (https://learn.microsoft.com/en-us/linkedin/marketing/). This flexible tool replaces individual get_* functions for all entity types. Use it to fetch lists of entities or single entity details. Common user questions this tool can answer: - What campaigns are active? - What is the status of my campaign groups?

merchant_get_report

ChatGPT
Run a validated Merchant Center report preset. Presets: - product_performance: clicks/impressions/CTR/conversions per product, last 30 days (conversions cover FREE traffic only). - disapproval_impact: disapproved products ranked by click potential (the Merchant API has no cost metric — join Google Ads for spend). - clicks_without_conversions: >10 clicks, 0 conversions, last 30 days (conversions cover FREE traffic only). There is no raw-query mode; these three presets are the entire report surface of this slice. Returns: {"success": true, "preset": str, "description": str, "view": str | null, "rows": [{...}], "next_page_token": str | null} `rows are flat objects. The Merchant API wraps each row in its view name; that wrapper is stripped and the view is reported once in view. Field names stay exactly as Google spells them — camelCase, e.g. offerId — even though the preset query selects snake_case; view` tells you which reference page defines them (AD-368).

merchant_list_accounts

ChatGPT
List Google Merchant Center accounts you can access. Returns top-level accounts plus their DIRECT sub-accounts (one level — sub-accounts that are themselves advanced accounts are not traversed). `partial: true means at least one parent's sub-account listing failed; retry those via failed_parents`. Returns: {"success": true, "accounts": [{"accountId", "accountName", "advanced", "is_subaccount", "parent_account_id", ...}], "partial": bool, "failed_parents": [{"accountId", "error", "retry_hint"}]}

merchant_query

ChatGPT
Read Merchant Center entities polymorphically. Runs against the Google Merchant API (https://developers.google.com/merchant/api). - "What's this account's status?" → entity_type="account" - "What's wrong with this account?" → entity_type="issues" - "Which products are listed?" → entity_type="products" - "Why is this product disapproved?" → entity_type="product_statuses" - "Show one product" → entity_type="product" + entity_id (resource fragment "{channel}~{contentLanguage}~{feedLabel}~{offerId}") - "Which feeds exist?" → entity_type="datasources" `account_id must be an active, selected Merchant connection. An unselected or unknown id fails before provider I/O; call merchant_list_accounts to refresh accessible accounts. Paginate via page_token from next_page_token`.

meta_ad_execute

ChatGPT
Execute the plan the customer confirmed by giving this token back. Pass the customer's own words. A refusal ("nee", "laat maar") is handled here too and creates nothing.

meta_ad_plan

ChatGPT
Build one confirmable plan for a single paused Meta video ad. Writes nothing. Returns the overview the customer must read plus the token that confirms it. Pass the message through to the customer unchanged: it is the text they are confirming. Call meta_ad_execute with the token the customer gives back.

meta_create

ChatGPT
Create a Meta Ads campaign or ad set (the shell that holds ads). WRITE tool; entities are created PAUSED by default. Account integrity protection: the server mirrors Meta's documented rate model (error-613 circuit breaker, usage-header backoff) - no artificial hourly cap; building a campaign structure in sequence needs no self-pacing. If a write is throttled, the error says so - back off and retry. Lifecycle: meta_create campaign -> meta_create adset -> meta_create_ad. Required: account_id ('act_...'), entity_type ("campaign"|"adset"), name. - campaign: requires objective (OUTCOME_AWARENESS | OUTCOME_ENGAGEMENT | OUTCOME_LEADS | OUTCOME_SALES | OUTCOME_TRAFFIC | OUTCOME_APP_PROMOTION) PLUS a budget: either daily_budget/lifetime_budget in CENTS (2000 = $20.00, min 100), which enables CBO (ad sets inherit it), or budget_mode="ABO" with NO campaign budget (each ad set sets its own). - adset: requires campaign_id, targeting (dict containing geo_locations), and optimization_goal (common: LINK_CLICKS, LANDING_PAGE_VIEWS, OFFSITE_CONVERSIONS, VALUE, LEAD_GENERATION, REACH, IMPRESSIONS, THRUPLAY, APP_INSTALLS). Ad-set budget ONLY under an ABO parent. EU/EEA ad sets need dsa_payor + dsa_beneficiary or Meta rejects them. Example: meta_create(account_id, "campaign", "Summer Sale", objective="OUTCOME_SALES", daily_budget=2000) Full field reference - every argument, bid_strategy / billing_event / destination_type enums, CBO/ABO rules, Advantage+ and dynamic-creative flags, and examples: read MCP resource docs://tools/meta_create

meta_create_ad

ChatGPT
Create a new Meta ad (image OR video OR carousel OR catalog) in an existing ad set. WRITE tool. Runs the full pipeline: media upload -> creative -> ad. Created PAUSED by default so the user reviews before it goes live. Account integrity protection: the server mirrors Meta's documented rate model (error-613 circuit breaker, usage-header backoff) - no artificial hourly cap; creating ads sequentially needs no self-pacing. Keep new ads PAUSED for human review before activation (unreviewed AI-generated creative going live is a documented Meta ban trigger). If a write is throttled, the error says so - back off and retry. When to use: build a brand-new ad. To vary an EXISTING ad use meta_duplicate; to create the campaign/ad set shell use meta_create; to fix a live ad in place use meta_update. Required: account_id ('act_...'), adset_id, headline, body, link_url. Provide EXACTLY ONE primary media: - image_url (public URL, uploaded server-side) or image_hash (already in Meta) - video_url or video_id (from meta_upload_video) - slides=[2-10 cards] for a carousel (no single image/video) - product_set_id for a media-less catalog/DPA ad (no other media; the ad set must bind promoted_object.product_set_id) cta_type default LEARN_MORE. status PAUSED (default) | ACTIVE. Example: meta_create_ad(account_id, adset_id, headline="...", body="...", link_url="https://example.com", image_url="https://...") Full field reference - per-placement multi-aspect-ratio (placement_assets), carousel and catalog detail, Instagram / dynamic-creative rules, all CTA + placement enums, every argument, and examples: read MCP resource docs://tools/meta_create_ad

meta_duplicate

ChatGPT
Duplicate a Meta ad with optional creative overrides (new headline, image, etc.). WRITE tool. Uses the Ad Copies API: creates a NEW ad from a source ad; fields you pass override, fields you omit are copied. The original is never changed. Created PAUSED by default. Account integrity protection: the server mirrors Meta's documented rate model (error-613 circuit breaker, usage-header backoff) - no artificial hourly cap; duplicating variants sequentially needs no self-pacing. If a write is throttled, the error says so - back off and retry. When to use: spin up A/B variants of a winning ad, or move an ad to another ad set (adset_id). To fix a typo/URL on a live ad WITHOUT losing its social proof, prefer meta_update (creative swap). To build a fresh ad, use meta_create_ad. Required: account_id ('act_...'), ad_id (source, e.g. '120210123456789'). Provide at least one override (headline, body, description, link_url, image_url, cta_type, url_tags, display_url) or adset_id. image_url is uploaded automatically. Note: ad_name does NOT set a custom name (Meta only auto-suffixes " - Copy"); rename afterwards with meta_update. Example: meta_duplicate(account_id, ad_id, headline="Summer Sale - 50% Off") Full field reference - every argument, known Meta breaking changes (deprecated standard enhancements / 191x100 crop), and examples: read MCP resource docs://tools/meta_duplicate

meta_get_creatives

ChatGPT
Get ad creative details, text content, and performance data. Unified creative tool that works at three scopes: - single: Get one creative's details (headline, body, CTA, optional image) - campaign: Get all creatives for a campaign with performance metrics - account: Get top-performing creatives across the entire account Always includes 'creative_text' with headline, body, description, CTA type, and link URL. Set include_images=True to embed images as base64 for visual analysis.

meta_get_insights

ChatGPT
Get performance insights for Meta Ads at any level. This unified tool provides insights for account, campaign, adset, or ad level. Use it to analyze performance metrics, conversions, and ROAS. Common user questions this tool can answer: - How many people am I reaching? - What is my cost per result? - Why is my frequency so high? - What is my ROAS?

meta_get_video_status

ChatGPT
Check processing status of a video uploaded to Meta via meta_upload_video. Meta processes uploaded videos asynchronously. A video must reach status=='ready' before it can be used in an ad creative. Typical processing time: 30-120 seconds, depending on duration, resolution, and Meta's queue depth. Longer videos (>60s) and 4K content take longer.

meta_list_ad_accounts

ChatGPT
List your connected Meta ad accounts. Returns a list of ad accounts you've connected via the dashboard, with their names, IDs, status, and currency. Use this first to discover your available ad accounts before querying specific ones.

meta_query

ChatGPT
Query Meta Ads entities, activity logs, or fetch the next page of a result. Runs against the Meta Marketing API (https://developers.facebook.com/docs/marketing-apis/). READ tool. Handles all entity types, change history, targeting search, and pagination in one place. When to use: list or inspect campaigns, ad sets, ads, creatives, audiences, images/videos, pixels, pages, IG accounts, targeting, or activities. For PERFORMANCE metrics (spend, CTR, ROAS) use meta_get_insights instead; for full creative detail on one ad use meta_get_creatives. Required: account_id ('act_...'), entity_type. Common entity_type values: account, campaigns, adsets, ads, creatives (needs parent_id=ad_id), customaudiences, savedaudiences, activities, adimages, advideos, adspixels, connected_instagram_accounts, promotepages, targetingsearch (needs query), ads_volume. (productcatalogs is scope-gated - use meta_catalog_query.) Filter with parent_id (by parent entity), effective_status, since/until (YYYY-MM-DD). limit default 50. To page, pass pagination_url from a prior response (all other params are then ignored). Example (ad sets of one campaign; IDs are numeric strings): meta_query(account_id, "adsets", parent_id="120210123456789") Full field reference - every entity_type with its fields and requirements, targeting validation/suggestions, all arguments and examples: read MCP resource docs://tools/meta_query

meta_update

ChatGPT
Update a Meta entity - campaigns, ad sets, ads, and in-place creative fixes. WRITE tool; changes take effect immediately. Account integrity protection: the server mirrors Meta's documented rate model (error-613 circuit breaker, usage-header backoff) - no artificial hourly cap; sequential edits need no self-pacing. Two real Meta caps: ad-set budget changes 4/hour per ad set, spend-cap changes 10/day per account. If a write is throttled, the error says so - back off and retry. Required: account_id ('act_...'), entity_type ("campaign"|"adset"|"ad"), entity_id. Three modes, by which fields you set: 1. Direct update: status, name, daily_budget/lifetime_budget (CENTS; 2000 = $20.00), end_time, targeting, etc. 2. Creative swap (entity_type="ad" plus any creative field: headline, primary_text, description, link_url, cta_type, image_hash, video_id, url_tags). Meta creatives are immutable, so this attaches a NEW creative; ad_id and social proof (comments/reactions/shares) are preserved. PREFERRED over meta_duplicate for fixing typos, URLs, or CTAs on live ads that already have engagement. 3. Learning-reset fields (targeting, optimization_goal, bid_strategy, bid_amount, or a budget change >20%) are REJECTED unless acknowledge_learning_reset=True. status: ACTIVE | PAUSED | ARCHIVED. Example - fix a live ad's URL (creative swap, keeps social proof): meta_update(account_id, "ad", "345678", link_url="https://correct-url") Full field reference - every argument, bid_strategy / optimization_goal enums, DSA fields, per-entity field matrix, response shape, and examples: read MCP resource docs://tools/meta_update

meta_upload_image

ChatGPT
Upload an image to a Meta ad account's media library. Returns an image_hash you can pass to meta_create_ad(image_hash=...). Supports two input paths — use whichever matches what you have. Path 1 — Local file (base64 bytes via `image_data`): Cowork (Claude Desktop) and Claude Code can read a local file from disk, base64-encode the raw bytes, and pass them as image_data. Max 4 MB raw (~5.4 MB base64). For larger images, use the URL path. Path 2 — Public URL (via `image_url`): Pass any publicly reachable HTTPS URL (Canva export, Google Drive direct link, Dropbox raw link, S3 presigned, Cloudinary, Notion public image). Meta downloads server-side — no size cost on the MCP transport. No explicit size cap beyond Meta's own (~30 MB per image). When to use which: - You asked Claude to "upload this image" and attached/referenced a local file → Path 1 (base64). Prefer this for one-off uploads. - You have a URL that works in an incognito browser → Path 2. - Image is >4 MB → host it somewhere, use Path 2. - Bulk flow (50+ images) → use the Ads Manager Media Library UI to drag-drop, then discover hashes via meta_query(account_id, "adimages"). See the meta-media-upload-guide skill for the decision tree.

meta_upload_video

ChatGPT
Upload a video to a Meta ad account's media library from a public URL. Meta fetches the video server-side from the URL you provide. The upload returns immediately with a video_id; Meta then processes the video asynchronously (typically 30-120 seconds depending on length and resolution).

meta_wire_pages

ChatGPT
Discover + wire the Facebook Page and Instagram account onto a client's Meta-linked ad accounts, so meta_create_ad resolves them automatically. For each Meta ad account linked to client, this finds the promotable Page and the connected Instagram account. When exactly one of each exists and the linked account doesn't already have it, that id is the auto-wire candidate. Accounts with 0 or >1 options are returned as page_choices / ig_choices for you to pick and persist yourself with clients_update. apply=False (default): preview only — returns, per account, the current + discovered Page/IG and what would be wired. Nothing is written. apply=True: persist the unambiguous, currently-missing ids onto the client's linked accounts (via the client service). Ambiguous / already-set accounts are left untouched and reported.

skill

ChatGPT
Unified tool for knowledge skills and analysis scripts (system + custom Pro+ skills). READ tool. Note: with the Ad Superpowers plugin installed, skills load locally and automatically - use this tool for custom user skills, cross-skill search, running analysis scripts, or live connection health. Actions (action=): - "list": browse skills (filters: phase, category, skill_type; paginated). - "get": fetch one skill's content (requires skill_id = id/uuid/slug; options section, sections_only, include_references). - "search": keyword search (requires query). - "run": execute a skill's Python script (Pro+; skill_id + script_name + input_data). - "connection_health": live per-platform connection status with reconnect links (no params). Use when platform tools seem missing or a connection looks broken. Parameter coupling: skill_id is ONLY valid with get/run; query ONLY with search. Passing them with the wrong action returns a clear error (no silent fallback to the full catalogue). Example: skill(action="get", skill_id="meta-bid-strategy-selector") Full field reference - every argument, pagination fields, and key system-skill names: read MCP resource docs://tools/skill

skill_update

ChatGPT
WRITE tool: create, update, publish or archive a custom skill. Requires confirm=true (the literal JSON boolean) on EVERY call: only set it after the end user explicitly confirmed this exact write. Requires a client-generated idempotency_key (new random string per new request; REUSE the same key when retrying after a dropped connection — the server deduplicates). Actions (action=): - "create": new skill (slug, name, description, category, platforms, content required; personal by default, for_organization=true for an org-owned skill — OWNER/ADMIN only). Skills always start as DRAFT. - "update": patch fields on an existing skill (skill_id = UUID or slug; requires expected_version from a previous read/write; only supplied fields change; slug itself is immutable). - "publish": make a draft/archived skill live (skill_id + expected_version). - "archive": hide a skill (skill_id + expected_version). The result reports id/slug/version/visibility/status, plus readable_via_read_tool and a note when the row is not (yet) visible via skill() — drafts are not served there.

tiktok_get_ads_with_creatives

ChatGPT
Get TikTok ads with creative text content and performance data. Returns ad text, CTA, landing page URL, and performance metrics. Set include_images=True to also embed creative images/video covers as base64. Common user questions this tool can answer: - What creative assets am I using? - Which ads are performing best? - What ad copy and CTAs am I running?

tiktok_get_advertiser_info

ChatGPT
Get TikTok advertiser account information. Returns account details including name, status, currency, and timezone. Use this first to verify your connection is working.

tiktok_get_asset_info

ChatGPT
Look up TikTok assets by ID, or LIST the advertiser's whole asset library. Two modes, and the response always says which one ran via "mode": mode="lookup" asset_ids given -> metadata for exactly those IDs mode="list" asset_ids OMITTED -> browse the library, newest first List mode is how you find an asset whose ID you do not have — the case a tiktok_upload that failed to report its ID leaves you in. It returns each record verbatim, file_name included, so you can match on the name you uploaded with.

tiktok_get_audiences

ChatGPT
Get TikTok audiences for targeting. This tool fetches custom audiences, lookalike audiences, or both. Use audiences for retargeting existing customers or finding similar users.

tiktok_get_report

ChatGPT
Get a TikTok Ads performance report at campaign, adgroup, or ad level. READ tool (single advertiser). Defaults to your primary connected advertiser; pass advertiser_id (discover via tiktok_list_advertisers) to target another. There is no advertiser_ids plural param. Dates: pass EITHER date_range (natural language, e.g. "last 7 days", "this month", "yesterday") OR start_date/end_date (YYYY-MM-DD) - not both. level: "campaign" (default) | "adgroup" | "ad". entity_ids filters by PARENT: for level="adgroup" pass campaign_ids; for level="ad" pass adgroup_ids; omit for level="campaign". metrics/dimensions optional (sensible defaults). page/page_size for paging. Example: tiktok_get_report(date_range="last 7 days", level="adgroup", entity_ids=["1800000000000001"]) Full field reference - the full metric list (traffic/cost/conversion/video/ engagement/commerce), dimensions, and example gallery: read MCP resource docs://tools/tiktok_get_report

tiktok_list_advertisers

ChatGPT
List ALL TikTok advertiser accounts you've connected. tiktok_get_advertiser_info returns only your default advertiser. Use this to discover every connected advertiser (id, name, status, currency, timezone), then pass advertiser_id to the other tiktok_* tools to target a specific one.

tiktok_manage

ChatGPT
Create, update or pause TikTok campaigns, ad groups and ads. WRITE tool (destructiveHint). Creates always land PAUSED unless confirm_launch=True, so nothing spends budget by accident. Verified live on both endpoint families, at all three levels. For a Smart+ ad the pause sits on the container: individual materials cannot be created paused. Required: advertiser_id: the TikTok advertiser this change belongs to. object_type: campaign | adgroup | ad. action: create | update | status. payload: the TikTok request body minus advertiser_id, which is supplied for you. Field reference and ready-to-use recipes: read MCP resource docs://tools/tiktok_manage Optional: campaign_family: which TikTok endpoint family this entity belongs to. "regular" (default) for classic campaigns, "smart_plus" for Upgraded Smart+ ones. Find out with tiktok_query(entity_type="campaigns") and read campaign_automation_type: "MANUAL" is regular, "UPGRADED_SMART_PLUS" is smart_plus. Smart+ campaigns show up in the regular listing too, so one query answers it. The bodies are NOT interchangeable -- a Smart+ ad group drops budget, budget_mode and pacing but requires targeting_spec, promotion_type and request_id. Sending the wrong shape is rejected, in both directions. See docs://tools/tiktok_manage. Example - create a paused traffic campaign: object_type="campaign", action="create", payload={"campaign_name": "Q3 launch", "objective_type": "TRAFFIC", "budget_mode": "BUDGET_MODE_DAY", "budget": 50} Writes require a TikTok re-consent whose grant carries the write scopes for this advertiser. A read-only grant is refused before any API call.

tiktok_query

ChatGPT
Query TikTok Ads entities (campaigns, adgroups, or ads). Runs against the TikTok Business API (https://business-api.tiktok.com/portal/docs). This flexible tool replaces individual get_* functions for all entity types. Use it to fetch lists of entities or single entity details. Common user questions this tool can answer: - What campaigns are running? - What ad groups do I have?

tiktok_upload

ChatGPT
Upload an image or video to a TikTok advertiser's ad asset library. WRITE tool. Returns the asset_id you pass to tiktok_manage when building an ad creative. An asset never delivers and never spends, so there is no paused-by-default gate here -- the pause lives on the ad. Required: advertiser_id: the TikTok advertiser whose library receives the asset. asset_type: image | video. file_name: a descriptive name, e.g. "spring sale 1080x1080". NOT cosmetic -- TikTok stores one asset per set of bytes and the newest upload's file_name renames it for everyone, so a generic name renames what the advertiser already had. There is no delete. Exactly one of: file_data: base64-encoded raw bytes. IMAGE ONLY, max 4 MB raw. file_url: a public HTTPS URL. Both types, and the ONLY route for video. TikTok downloads it server-side, so nothing large crosses the MCP transport. At TikTok, file_url becomes image_url or video_url depending on asset_type, so a TikTok error naming video_url refers to this parameter. After a VIDEO upload the response carries suggested_cover_image_ids: a SINGLE_VIDEO creative requires image_ids for its cover. Read the asset back with tiktok_get_asset_info. An empty first read means "not yet", never "not created" -- do NOT repeat the upload on that basis. Uploads need a grant carrying the Creative Management permissions; one with only Ads Management is refused before any API call. Field reference, both end-to-end recipes, the identity fields an ad create needs, how TikTok stores assets, and what is NOT measured about its limits: docs://tools/tiktok_upload

workflow

ChatGPT
Unified workflow tool for marketing analysis templates. Workflows are pre-built analysis templates that guide you through complex advertising tasks like campaign audits, performance analysis, and optimization. Actions list - List all activated workflows `` workflow(action="list") ` **info** - Get workflow details and required parameters ` workflow(action="info", workflow_name="workflow:campaign-audit") ` **run** - Execute a workflow with parameters (supports background execution) ` workflow(action="run", workflow_name="workflow:campaign-audit", parameters={"account_id": "123"}) ``

workflow_update

ChatGPT
WRITE tool: create, update or archive a personal or organization workflow. Requires confirm=true (the literal JSON boolean) on EVERY call: only set it after the end user explicitly confirmed this exact write. Requires a client-generated idempotency_key (new random string per new request; REUSE the same key when retrying after a dropped connection). Actions (action=): - "create": new workflow (slug, name, description, category, platforms, prompt_template required; personal by default, for_organization=true for an org-owned workflow — OWNER/ADMIN only). Workflows start PUBLISHED (org workflows cannot be drafts) and are activated for you, so the result is visible via workflow(). - "update": patch fields (workflow_id = UUID or slug; expected_version required — from a previous write result or the row_version field of workflow(action='info'); slug immutable; status not settable). - "archive": hide a workflow (workflow_id + expected_version; archiving a draft is not a legal transition and returns an error). There is deliberately NO publish action here: reviving an archived or draft workflow is dashboard/REST territory.

workspace_info

ChatGPT
Show the active workspace and the credential binding used for this request.

clients

Claude

clients_update

Claude

ga4_list_properties

Claude

ga4_run_report

Claude

google_ads_list_accounts

Claude

google_ads_mutate

Claude

google_ads_run_gaql

Claude

google_ads_run_keyword_planner

Claude

gsc_list_sites

Claude

gsc_manage_url

Claude

gsc_search_analytics

Claude

gtm_audit

Claude

gtm_list_containers

Claude

gtm_list_entities

Claude

gtm_manage

Claude

linkedin_get_analytics

Claude

linkedin_get_creatives_with_images

Claude

linkedin_list_ad_accounts

Claude

linkedin_manage

Claude

linkedin_query

Claude

merchant_get_report

Claude

merchant_list_accounts

Claude

merchant_query

Claude

meta_ad_execute

Claude

meta_ad_plan

Claude

meta_create

Claude

meta_create_ad

Claude

meta_duplicate

Claude

meta_get_creatives

Claude

meta_get_insights

Claude

meta_get_video_status

Claude

meta_list_ad_accounts

Claude

meta_query

Claude

meta_update

Claude

meta_upload_image

Claude

meta_upload_video

Claude

meta_wire_pages

Claude

skill

Claude

skill_update

Claude

tiktok_get_ads_with_creatives

Claude

tiktok_get_advertiser_info

Claude

tiktok_get_asset_info

Claude

tiktok_get_audiences

Claude

tiktok_get_report

Claude

tiktok_list_advertisers

Claude

tiktok_manage

Claude

tiktok_query

Claude

tiktok_upload

Claude

workflow

Claude

workflow_update

Claude

workspace_info

Claude

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

102

Tools

3

Prompts

ChatGPT, Claude

Platforms

Works with

ChatGPT
Claude

Data refreshed daily