← Back to AutoAdy

Meta Ads MCP server

A remote MCP server for Facebook and Instagram advertising. Your assistant reads live account data and, on a paid plan, makes the change.

Last updated: September 24, 2026

AutoAdy runs one remote MCP server. The same tools the in-app agent uses are served over the open Model Context Protocol, so Claude, ChatGPT connectors in developer mode, Cursor, VS Code and anything else that speaks MCP all connect to a single endpoint and see the same catalogue.

Numbers are counted against each campaign's own objective. A lead-gen campaign reports leads and cost per lead, a sales campaign reports purchases and ROAS, and custom conversions are respected rather than flattened into one results column. Partial days are labelled, so a half-day of data is never sold to the model as a winner.

The table below is generated from the server's tool registry. It is what your assistant sees, and a test fails the build if the published table and the server ever disagree.

Tools

What your assistant can call

109 tools: 46 that read and change nothing, 56 that make a change, and 7 that stop live delivery and are annotated destructive so a well-behaved assistant asks first.

Account and connection (3)

Which account is live, what else this workspace can reach, and whether it can still spend.

get_connected_account

read

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

read

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

switch_account

write

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

Performance reads (11)

The numbers, at every level, counted against each campaign's own objective.

get_account_insights

read

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

read

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

read

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

read

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

read

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

get_adset_insights

read

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

read

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

read

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_top_performers

read

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_daily_briefing

read

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_roi_metrics

read

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.

Raw reads (1)

Any Meta field or edge the named tools do not expose, read-only. 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. The named tools come first.

run_graph_read

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. 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.

Audits and diagnosis (8)

Why something moved, tested against the account's own data rather than guessed.

run_full_audit

read

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

read

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_health

read

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.

get_strategic_synthesis

read

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.

get_fatigue_forecast

read

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.

get_findings

read

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.

resolve_finding

write

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.

get_decision_history

read

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.

Creative analysis (4)

Which angles, hooks and formats are carrying the account, and which are not.

analyze_creative_performance

read

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_creative_analytics

read

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.

get_winning_frameworks

read

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.

analyze_winning_ad

read

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.

Planning and methodology (8)

AutoAdy's playbooks, exposed so the assistant works a process instead of improvising.

list_skills

read

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

get_skill

read

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

plan_scale_axis

read

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

read

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.

backtest_rule

read

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.

list_lead_forms

read

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.

list_custom_audiences

read

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.

list_pixels

read

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.

Budget and status changes (6)

Paid plan. Capped at 200 account changes per hour, previewed, journalled and reversible.

adjust_campaign_budget

write

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).

scale_budget_relative

write

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_ad

write

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

enable_adset

write

Re-enable a paused ad set.

bulk_enable_ads

write

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

create_rule

write

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.

Stopping delivery (8)

Annotated destructive, so a well-behaved assistant asks first. The kill list is readable in full before anything pauses.

list_kill_recommendations

read

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.

pause_ad

stops delivery

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.

pause_adset

stops delivery

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

bulk_pause_ads

stops delivery

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.

set_campaign_status

stops delivery

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

stops delivery

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

stops delivery

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

stops delivery

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.

Building and launching (12)

Paid plan. Campaigns are created paused: nothing spends without an explicit status change.

create_campaign

write

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

write

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.

duplicate_ad

write

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

duplicate_adset

write

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

write

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_lead_form

write

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

write

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

write

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

write

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

write

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_custom_audience

write

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

write

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).

Creative generation (15)

Paid plan. Multi-step pipelines that produce ad assets and copy. Generated work is staged, never attached to a live ad on its own.

trigger_creative_generation

write

Start AI creative generation. Generates a brand-aware ad image. BEFORE calling this tool, you MUST confirm with the user: (1) what language the ad text should be in, (2) any specific message or hook to use. Only call this tool ONCE per user request — never retry.

url_to_ads

writereaches 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

write

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.

creative_matrix

write

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

write

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

extract_creative_dna

writereaches 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

write

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

placement_optimize

write

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

write

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

creative_autopsy

write

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

write

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

content_calendar

write

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

product_launch_blitz

write

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

write

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

get_workflow_status

read

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

Competitive research (2)

Reaches the public Meta Ad Library, so it is annotated open-world.

analyze_competitor

writereaches 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.

competitor_creatives

writereaches 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.

Competitor monitoring (8)

A board of tracked competitors and change alerts. These write AutoAdy's own records, never the ad account; the snapshot reaches the public Meta Ad Library, so it is annotated open-world.

capture_competitor_snapshot

writereaches 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.

list_competitor_board

read

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

read

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.

create_competitor_change_routine

write

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

write

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

write

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

write

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

write

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.

Creative briefs (10)

Write a brief, approve it, then generate from it and review each artifact. These change AutoAdy's own records, never the ad account.

