← Back to AutoAdy

The AutoAdy MCP server

What it is

AutoAdy runs a live, remote Meta ads MCP server — the same engine behind the in-app agent, exposed over the open Model Context Protocol so any AI agent can manage Facebook and Instagram ad accounts. Claude, ChatGPT connectors in developer mode, IDE assistants, and custom agents all connect to one endpoint:

https://www.autoady.io/api/mcp

The tool catalog below is generated from the server’s own tool registry at build time — what you see here is exactly what your assistant sees. Calling the same tools from your own code instead? See the developer docs for the REST API, the OpenAPI spec, and the CLI.

Authentication

  • OAuth 2.1 — for clients that implement the MCP authorization flow (claude.ai does). Add the server URL, sign in to AutoAdy in the browser, approve access. No key handling. On claude.ai you can skip the form entirely: add AutoAdy to Claude opens the dialog pre-filled.
  • API key — for Claude Code, Claude Desktop, and everything else. Send Authorization: Bearer YOUR_KEY as a header; that is the only key-based path, so a client that cannot set headers should use OAuth instead. Create and revoke keys under Settings → API Keys.

Security model

  • Your Meta access tokens never leave AutoAdy’s servers — the assistant calls tools, and each call is resolved to the per-account token server-side.
  • Write tools need a paid plan (Solo, Growth or Agency) and are capped at 200 changes per hour per ad account, protecting accounts from runaway automation and Meta rate limits.
  • Destructive tools are annotated as such in the protocol, so well-behaved clients ask before acting — and kill recommendations render for review before anything is paused.
  • All requests are rate-limited, and every change is logged in AutoAdy and reversible from AutoAdy or Ads Manager.

Plan gating

  • Free — Read tools change nothing and work on the free plan, with these exceptions: diagnose_drop needs a Solo, Growth or Agency plan; run_gaql and run_graph_read are not available on the free plan; and a free key can call analyze_winning_ad 25 times a day, because it reaches a language model. Every other read is unmetered.
  • Solo, Growth or Agency — write tools (pause, budgets, duplication, launching ads), drop diagnosis and the creative workflow pipelines.
  • Growth and Agency — also include competitive-intelligence tools like competitor analysis and competitor-inspired creative generation.

Ready to connect? Follow the setup guide — or see the quick paths for Claude and ChatGPT and other MCP clients.

By platform

Looking for one integration rather than the whole catalog? Each page below carries the tools for that platform, the install cards, and an honest note on what it does not do.

  • Meta Ads MCP server — Facebook and Instagram. The bulk of the catalog.
  • Web analytics MCP server — installing the tracking and auditing whether conversions are recorded.
  • Google Ads MCP server — read-only GAQL and keyword research today. The write tools are built and switched off until Google’s OAuth verification completes.
  • Shopify and MCP — an attribution source, not a store connector. Where the line sits.

Tool catalog

Generated from the live tool registry: every tool the server serves, grouped by the safety annotation the protocol carries, so this page and your assistant always agree.

Read tools (65)

Insights, audits, diagnostics and creative analysis. Read tools change nothing and work on the free plan, with these exceptions: diagnose_drop needs a Solo, Growth or Agency plan; run_gaql and run_graph_read are not available on the free plan; and a free key can call analyze_winning_ad 25 times a day, because it reaches a language model. Every other read is unmetered.

get_connected_account

The active Meta ad account: name, id, currency, and whether it can still spend. A disabled account reports healthy numbers right up until it stops delivering, so this is the first call before trusting any performance read.

list_ad_accounts

Every Meta ad account this workspace can act on, with its currency, and which one is active.

list_skills

AutoAdy's media-buying playbooks: foundation, audit, diagnose, creative strategy, launch, targeting, scale.

get_skill

The full methodology behind one playbook, so the assistant works from an opinionated process instead of improvising.

list_kill_recommendations

The ad pause recommendations from strategic analysis, read-only, for review before anything stops delivering. After you confirm, each ad is paused with pause_ad.

list_analytics_websites

The analytics websites this workspace can read.

get_website_installation

The GitHub connection and latest installation job status for one analytics website.

integrations_list_connections

List read-only CRM and analytics connections with account, coverage, and freshness.

integrations_get_status

Read one CRM or analytics connection status and permissions.

integrations_query

Run a bounded read-only query against a connected CRM or analytics source, including CRM stage history.

integrations_intelligence_report

Build a CRM pipeline report from one to four imported integration connections. Returns source evidence, freshness, partial reasons, and currency-separated exact amounts; it does not infer ROAS or historical conversion joins.

run_full_audit

Run a comprehensive audit of the entire ad account. This fetches account-level insights, all active campaigns with their metrics, and ad-level data for the top 5 campaigns by spend. USE THIS FIRST when the user asks for an audit, analysis, or account review. The returned payload contains everything needed for structured recommendations. Sales/e-commerce campaigns include result_type:'purchases' with purchases, cost_per_purchase, roas, and revenue — judge those on ROAS and cost per purchase, NOT leads/CPL.

diagnose_drop