create_creative_brief

write

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.

get_creative_brief

read

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.

edit_creative_brief

write

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

write

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

write

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

write

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.

get_generation_status

read

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.

resume_generation

write

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

write

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

write

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.

Experiments and learning (9)

Plan a test, record what happened, and keep what it taught. These change AutoAdy's own records, never the ad account.

preview_meta_test_plan

read

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.

approve_meta_test_plan

write

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.

create_experiment

write

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

write

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

write

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.

assess_experiment

read

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.

propose_learning_memory

write

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.

list_learning

read

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.

review_learning_memory

write

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.

CRM and analytics sources (4)

Read-only queries against the CRM and analytics connections this workspace has imported, with freshness stated.

integrations_list_connections

read

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

integrations_get_status

read

Read one CRM or analytics connection status and permissions.

integrations_query

read

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

integrations_intelligence_report

read

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.

This table is generated from the server's own tool registry, so it is what your assistant sees. Check it yourself by pointing any MCP client at the endpoint and reading the tools list.

Connect

Two controls, then ask it something

Claude (claude.ai)

Signs in with OAuth

Opens Claude's add-custom-connector dialog with the name and URL already filled in. Claude still asks you to press Add, then signs you in to AutoAdy with OAuth.

Add AutoAdy to Claude (claude.ai)

If you would rather do it by hand: Settings, Connectors, Add custom connector, and paste this.

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

Claude Code

Needs an API key

Paste into your terminal, then run /mcp to confirm autoady is connected.

claude mcp add --transport http autoady https://www.autoady.io/api/mcp --header "Authorization: Bearer YOUR_KEY"

Replace YOUR_KEY with a key from Settings, API Keys. Keys are shown once and can be revoked at any time.

Everywhere else

Claude Desktop

Needs an API key

Open the downloaded file and Claude Desktop installs the extension, including the interactive views.

Download the extension

Or edit claude_desktop_config.json by hand and restart Claude Desktop.

{
  "mcpServers": {
    "autoady": {
      "type": "http",
      "url": "https://www.autoady.io/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}

Replace YOUR_KEY with a key from Settings, API Keys. Keys are shown once and can be revoked at any time.

ChatGPT

Signs in with OAuth

Availability depends on your ChatGPT account and workspace policy. ChatGPT's custom MCP connections use OAuth and cannot present your manual API key. See Settings → Agents for current steps and the conditional OpenAI dot path.

Create a custom MCP connection in ChatGPT developer mode, paste this URL and sign in to AutoAdy through OAuth. Choose dynamic client registration (DCR) if prompted.

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

Grok

Signs in with OAuth

Grok web, Grok Build and Grok Bot have different setup flows. These artifacts cover web and Build. Settings → Agents documents the conditional Grok Bot path with official sources; live client sign-in has not been tested here.

On grok.com/connectors, choose New Connector → Custom, paste this URL and complete AutoAdy account sign-in.

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

For Grok Build: add the remote server, authenticate when prompted and check grok mcp doctor autoady.

grok mcp add --transport http autoady https://www.autoady.io/api/mcp

Muse Code

Signs in with OAuth

This configuration is for Meta's Muse Code. It does not establish custom connector support in the personal Muse app. Settings → Agents explains the distinction and links Meta's exact configuration and OAuth documentation.

Add this hosted endpoint to your Muse Code user settings, then run muse mcp login autoady.

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

Merge into ~/.config/muse/settings.json, preserving your settings. Keep one root MCP spelling and start a new Muse Code process after editing.

{
  "schema_version": 1,
  "mcpServers": {
    "autoady": {
      "type": "streamable-http",
      "url": "https://www.autoady.io/api/mcp"
    }
  }
}

Cursor

Needs an API key

Paste into Cursor's MCP settings, then reload the window.

{
  "mcpServers": {
    "autoady": {
      "type": "http",
      "url": "https://www.autoady.io/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}

Replace YOUR_KEY with a key from Settings, API Keys. Keys are shown once and can be revoked at any time.

VS Code

Needs an API key

Paste into your MCP servers settings and reload the window.

{
  "servers": {
    "autoady": {
      "type": "http",
      "url": "https://www.autoady.io/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_KEY"
      }
    }
  }
}

Replace YOUR_KEY with a key from Settings, API Keys. Keys are shown once and can be revoked at any time.

Step by step

How to connect Claude to Meta Ads

  1. 1

    Create an AutoAdy account and connect Meta

    Sign in at autoady.io and connect the Meta ad account you want to manage. AutoAdy holds the Meta token; the connector never sees it.

  2. 2

    Add the connector

    On claude.ai, open Settings, then Connectors, then Add custom connector, and paste https://www.autoady.io/api/mcp. Claude opens an AutoAdy sign-in window and you approve access with OAuth. No key to handle.

  3. 3

    Or paste one line into Claude Code

    claude mcp add --transport http autoady https://www.autoady.io/api/mcp --header "Authorization: Bearer YOUR_KEY", using a key from Settings, API Keys.

  4. 4

    Ask a real question

    Start with "audit my ad account" or "why did my cost per lead go up last week". Run /mcp in Claude Code first if you want to confirm the server is connected.

What it costs

Reading is free. Changing your account is not.

  • 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.
  • 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.
  • Clients with MCP account sign-in can use OAuth without creating a key. Other clients send an AutoAdy key in an Authorization header. Follow the client-specific steps in Settings → Agents.
  • New AutoAdy accounts start a seven-day trial with 50 credits for a $1 setup fee. A card is required for the trial, and cancelling before it ends means the subscription never starts. See pricing.
  • Advertising spend is paid to the ad platform directly and is separate.

The alternatives

What else you could use

AlternativeWhat it isWhere it beats AutoAdyWhere AutoAdy is the better choice
Meta's own Marketing API, wired up yourselfMeta publishes the API this connector calls. A developer can point an assistant straight at it with a personal access token.No third party, no subscription, and every endpoint Meta ships rather than the subset any product chooses to wrap. If you want a field nobody surfaces, this is the only way to get it.Objective-aware counting, a write boundary with previews, an hourly per-account cap, a decision journal and reversibility. A raw API wrapper will happily let a model pause forty ads in a loop.
Exporting CSVs from Ads ManagerDownload a report, attach it to the chat, ask the assistant to read it.Free, works today, and the assistant cannot change anything because it has nothing but a file.The file is stale the moment it is exported, carries no account structure, and the assistant cannot act on what it finds. Half the questions people ask need a second query the CSV does not contain.
A generic MCP wrapper around the Marketing APICommunity servers that expose Meta endpoints as tools, usually with a long-lived token in an environment variable.Self-hosted, free, and you can read the whole source. For a single account and a technical owner that is a reasonable trade.A long-lived Meta token in a config file is the security model. There is no plan gate, no write cap, no journal, no preview, and nothing stops a destructive tool being called on a misread. AutoAdy holds the token server-side and every write goes through one boundary.

We sell one of the options in that table, so the column that cost us something to write is the third one. If a row is wrong or out of date, tell us and we will correct it.

Where AutoAdy falls short here

Limits worth knowing before you connect anything.

  • −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.
  • −There is no undo tool. A change is journalled and reversible from the AutoAdy app or Ads Manager, but the assistant cannot roll it back from the chat.
  • −Campaign creation covers the common shapes, not every Meta object. Advantage+ catalogue campaigns, dynamic product ads and offline conversion imports are not exposed.
  • −Interactive views only render in hosts that implement MCP Apps. Everywhere else the same tools return text, which is complete but less pleasant.
  • −One workspace, one active account at a time. You can target any accessible account per call, but there is no single call that reports across forty accounts.

FAQ

Common questions

What is a Meta Ads MCP server?

An MCP server is a program an AI assistant connects to in order to use tools. A Meta Ads MCP server gives the assistant tools that read and change Facebook and Instagram ad accounts, so you can ask questions and give instructions in the chat instead of working in Ads Manager. AutoAdy's runs remotely at https://www.autoady.io/api/mcp, so there is nothing to install or host.

Do I need an API key?

Not on claude.ai. Adding the connector opens an AutoAdy sign-in window and you approve access with OAuth 2.1. Claude Code, Claude Desktop, Cursor and VS Code use an API key instead, created under Settings, API Keys, and sent as an Authorization Bearer header.

Can the assistant pause my ads without asking?

The seven tools that stop live delivery (the pauses, set_campaign_status and the three archive tools) carry the destructive annotation, so a well-behaved host asks first; archiving also asks for a typed confirmation and cannot be undone through AutoAdy. Beyond that, they require a paid plan, they are capped at 200 account changes per hour, and the kill list has a read-only twin so the full list can be reviewed before anything runs. Every change is journalled with its evidence.

Does my Meta access token go to the assistant?

No. The Meta connection is made once inside AutoAdy. The connector receives a tool call and resolves the per-account token server-side. The assistant only ever sees the result.

Which assistants does it work with?

Anything that speaks MCP over streamable HTTP: claude.ai, Claude Code, Claude Desktop, ChatGPT connectors in developer mode, Cursor, VS Code, Grok and Muse among them. It is one server and one tool catalogue for all of them.

How much does it cost?

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. 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. New AutoAdy accounts start a seven-day trial with 50 credits for a $1 setup fee, which does require a card, and cancelling before it ends means the subscription never starts. Advertising spend is paid to Meta directly and is nothing to do with the subscription.

Try it on your own account

Connect the account, ask your assistant what is wrong with it, and read the evidence behind the answer before anything changes.