Diagnose WHY account performance broke (CPL spiked, leads dried up, results collapsed). Runs 4-5 independent blind investigators over 35 days of daily data — creative fatigue, delivery/budget shifts (with the account's confirmed budget-change log as facts), traffic quality, offer/seasonality, and conversion tracking — then an adversarial pass tries to kill each theory. Returns a ranked cause-vs-symptom diagnosis with evidence for/against and the single most important action this week. USE THIS when the user asks why performance dropped or what broke; it prevents the default wrong guess (killing a winning creative for 'fatigue'). A full run takes about 2 minutes. Over MCP the call answers within about 20 seconds, and if the run is not finished it returns status "running" with retry_after_seconds — call it again with the same break_description to get the stored diagnosis.

get_account_insights

Get high-level KPI metrics for the ad account: spend, impressions, reach, clicks, CTR, CPM, CPC, frequency, leads, CPL. For Sales/e-commerce accounts the payload also includes result_type:'purchases' with purchases, cost_per_purchase, roas, and revenue — for those, ROAS is the primary metric, not leads/CPL. Use this first to understand overall account health.

list_campaigns

List campaigns with their name, status, objective, budget and budget_type (CBO = budget on the campaign, ABO = budget on each ad set). Returns campaign IDs needed for deeper analysis. truncated: true means the account has more campaigns than were returned.

get_campaign_insights

Get per-campaign performance: spend, impressions, CTR, CPM, CPC, reach, leads, CPL. Sales/e-commerce campaigns additionally return result_type:'purchases' with purchases, cost_per_purchase, roas, and revenue — compare those campaigns on ROAS/cost per purchase, never on leads (a Sales campaign showing 0 leads is NOT broken if it's driving purchases). Defaults to ACTIVE campaigns only. Use this to compare campaign performance and find winners/losers.

get_campaign_ad_insights

Get ad-level performance breakdown for a SPECIFIC campaign. Returns each ad's spend, CTR, CPM, CPC, frequency, leads, CPL, and current status. For ads in a Sales/e-commerce campaign, each ad also carries result_type:'purchases' with purchases, cost_per_purchase, roas, and revenue — rank those ads by ROAS/cost per purchase, not leads. Use this when the user asks about a specific campaign's ads, creative performance, or wants to drill into one campaign.

get_adsets

Get all ad sets inside a campaign, with their status, daily budget, and targeting info.

get_adset_insights

Get performance metrics broken down by ad set within a campaign. Ad sets in a Sales/e-commerce campaign also include result_type:'purchases' with purchases, cost_per_purchase, roas, and revenue — judge those on ROAS, not leads/CPL.

get_ads

Get individual ads inside an ad set with full creative copy: name, status, primary text, headline, description, CTA, link URL, thumbnail, and creative type. For dynamic creatives, returns all body/headline/description variations.

get_top_performing_ads

Find the best-performing ads in the account by spend and conversions. Good for identifying winning creatives. Ads from Sales/e-commerce campaigns also carry result_type:'purchases' with purchases, cost_per_purchase, roas, and revenue — for those, the 'best' ad is the one with the strongest ROAS, not the most leads. 'today' is a PARTIAL day and 'yesterday'/'today' are tiny samples — report them as snapshots, never declare winners or losers from them; prefer last_30d for decisions.

get_strategic_synthesis

Get a strategic synthesis of all pre-computed intelligence: alerts, forecasts, recommendations, benchmarks, budget allocation, and priorities. Use this when the user asks 'what should I do?', 'give me a strategy', 'what's the plan?', or any high-level strategic question. This does NOT call Meta API — it reads from our intelligence engine's cache.

analyze_creative_performance

Analyze creative performance by visual style, messaging angle, or hook tactic. Returns top and bottom performers with scores, strengths, weaknesses, and improvement suggestions. Use when the user asks 'what creative styles work best?', 'which hooks convert?', or anything about creative tag performance.

get_winning_frameworks

Review framework evidence within the currently selected, authorized ad account. This scoped tool does not read other accounts or establish cross-account patterns. It preserves the multiple-account evidence floor and reports cross-account evidence as unavailable when it cannot be established. Use get_creative_analytics for this account's measured angle, hook and style patterns; never describe scoped results as a winning portfolio playbook.

get_creative_analytics

Creative analytics for the currently selected, authorized ad account: win rate and cost-per-lead by messaging angle, hook, visual style and format; the angle-by-style combo matrix; 28-day cost trends per angle; and measured review suggestions. Use when asked what creatives/angles/hooks work or what to test next. Report coverage and missing evidence; do not infer that creative changes caused a cost change. Select another authorized account before reviewing its analytics.

list_lead_forms

List the Instant Lead Forms that already exist on the account's Facebook Page, with their ids, names and status. Use this to REUSE an existing form (pass its id as lead_gen_form_id to create_lead_ad / create_lead_ads) instead of creating a duplicate — matching a client's proven form matters because leads from a new form land in a separate Meta form export.

get_fatigue_forecast

Get creative fatigue predictions from the survival analysis engine. Shows which ads are fatiguing, how many days remain, and which need replacement. Reads from the intelligence cache.

backtest_rule

Replay a draft rule over the account's last 30 days of real data BEFORE creating it: how many times it would have fired, which ads it would have hit, and (for pause rules) the spend it would have avoided. ALWAYS run this before create_rule and show the user the result — 'this rule would have fired 3× last month on: …' — so they confirm on evidence, not on a description. Read-only, changes nothing.

get_account_health

Compute the account health score (0-100) with 5 components: creative diversity, fatigue risk, budget efficiency, testing velocity, waste level. Returns overall score plus component breakdowns.

audit_tracking

Audit the account's conversion tracking health (read-only): Meta Pixel presence + freshness (last fired), server-side/Conversions-API event detection (via pixel stats by source), and UTM hygiene on ad URLs. Returns a 0-100 score with prioritized findings. USE THIS as part of an account audit, or BEFORE trusting a performance drop — a tracking break looks exactly like a real drop. Pairs with the Audit and Diagnose skills.

list_pixels

List the Meta Pixels (datasets) on the ad account: id, name, and when each last fired (read-only). USE THIS to find the pixel_id for create_adset with OFFSITE_CONVERSIONS — e.g. building a website-conversion Leads campaign — so the user never has to dig it out of Events Manager. A pixel that has NEVER fired, or not fired recently, is a warning: Meta optimizes poorly against an event it hasn't seen — verify the installation (audit_tracking) before launching on it.

list_custom_audiences

List the account's custom + lookalike audiences: id, name, subtype, approximate size, delivery status (read-only). USE THIS before creating audiences (avoid duplicates) and to get the ids for create_adset targeting (custom_audience_ids / excluded_custom_audience_ids) or the seed for create_lookalike_audience.

plan_scale_axis

Plan HOW to scale a winner — vertical (raise budget), horizontal (duplicate to a new audience), bid-cap (Tichenor), or target-ROAS (Faris) — and return the exact execution parameters (budget step, bid amount, duplication method). Pass axis='auto' to let it pick vertical vs horizontal from frequency/CPA-inflation. This is advisory: it returns the plan; execute vertical via scale_budget_relative and horizontal via duplicate_adset. Use with the Scale skill.

get_playbook_template

Get a multi-week tactical playbook (dated week-by-week checklist) for a campaign window. Call with no slug to list available templates: bfcm, product-launch, lead-gen-ramp, recovery, scale-ladder. Use with the Playbooks skill when the user wants a BFCM/launch/recovery/scaling plan.

get_roi_metrics

Calculate AutoAdy's ROI for this account: net money saved from pausing bleeders (reconciled against the account's own spend), time saved, performance improvement, and an ROI multiplier of net savings over the plan price. The multiplier is 0 when nothing was saved; time saved is priced separately as time_value, in the account's currency, at labor_rate_per_hour (default 50 USD an hour, converted). roi_basis states how both were computed.

get_daily_briefing

Get the account's daily briefing: AI narrative + headline, mood, week-over-week deltas, current winners and bleeders, budget recommendations, and alert/fatigue summary. Numbers come from a SETTLED 7-day-vs-7-day window (ends yesterday — today's partial day is excluded so attribution lag can't fake a decline), and results count each ad set's real optimization event (custom conversions included), never name-guessed leads. Purchase-optimized accounts read as purchases/cost-per-purchase. Served from a 30-minute cache when fresh; pass force:true to regenerate. USE THIS for 'morning briefing', 'how are we doing', or any daily status question.

get_findings

List the open findings from AutoAdy's continuous account scan — the same actionable to-do queue shown on the dashboard (bleeders to kill, winners to scale, anomalies, tracking issues). Each finding has a severity, plain-English rationale, a proposed action, and an expected impact measured over the finding's own data window (NOT a monthly projection). Findings auto-resolve when the underlying entity recovers, so this list is live, not a stale report. Use resolve_finding to mark one handled.

get_top_performers

Statistically proven winners, grouped by creative dimension: which primary text (copy), headline, landing page, or video hook actually performs best. Unlike get_top_performing_ads (individual ads ranked by spend), this aggregates every ad sharing the same copy/headline/page/hook and ranks groups by real cost per result — with a 95% z-test confidence flag vs the account average, a minimum-results trust floor so 1-lead flukes can never rank as winners, and a settled-window CPL trend (improving/worsening). Purchase-optimized accounts rank on ROAS/cost-per-purchase automatically. USE THIS for 'what copy/headline/hook is winning', 'what should we make more of', or creative strategy questions.

get_decision_history

The account's decision ledger (proof of work): every action AutoAdy or the agent executed — pauses, budget changes, launches — with when, why (source), the before-snapshot, and the MEASURED impact where computed (CPL/leads/spend before vs after, and a verdict). USE THIS for 'what did AutoAdy do', 'did that budget change work', accountability questions, or before repeating an action that was recently tried. Every write tool logs here automatically.

run_gaql

Run a read-only Google Ads Query Language (GAQL) query against the workspace's selected Google Ads customer and return the rows. USE THIS when the user asks for Google Ads data that the named tools do not cover, or asks for a specific GAQL query by name. Only SELECT is accepted, over exactly one of these resources: ad_group, ad_group_ad, ad_group_criterion, asset, campaign, campaign_budget, conversion_action, customer, keyword_view, recommendation, search_term_view. A row cap is applied for you (max 5000). Raw reads have no separate credit fee once the shared Credits wallet is active. Before wallet activation: Costs 4 credits per run on the Solo, Growth and Agency credit plans; existing Pro and Agency subscriptions get 100 and 500 runs a day free instead, per workspace, resetting at midnight UTC. Not available on the free plan. Prefer a named tool when one exists. This tool cannot change anything; use the Google write tools for that.

run_graph_read

Run a read-only Meta Marketing API (Graph) request and return the JSON. USE THIS when the user asks for a Meta field or edge that the named tools do not expose. The path is a node optionally followed by one edge, for example "act_123456/campaigns" or "23848.../insights". Readable edges: adcreatives, ads, adsets, campaigns, customaudiences, insights, leadgen_forms. Raw reads have no separate credit fee once the shared Credits wallet is active. Before wallet activation: Costs 4 credits per run on the Solo, Growth and Agency credit plans; existing Pro and Agency subscriptions get 100 and 500 runs a day free instead, per workspace, resetting at midnight UTC. Not available on the free plan. Prefer a named tool when one exists. This tool cannot change anything.

research_keywords

Get Google keyword ideas with average monthly search volume, competition and top-of-page bid range, from seed keywords, a landing page URL, or both. USE THIS when the user asks what to bid on, what people search for, or wants to expand an ad group. Volumes are Google's own twelve-month averages for the language and locations given. Read-only.

list_tiktok_advertisers

List the TikTok Ads advertisers this workspace's connection can read, with each one's currency, timezone and status, and which one is currently selected. USE THIS when the user asks which TikTok accounts are connected or wants to know which one the reports cover.

get_tiktok_report

Read TikTok Ads performance for the selected advertiser over the last 30 settled days: spend, impressions, clicks and conversions by campaign, ad group or ad. USE THIS for any TikTok performance question. Row caps are 500 campaigns, 1000 ad groups and 2000 ads, and the result says when it was truncated. Read-only.

list_microsoft_ads_accounts

List the Microsoft Advertising accounts this workspace's connection can read, and which one is currently selected. USE THIS when the user asks which Microsoft (Bing) accounts are connected.

get_microsoft_ads_report

Read Microsoft Advertising campaign performance for the selected account over the last 30 settled days: spend, impressions, clicks and conversions. USE THIS for any Microsoft or Bing Ads performance question. Microsoft generates this report asynchronously, so it can take several seconds. Capped at 2000 campaigns, and the result says when it was truncated. Read-only.

list_organic_sites

List the websites this workspace has registered for Organic (SEO, GEO and AI visibility), with their verification state, crawl budget and when each was last crawled. Every other organic tool takes a site_id, so CALL THIS FIRST when the user asks about their website, their SEO, whether AI can read their site, or which pages need work.

get_organic_score

Get a registered site's 0 to 100 Organic score with the arithmetic behind it: a subscore per dimension (technical, indexation, content, structured data, crawler access, internal links, AI citation, rankings), the published weight of each, and the counted facts each came from. A dimension nothing has measured yet reports as not measured rather than zero, and the caveat sentence names which. USE THIS for 'how is my SEO', 'score my site', or 'what is my visibility like'.

get_page_verdicts

Get the pages of a registered site that the last crawl read, worst first, with every technical and GEO issue found on each and the evidence behind it: title and meta length, H1 count, canonical, structured data types, indexability and word count. USE THIS for 'which pages need work', 'what is wrong with my site', or a question about one URL.

get_search_queries

Get the search queries a registered site actually gets impressions for, from its Search Console capture: clicks, impressions, click-through rate and average position per query, most impressions first, with the exact window the numbers cover. USE THIS for 'what do people search to find us', 'which keywords do we rank for', or before advising on content. Returns the captured snapshot, never a live call, so it costs nothing and reports its own age.

get_search_pages

Get the pages of a registered site that search actually sends people to, from its Search Console capture: clicks, impressions, click-through rate and average position per URL, most impressions first. USE THIS for 'which pages get traffic', 'what is working', or to find the pages worth improving first. Returns the captured snapshot, never a live call.

get_organic_audits

Get the four Search Console audits for a registered site: queries in striking distance of page one, the site's own pages competing for one query, pages losing clicks against the matched previous window, and the four indexation gaps. Each says whether it could run at all, so an audit with no data reports that rather than reporting nothing found. USE THIS for 'what should I fix first', 'why is traffic down', or 'what is the quickest SEO win'.

get_organic_visibility

Get which answer engines (ChatGPT, Perplexity, Google AI Overviews, Claude, Gemini) cite a registered site for its tracked buyer questions, how often, and which competitors were cited instead. An engine that could not be asked reports as not asked with the reason, NEVER as not citing: do not describe an unasked engine as one that ignored the site. USE THIS for 'does ChatGPT recommend us', 'AI visibility', or 'who do assistants mention instead of us'.

get_organic_rankings

Get the tracked keyword positions for a registered site, with the movement against the last day the provider actually answered. A day the provider could not be reached is a gap, not a fall, and a keyword outside the tracked results says so rather than reporting a position it does not have. USE THIS for 'where do we rank', 'did we drop', or 'what moved this week'.

get_ai_traffic

Get which AI assistants (ChatGPT, Claude, Perplexity, Gemini, Copilot and others) sent visits to a registered site, the pages they linked to, and how those visits converted against search and direct. Visits with no referrer are reported as unattributed rather than folded into direct, because assistants strip referrers. USE THIS for 'is ChatGPT sending me traffic', 'AI traffic', or 'are people finding us through AI'.

analyze_winning_ad

Deep analysis of a single ad: returns the actual creative image/video URL, full ad copy (primary text, headline, description, CTA, link), adset targeting (age, gender, locations, interests, behaviors, custom audiences, placements), adset budget + optimization goal, and campaign objective + budget type. Use after get_top_performing_ads to understand WHY a winner works before multiplying it. If it's a video ad, returns the video source URL.

get_workflow_status

Check the status of a running workflow (url_to_ads, multiply_winner, etc.).

get_creative_brief

Read one creative brief version by version_id, with the evidence it cites. Read-only; use it before editing, approving or generating. Results are scoped to the authenticated workspace and account.

get_generation_status

Read the state of a generation run by run_id: queued, running, succeeded, failed, cancelled or uncertain, with progress. Read-only; call it after generate_from_brief or resume_generation. Results are scoped to the authenticated workspace and account.

assess_experiment

Assess an experiment by experiment_id: whether the recorded control and variant results are sufficient evidence to learn from, and what is missing if not. Read-only. Results are scoped to the authenticated workspace and account.

list_learning

List experiments, results, interpretations and learning candidates for this account, or for one experiment when experiment_id is given. Read-only. Results are scoped to the authenticated workspace and account.

list_competitor_board

List the tracked competitor board: saved snapshots and change alerts, with filters and cursor paging. Read-only. Results are scoped to the authenticated workspace and account.

find_novelty_candidates

Compare recent competitor observations against this account's own creative history and return the concepts that are new rather than similar or duplicate, with citations. Read-only. Results are scoped to the authenticated workspace and account.

preview_meta_test_plan

Build a preview of a Meta creative test plan: scope, brief, approved artifacts, control and variant, objective, metric, allocation, dates, budget, and success and kill rules. Returns a preview hash and confirmation token; nothing is created in Meta. Results are scoped to the authenticated workspace and account.

generate_llms_txt

Generate an llms.txt index for a registered site from the pages the last crawl read, grouped into product, pricing, documentation, writing, company and legal. Only pages that answered with a 200 are linked, so the file can never point an assistant at a dead URL. Returns the file to save at the root of the domain. USE THIS for 'make me an llms.txt', 'help assistants understand my site', or 'GEO setup'.

Write tools (62)

Change campaigns: budgets, status, duplication, targeting, launching and the creative pipelines. A free key is read-only: every write tool needs a paid plan (Solo, Growth or Agency), including tools that only change AutoAdy such as switch_account and prepare_website_installation. On a free key they refuse with a message naming the upgrade. Calls that reach a Meta ad account are capped at 200 changes per hour per account, previewed, journalled and reversible.

switch_account

Change which Meta ad account subsequent calls operate on. The choice persists. Changes no ad-account state.

prepare_website_installation

Inspect a connected GitHub HTML file and prepare an analytics installation preview. An editor must review and apply it in AutoAdy; this tool never commits.

enable_ad

Re-enable a paused ad by setting its status to ACTIVE. Use this to reactivate ads that were previously paused.

adjust_campaign_budget

Adjust the daily budget of a CBO campaign (one that has a campaign-level daily budget). UNITS: new_daily_budget is in the account currency's MINOR units (cents), the unit Meta stores and get_campaigns reports: 2000 = €20.00/day. This differs from create_campaign / create_adset, whose daily_budget is in MAJOR units (40 = €40/day). To avoid converting, pass new_daily_budget_major instead (20 = €20.00/day); pass one of the two. Refused on an ABO campaign (budgets on the ad sets), because Meta would convert it to CBO and delete every ad-set budget, and on a lifetime-budget campaign. Use this to scale winning campaigns or reduce spend on underperformers. Returns a before→after receipt and logs to the decision ledger (auditable via get_decision_history).

bulk_enable_ads

Re-enable multiple paused ads at once. Use to reactivate a batch of ads.

scale_budget_relative

Scale a campaign's daily budget by a percentage. Example: +20% increase or -15% decrease. Automatically fetches the current budget, computes the new value, and applies it. Returns the old→new budget and logs to the decision ledger (auditable via get_decision_history).

enable_adset

Re-enable a paused ad set.

duplicate_ad

Duplicate an ad to a different ad set. Use to copy winning creatives into new audiences or test campaigns.

duplicate_adset

Duplicate an ad set to the same or different campaign, preserving its EXACT targeting (city/radius geo, exclusions), bid strategy and bid cap — things create_adset cannot always reproduce. New ad set is created PAUSED. By default the ads come too; pass include_ads: false to copy the ad set SHELL ONLY and then load your own creatives with create_lead_ads (instant-form ad sets) or create_website_ads (website and traffic ad sets). Use include_ads: false when the source has several ads — Meta rejects a deep copy of more than a couple of objects ('fewer than 3 objects per copy'), and a shell copy has no such limit. The receipt states the copy's budget as read back from Meta; copying an ad set from a campaign-budget (CBO) campaign into one without a campaign budget needs daily_budget.

update_adset_targeting

Update specific targeting fields on a LIVE ad set without touching the rest: countries (narrow a broad/Europe-wide set to an exact country list), location_types (['home'] = residents only — removes travelers/visitors; ['home','recent'] = Meta's default), Advantage+ audience expansion on/off, age range, and placements. Read-modify-write: the current targeting is fetched first and ONLY the passed fields change — everything else is preserved exactly. The previous targeting is saved to the decision ledger for rollback. Placement notes: Meta re-validates the WHOLE targeting object on any edit, so a legacy manual placement set it now considers invalid (e.g. 'Instagram Explore home without Instagram Explore') blocks EVERY update — fix it in the same call by passing instagram_positions with the missing position added, or advantage_placements: true to switch to automatic. Note: editing targeting on a delivering ad set resets its learning phase.

create_campaign

Create a NEW Meta campaign — the top-level container an ad set and ads live in. Created PAUSED (never spends until you launch it). Default objective is OUTCOME_LEADS (lead-gen / instant-form). This is the top of the build chain: create_campaign → create_adset (copy a proven ad set's targeting via target_campaign_id) → create_lead_ads (load creatives). Budget: OMIT daily_budget for ABO (budget set per ad set — the common lead-gen case), or PASS daily_budget for CBO (one budget shared across the campaign's ad sets).

create_adset

Create a NEW EMPTY ad set (no ads) in two possible ways. (A) COPY MODE — pass source_adset_id to clone a proven ad set's targeting, optimization goal, budget and promoted object; best when you want to reuse exact existing targeting such as a verified city/radius setup. (B) BUILD MODE — omit source_adset_id and pass campaign_id + targeting params to build one from scratch: countries and/or cities with radius, age, genders, locales, placements, optimization goal, and an ABO daily_budget with an optional bid cap. Created PAUSED. Follow with create_lead_ads (instant-form ad sets) or create_website_ads (OFFSITE_CONVERSIONS/website ad sets) to load creatives. If copy mode fails because the source uses a bid cap or hits Meta's copy limits, use build mode, or duplicate_adset with include_ads: false.

create_lead_form

Create a NEW Instant Lead Form — the form that opens when someone taps a lead ad. Returns a form_id you then attach with create_lead_ad / create_lead_ads (lead_gen_form_id). Use CUSTOM multiple-choice questions to gate for intent (a 'hard-gate' qualifying form) and higher_intent:true to add Meta's extra review step before submit. Without this tool a new ad set can only inherit an OLD form from an existing ad — this is how you launch with a fresh, purpose-built form.

create_lead_ad

Create a lead-form (instant form) ad from a CUSTOM image URL in an existing ad set. Uploads the image and attaches the lead form + page so it is a real instant-form ad (not a link ad). Created PAUSED. If lead_gen_form_id is omitted it inherits the form from an existing ad in the ad set. Use after create_adset to load your own creatives with matched copy.

create_lead_ads

Batch of create_lead_ad — create MANY lead-form ads (each a custom image + its matched copy) in ONE existing ad set in a single call. Up to 15. Created PAUSED, throttled to protect the account from Meta rate limits, and resilient: one ad failing never kills the rest. Returns which succeeded/failed. Use to load a whole creative batch at once.

create_website_ad

Create a WEBSITE (link) ad in an existing ad set — it clicks through to a landing page URL instead of opening an instant form. This is the ad type for pixel/conversion ad sets (create_adset with OFFSITE_CONVERSIONS + pixel_id). The creative comes from EITHER image_url (uploads a new image) OR source_ad_id (reuses a winning ad's EXACT image by hash, no re-upload, and inherits its primary text/headline/description/CTA unless you override them — the way to carry proven creatives into a new website campaign). Created PAUSED. Instant-form ad sets (LEAD_GENERATION) are refused with guidance instead of a cryptic Meta error — use create_lead_ad for those.

create_website_ads

Batch of create_website_ad — create MANY website (link) ads in ONE existing ad set in a single call. Up to 15. Each ad brings its own creative: image_url to upload, or source_ad_id to reuse a winning ad's exact image + copy (override any field per ad). The top-level link_url and url_tags apply to every ad unless overridden per ad. Created PAUSED, throttled against Meta rate limits, and resilient — one ad failing never kills the rest. This is the tool for 'rebuild the winners as a website-conversion campaign'.

create_rule

Create an automation rule from natural language. Converts the user's intent into a structured rule with conditions and actions. Example: 'pause any ad with CTR below 0.3% after spending €10' → rule with metric=ctr, operator=<, value=0.3, action=pause_ad. WORKFLOW: (1) compile the user's intent, (2) run backtest_rule with the same condition and SHOW the user what it would have done over the last 30 days, (3) create only after they confirm. Default mode is 'suggest' — the rule proposes and the user approves each action; only set mode='auto' when the user explicitly asks for automatic execution.

trigger_creative_generation

Generate a NEW brand-aware ad image. This tool CANNOT edit an existing image or preserve a selected original. For removing a logo, changing text/background, or other source edits, direct the user to the selected image’s Edit image action in Studio. Never claim a new generation edits the original. Use the saved website language automatically; do not ask for language. Set language only when the user explicitly requests an override. Confirm the concept/message before new generation. Keep the same request_id to recover an approved task; never start another image just to check its result.

create_custom_audience

Create a WEBSITE custom audience from a pixel rule — entirely via API, no Business Manager. Two rule kinds: url_contains ("/booking" → retargeting audience of page visitors) or event_name ("Lead" or a custom name like "lead_booked" → CONVERTERS audience, the ideal lookalike seed and exclusion list). Default: all website visitors. If Meta requires the one-time Custom Audience Terms acceptance, the error returns the exact one-click link — the only step the API can't do. The audience fills as the pixel fires (needs ~100+ people to serve or seed a lookalike).

create_lookalike_audience

Create a LOOKALIKE audience from an existing custom audience — Meta finds people similar to the seed (e.g. a converters audience from create_custom_audience). ratio 0.01–0.10 (1% = tightest match, start there), one 2-letter country per call. The source must belong to this account and hold 100+ people in the target country; Meta populates the lookalike over ~1–24h. Target it with create_adset (custom_audience_ids).

send_pixel_event

Send ONE server-side conversion event to a pixel via the Conversions API. USE THIS to (a) verify CAPI plumbing with a test_event_code (shows in Events Manager → Test Events, does NOT enter optimization/reporting), or (b) make an event EXIST on the pixel — Meta won't optimize cleanly toward an event it has never seen, so a brand-new "Lead"/custom event needs one real fire before launching an ad set on it. A provided email is SHA-256 hashed before sending, never sent raw. Real events (no test code) enter reporting — send them only for genuine conversions or a deliberate one-off unblock the user approved.

analyze_competitorreaches beyond your account

Analyze a competitor's ad strategy using the Meta Ad Library. Provide a competitor name or page ID to see their messaging themes, creative styles, CTA patterns, and opportunities to differentiate. Needs a Growth or Agency plan.

resolve_finding

Mark one scan finding as resolved/handled so it leaves the findings queue (on the dashboard and in get_findings). This changes AutoAdy app state only — it never touches the Meta account. Use after the user has acted on a finding (or explicitly dismisses it). Pass the finding id from get_findings.

set_google_campaign_budget

Change the daily budget on a Google Ads campaign budget. Shows a preview with the exact API payload and the current amount, requires approval, and is undoable for 60 seconds. A change of 50% or more needs the customer id typed to confirm.

add_google_negative_keywords

Exclude search terms from a Google Ads campaign or ad group. Up to 500 per call and 2000 per customer per day. Shows every term in the preview, requires approval, and is undoable for 60 seconds. Use EXACT to exclude the one term that wasted money and nothing broader.

dismiss_google_recommendation

Dismiss one of Google's recommendations so it stops being suggested. Changes nothing in the account itself.

upload_google_image_asset

Upload an image from a public URL as a reusable Google Ads image asset. Maximum 5MB, PNG, JPEG or GIF. An uploaded asset cannot be removed from here, and the preview says so.

url_to_adsreaches beyond your account

Full pipeline: extract brand DNA from a URL and generate up to 50 ad creative variants across multiple angles, hooks, and visual styles. Returns task IDs for image generation. Best for: new brands, product launches, initial creative library. Paid plan required.

multiply_winner

Take a winning ad and generate 10+ variations preserving the winning DNA but rotating visual style, hook, and messaging angle. Provide ad_id or image_url. Best for: scaling proven creatives, creative refresh.

competitor_creativesreaches beyond your account

Analyze competitor Meta ads, reverse-engineer their best creatives into templates, then generate your own branded versions using your brand DNA. Agency plan required.

creative_matrix

Scientific A/B test: specify angles × hooks × visual styles to generate all combinations (max 27). Each combo produces a unique ad creative for testing.

enable_creative_loop

Enable the autonomous creative loop: auto-detects fatiguing ads, generates replacements, optionally auto-launches winners. Paid plan required.

extract_creative_dnareaches beyond your account

Extract brand DNA from a website URL: visual identity, voice profile, target avatar, winning patterns, unique mechanism. Foundation for all creative generation. Paid plan required.

audience_mirror

Analyze which demographics convert best and suggest matching avatar descriptions + settings for creative generation. Saves audience demographics to brand memory.

placement_optimize

Generate placement-specific creatives: Feed (4:5), Reels (9:16), Stories (9:16), Right Column (1:1). Each gets content designed for its consumption pattern.

retargeting_ladder

Generate funnel-stage-specific creatives: Cold (awareness), Warm (consideration), Hot (conversion), Buyer (retention). Each stage gets psychologically matched content.

creative_autopsy

Analyze recently failed/paused ads to extract anti-patterns. Learns what NOT to do and saves patterns to Creative DNA for future avoidance.

testimonial_mine

Turn customer testimonial quotes into social proof ad creatives. Provide an array of quote strings and get branded testimonial ads.

content_calendar

Create a multi-week content calendar with themed weeks and angle rotations. Saves the calendar to brand memory for scheduled execution.

product_launch_blitz

Maximum-scale product launch: generates 50 ads across 6 messaging angles from a single URL. Uses all available angles for maximum coverage.

cross_platform_cascade

Generate creatives optimized for multiple platforms: Meta Feed, Meta Reels, TikTok, Pinterest, Website. Each platform gets native aspect ratios and style.

create_creative_brief

Create a draft creative brief from research: facts, hypothesis, cited snapshots and observations, approved offers and claims, and the image and video direction. The draft cannot generate anything until a reviewer approves it with approve_creative_brief. Results are scoped to the authenticated workspace and account.

edit_creative_brief

Change a creative brief by version_id with a patch of the fields to replace. The edit is saved as a new version with no approval of its own, so it must be approved before it can generate. Results are scoped to the authenticated workspace and account.

approve_creative_brief

Approve a creative brief version so it can generate media. Records the approving user, and is refused if an offer or claim the brief cites is no longer approved or has changed. Results are scoped to the authenticated workspace and account.

revoke_creative_brief

Withdraw approval from a creative brief version, with an optional reason. Generation from that version is refused until it is approved again. Results are scoped to the authenticated workspace and account.

generate_from_brief

Start image or video generation from an approved creative brief. Spends AutoAdy credits and is idempotent on idempotency_key, so a retry with the same key does not start a second run. Poll with get_generation_status. Results are scoped to the authenticated workspace and account.

resume_generation

Resume an interrupted generation run by its original idempotency_key. Continues the same run instead of starting a new one. Results are scoped to the authenticated workspace and account.

approve_generation_artifact

Record a reviewer's approval of one generated artifact by artifact_id, with an optional reason. Nothing is attached to a live ad by this call. Results are scoped to the authenticated workspace and account.

reject_generation_artifact

Record a reviewer's rejection of one generated artifact by artifact_id, with an optional reason. Nothing in the ad account changes. Results are scoped to the authenticated workspace and account.

create_experiment

Register a creative experiment: control and variant references, objective, metric, audience, source, provider, a settled measurement window and attribution. Idempotent on idempotencyKey. Record outcomes with record_experiment_result. Results are scoped to the authenticated workspace and account.

record_experiment_result

Record the measured result for one side (control or variant) of an experiment: sample size, spend, events, numerator and denominator, and when the data was fresh. Idempotent on idempotencyKey. Results are scoped to the authenticated workspace and account.

record_result_interpretation

Attach a written interpretation to an experiment's results, optionally naming the hypothesis. Causal or unsupported performance claims are refused. Stored with the author; the numbers do not change. Results are scoped to the authenticated workspace and account.

propose_learning_memory

Propose a learning from an experiment, with the text and the rationale behind it. It is saved as a pending candidate that a reviewer approves or rejects with review_learning_memory. Results are scoped to the authenticated workspace and account.

review_learning_memory

Approve or reject a pending learning candidate by candidateId, with an optional reason. Records the reviewer's decision; nothing in the ad account changes. Results are scoped to the authenticated workspace and account.

create_competitor_change_routine

Start monitoring a tracked competitor source for changes on a cadence in seconds. Alerts land on the competitor board; this call does not capture anything itself. Results are scoped to the authenticated workspace and account.

pause_competitor_change_routine

Pause a competitor monitoring routine by routine_id. It stops checking for changes until resumed. It does not pause any ad. Results are scoped to the authenticated workspace and account.

resume_competitor_change_routine

Resume a paused competitor monitoring routine by routine_id, so it checks for changes on its cadence again. Results are scoped to the authenticated workspace and account.

refresh_competitor_change_routine

Record one refresh of an active competitor monitoring routine: the content hash observed, when, and with what coverage. Raises a change alert when the content is new, changed or removed. Idempotent on idempotency_key. Results are scoped to the authenticated workspace and account.

dismiss_competitor_change_alert

Dismiss a competitor change alert by alert_id, or restore a dismissed one. Idempotent on idempotency_key. Results are scoped to the authenticated workspace and account.

capture_competitor_snapshotreaches beyond your account

Search the public Meta Ad Library by page id or search terms in one market and save what it returns as a competitor snapshot. Reaches outside this account; needs the workspace's Meta connection. Results are scoped to the authenticated workspace and account.

approve_meta_test_plan

Approve a previewed Meta test plan by sending back the preview with its previewHash and confirmationToken. Refused if the preview changed since it was built. Results are scoped to the authenticated workspace and account.

Tools that stop delivery (9)

Annotated destructive in the protocol, so a well-behaved assistant asks before calling one. list_kill_recommendations shows the full pause list for review before anything pauses.

pause_ad

Pause a specific ad by setting its status to PAUSED. Use this when an ad has high frequency, poor CTR, or excessive CPL. Every pause is logged to the decision ledger with a before-snapshot (auditable via get_decision_history) and is reversible with enable_ad.

bulk_pause_ads

Pause multiple ads at once. Use when you need to pause all bleeders in a campaign or a list of specific ads. More efficient than calling pause_ad multiple times. Each pause is individually logged to the decision ledger with a before-snapshot; one ad failing never aborts the rest.

pause_adset

Pause an ad set. All ads within it will stop delivering.

set_campaign_status

Set a campaign's status to ACTIVE (launch it) or PAUSED (stop it). This is the final step of an MCP build chain: create_campaign → create_adset → create_lead_ads → enable_adset + bulk_enable_ads → set_campaign_status ACTIVE. Without this a campaign created through the MCP stays PAUSED forever. Verified by a post-write read-back. Note ACTIVE on the campaign alone does not deliver — the ad set and ads must be ACTIVE too.

archive_campaign

Archive a campaign (status ARCHIVED): the campaign and every ad set and ad in it stop delivering. Use it to clean up test or finished objects, including ones created with create_campaign / create_adset / create_website_ad. The current status and budget are saved to the decision ledger. An object that is already ARCHIVED is left alone. Not reversible through AutoAdy: an archived object stays readable (history, results) but does not run again. To reuse it, duplicate it first. Always asks for a typed confirmation.

archive_adset

Archive a ad set (status ARCHIVED): every ad in it stops delivering. Use it to clean up test or finished objects, including ones created with create_campaign / create_adset / create_website_ad. The current status and budget are saved to the decision ledger. An object that is already ARCHIVED is left alone. Not reversible through AutoAdy: an archived object stays readable (history, results) but does not run again. To reuse it, duplicate it first. Always asks for a typed confirmation.

archive_ad

Archive a ad (status ARCHIVED): it stops delivering. Use it to clean up test or finished objects, including ones created with create_campaign / create_adset / create_website_ad. The current status and budget are saved to the decision ledger. An object that is already ARCHIVED is left alone. Not reversible through AutoAdy: an archived object stays readable (history, results) but does not run again. To reuse it, duplicate it first. Always asks for a typed confirmation.

set_google_campaign_status

Pause or enable a Google Ads campaign. Shows a preview with the current status, requires approval, and is undoable for 60 seconds. Refused outright when the request comes from a cron, Slack or Telegram: automated pauses require an explicit user preview.

apply_google_recommendation

Apply one of Google's own recommendations. ALWAYS requires the customer id typed to confirm, because Google decides exactly what changes and there is no undo afterwards. Read them first with run_gaql over the recommendation resource.