Meta Ads

Facebook and Instagram campaign management via Meta Marketing API v25.0

28 tools available

Installation

Claude Desktop

{
  "mcpServers": {
    "hopkin-meta-ads": {
      "url": "https://meta.mcp.hopkin.ai",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

CLI

npm install -g @hopkin/cli
hopkin auth set-key hpk_live_...
hopkin meta ping

Platform Overview

The Meta Ads MCP server enables AI assistants to manage and analyze Meta (Facebook/Instagram) advertising campaigns through the Meta Marketing API v25.0. It provides comprehensive tools for account management, campaign and audience targeting configuration, performance analytics, creative analysis, and pixel health diagnostics — allowing you to automate campaign workflows, retrieve insights at any aggregation level, and debug tracking issues.

Your prompt → Claude + Hopkin → Meta Marketing API v25.0
                                    ↓
                              Campaign Data
                              Performance Metrics  
                              Audience Insights
                              Creative Reports
                              Pixel Health Diagnostics

Common Workflows

Performance Reporting

Get a snapshot of how your campaigns are performing across impressions, clicks, conversions, and return on ad spend.

"What was our total spend, impressions, and ROAS last month?"

Calls meta_ads_get_account_summary with a date range. Returns aggregated account-level metrics in a standardized format for quick overviews without needing to drill down into individual campaigns.

"Show me performance by campaign for January."

Calls meta_ads_get_performance_report with level: 'campaign' and a custom date range. Returns full-funnel metrics (delivery → engagement → conversions → ROAS) broken down by campaign so you can compare which campaigns are driving the most value.

"What are the impressions, clicks, and conversion rate for all active campaigns this week?"

Calls meta_ads_list_campaigns with status filter, then meta_ads_get_insights or meta_ads_get_performance_report at the campaign level for the current week. Returns a table-format response showing each campaign's key metrics side-by-side.

Campaign Management

View, search, and explore the hierarchy of campaigns, ad sets, and individual ads.

"List all my active campaigns"

Calls meta_ads_list_campaigns with status: ['ACTIVE']. Returns paginated list of active campaigns with names, IDs, statuses, budgets, and recent change history.

"Find ad sets in campaign ABC123 that are paused"

Calls meta_ads_list_adsets with campaign_id: 'ABC123' and status: ['PAUSED']. Returns ad sets filtered by that campaign with pagination, search capability, and optional metrics if include_assets: true.

"Get all ads in ad set XYZ with their creative assets and landing pages"

Calls meta_ads_list_ads with adset_id: 'XYZ' and include_assets: true. Response includes resolved creative media URLs (images, videos) plus a summary section listing all unique landing page URLs found in those ads — ideal for quickly auditing destination URLs without reading every ad individually.

Audience & Creative Analysis

Analyze demographic performance and compare which creative variants are driving engagement.

"Break down our last week's performance by age and gender"

Calls meta_ads_get_insights with date_preset: 'last_7d', level: 'account', and breakdowns: ['age', 'gender']. Returns demographic slice of performance metrics showing which age/gender groups have the highest CTR, conversion rate, and ROAS.

"Show creative performance for all ads, aggregated by creative name"

Calls meta_ads_get_ad_creative_report with level: 'ad_name' and a date range. Returns creative variants grouped by name with full-funnel metrics, highest spend first; each group includes a representative ad_id that can be passed to meta_ads_preview_ads to visually inspect that creative. Rows are compact by default (per-type costs are spend ÷ count; pass full_detail: true to include them), and large reports come back one page at a time: follow nextCursor to see every creative.

"Which video ads have the highest video completion rate?"

Calls meta_ads_get_insights with level: 'ad', fields: ['video_p25_watched_actions', 'video_p50_watched_actions', 'video_p75_watched_actions', 'video_p100_watched_actions'], and a date range. Returns per-ad video completion funnel showing what percentage of viewers watched 25%, 50%, 75%, and 100% of each video.

Budget & Spend Monitoring

Keep tabs on spending and campaign pacing.

"How much have we spent this month across all campaigns?"

Calls meta_ads_get_account_summary with the current month's date range. Returns account-level spend, impressions, clicks, and conversions in one call.

"Show daily spend trend for the past week"

Calls meta_ads_get_performance_report with time_increment: 1 (daily), date_preset: 'last_7d'. Returns spend broken down day-by-day, ideal for spotting anomalies or tracking pacing toward daily/monthly budgets.

Recipes

"I suspect a tracking issue is tanking our ROAS. Check our pixel health first."

Calls meta_ads_get_pixel_health to retrieve pixel metadata, CAPI connection status, event volume, automatic matching config, and diagnostic checks (including event match quality). If CAPI is not connected or event volume is low, tracking is the problem — not campaign performance. This is the essential diagnostic tool before investigating campaign-level metrics.

"Show me the top 3 performing creatives by ROAS this month, with a visual preview of each."

Calls meta_ads_get_ad_creative_report with level: 'ad_id' (ROAS is reported per ad; ad_name rows omit it) and follows nextCursor until every ad is in, since rows come back ranked by spend, not ROAS. Ranks the ads by purchase_roas and keeps the top 3, then calls meta_ads_preview_ads with those ad IDs and includes ROAS as a metric label. Returns visual previews of the creative images/videos alongside the ROAS figure so you can visually compare winners.

"List all paused campaigns, show me their recent change history, and tell me who paused them."

Calls meta_ads_list_campaigns with status: ['PAUSED']. For each campaign ID, calls meta_ads_get_activities with entity_id: <campaign_id> and entity_type: 'CAMPAIGN'. Aggregates the activity logs to show when each campaign was paused and by whom (from the activity record).

"Find underperforming ad sets (low ROAS) within my top-spend campaign and show me their demographic breakdowns."

Calls meta_ads_get_performance_report with level: 'adset', filtered to the top-spend campaign. Identifies ad sets with ROAS below a threshold. For each, calls meta_ads_get_insights with breakdowns: ['age', 'gender'] to find demographic segments (e.g., women 35-44) that are underperforming — useful for tightening audience targeting.

"I need to audit all landing pages being used across active ads. Give me a categorized summary."

Calls meta_ads_list_ads with status: ['ACTIVE'] and include_assets: true. The markdown response includes a "Landing Page URLs" summary section listing all unique destination URLs. Group those by domain (e.g., homepage vs. product pages) to identify which landing pages are live and used by active ads.

"Show me a 90-day performance trend by publisher (Instagram vs. Facebook) to decide where to shift budget."

Calls meta_ads_get_insights with date_preset: 'last_90d', breakdowns: ['publisher_platform'], and optional time_increment: 7 for weekly aggregation. Returns 90-day performance sliced by Instagram, Facebook, Audience Network, etc., so you can see which platform is most efficient and recommend budget reallocation.

Tips

Date Presets vs. Custom Ranges: Use date_preset for standard lookbacks (e.g., last_7d, last_30d, last_quarter) for faster responses. For precise custom ranges, use time_range: { since: '2026-01-01', until: '2026-01-31' }. Both meta_ads_get_insights and meta_ads_get_performance_report support both modes.

Breakdowns Available: Demographic (age, gender, country), device/platform (device_platform, publisher_platform, platform_position), time-based (hourly_stats_aggregated_by_advertiser_time_zone for intra-day analysis), and creative assets (ad_format_asset, video_asset, image_asset, etc.). Not all breakdowns are available at all levels — try the combination first; if unsupported, the API will return an error with guidance.

Cache-First Behavior: List tools (meta_ads_list_campaigns, meta_ads_list_ad_accounts, etc.) return cached data by default with a cached: boolean flag and synced_at timestamp. For real-time data, pass refresh: true. Reporting tools (meta_ads_get_performance_report, meta_ads_get_insights) always fetch fresh data — no caching applies.

Landing Pages in Ad List: When calling meta_ads_list_ads with include_assets: true, the markdown response automatically includes a "Landing Page URLs" summary at the end listing all unique destination URLs found across the ads — saves you from parsing individual ad objects to audit where traffic is going.

Tools

account-summary

meta_ads_get_account_summary Get Meta Ads Account Summary

Read-onlyIdempotent

Standardized account-level performance summary for cross-platform comparison. Normalized format identical to google_ads_get_account_summary. Includes conversion_detail breakdown from both Meta actions and conversions arrays. Preferred over get_insights or get_performance_report for quick account-level overviews. Always fetches fresh data.

ParameterTypeDescription
account_id requiredstringMeta ad account ID
reason requiredstringWhy this tool call is needed
3 optional parameters
ParameterTypeDescription
date_presetstringPredefined date range (e.g., last_7d, last_30d, this_month)
time_rangeobjectCustom date range {since, until} in YYYY-MM-DD
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

activities

meta_ads_get_activities Get Meta Ads Activities

Read-onlyIdempotentOpen-world

Retrieve change history (who changed what, and when) for a Meta ad account, or for one campaign, ad set or ad. Hopkin records Meta's activity log continuously and keeps it for 25 months, backfilling up to two years when an account is first synced, so start_date can reach well past the last 7 days. Check coverage.complete_from: if the requested window starts earlier, coverage.note says so — no events before that date does not mean nothing changed. An account synced more than 15 minutes ago is refreshed from Meta first; refresh=true forces it. Dates are UTC and end_date includes the whole day. Paginated: when nextCursor is present, call again with the same parameters plus cursor=<nextCursor>.

ParameterTypeDescription
account_id requiredstringThe ad account ID (with or without act_ prefix)
reason requiredstringWhy this tool call is needed
8 optional parameters
ParameterTypeDescription
entity_idstringFilter to one campaign, ad set or ad ID. With no start_date, the entity's full recorded history is searched (up to two years).
entity_typestringFilter to one level: ACCOUNT, CAMPAIGN, AD_SET or AD.
start_datestringStart date, YYYY-MM-DD (UTC). Defaults to 7 days ago. Any date within the recorded history works; check coverage.complete_from.
end_datestringEnd date, YYYY-MM-DD (UTC), inclusive of the whole day. Defaults to today.
limitintegerNumber of activities per page (default: 20, max: 100)
cursorstringPagination cursor from the previous response; pass it with otherwise identical parameters.
refreshbooleanSync this account from Meta before reading, even if it was synced in the last 15 minutes. Defaults to false.
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

ad-accounts

meta_ads_list_ad_accounts List Meta Ad Accounts

Read-onlyOpen-world

List Meta ad accounts with search, status filtering, single/multi-account lookup by ID, and pagination. Cached by default; pass refresh=true for latest data. Entities may optionally include recent activities.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
9 optional parameters
ParameterTypeDescription
refreshbooleanForce fresh data from Meta API instead of using cache. Defaults to false (cache-first). Only set to true when you need real-time data.
cursorstringPagination cursor from previous response
searchstringSearch ad accounts by name (case-insensitive partial match)
account_idstringFilter by exact account ID (without act_ prefix)
account_idsarrayGet multiple accounts by ID. Mutually exclusive with account_id. When provided, ignores other filters/pagination.
statusintegerAccount status code (1=Active, 2=Disabled, etc.)
limitintegerNumber of accounts per page (default: 20, max: 100)
include_activitiesbooleanInclude recent activity log (last 7 days of changes) for each entity
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

reporting

meta_ads_get_ad_creative_report Get Meta Ads Creative Performance Report

Read-onlyIdempotent

Ad-level performance report with full funnel metrics, including video funnel (ThruPlays, 25/50/75/95/100% completions, avg watch time) for video creatives. All conversion types shown individually. Supports two grouping modes: ad_name (default, aggregates ads sharing the same name with a representative ad_id for preview) and ad_id (one row per ad). The representative ad_id can be passed to meta_ads_preview_ads. Rows come back highest spend first. Rows are compact by default: they leave out the per-type cost arrays (cost_per_action_type, cost_per_conversion, cost_per_thruplay), each of which is spend divided by that type's count. Pass full_detail: true to include them. Creative media (asset_type, asset_url, thumbnail_url) is listed once per ad under assets, keyed by each row's ad_id. Each response is one page of at most 50,000 characters, or limit rows if set. When more rows remain it returns nextCursor: pass it as cursor to get the next page, and repeat until nextCursor is absent to walk every row, compact or full detail. Reads up to 2,000 ad-level rows from Meta. truncated is true whenever a response does not hold every row, and truncation gives the reasons, total_rows, returned_rows, remaining_rows and remaining_spend. The reasons are response_size or limit (more pages remain), row_limit (Meta had more rows than the tool reads; no cursor reaches them, unread_spend gives their approximate spend, and ad_name totals may be low, so narrow by campaign, ad set or ad, shorten time_range, or drop time_increment or breakdowns) and report_changed (live numbers moved rows across a page boundary between calls, so rows may be missing or repeated across pages; call again without cursor for a consistent set). A call without cursor always reads the report fresh from Meta; cursor pages served by the same server instance reuse that read for up to 15 minutes, and a page served elsewhere reads Meta again (report_changed flags any rows that moved).

ParameterTypeDescription
account_id requiredstringMeta ad account ID
time_range requiredobjectRequired date range {since, until} in YYYY-MM-DD
reason requiredstringWhy this tool call is needed
8 optional parameters
ParameterTypeDescription
levelstringGrouping level: ad_name (default, aggregate ads sharing the same name, providing a representative ad_id that can be passed to meta_ads_preview_ads) or ad_id (one row per ad)
time_incrementobjectTime grouping: 1=daily, 7=weekly, or "monthly"
breakdownsarraySegment by dimension. Pass multiple values for cross-tabulated rows (e.g. ["age","gender"] → one row per "35-44 / female" segment). Available: age, gender, country, region, device_platform, publisher_platform, platform_position, impression_device, dma. Note: `platform_position` is always paired with `publisher_platform` (Meta requires both; added automatically if omitted).
filteringarrayFilters as [{field, operator, value}]
full_detailbooleanRows are compact by default: they leave out the per-type cost arrays (cost_per_action_type, cost_per_conversion, cost_per_thruplay), each of which is spend divided by that type's count. Pass true to include them. Full-detail rows are about twice as large, so each page holds about half as many.
limitintegerMaximum rows per page (max 500). A page also ends when the response reaches its size limit.
cursorstringnextCursor from the previous response, to get the next page of rows
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

meta_ads_get_performance_report Get Meta Ads Performance Report

Read-onlyIdempotent

Full impression-to-conversion funnel report with delivery, engagement, actions, conversions, ROAS, and quality rankings. Supports breakdowns by device (impression_device), demographics (age, gender), geography (country, region, dma), and platform (device_platform, publisher_platform, platform_position). For Sales-objective campaigns (Advantage+ sales), supports \

ParameterTypeDescription
account_id requiredstringMeta ad account ID
time_range requiredobjectRequired date range {since, until} in YYYY-MM-DD
reason requiredstringWhy this tool call is needed
8 optional parameters
ParameterTypeDescription
time_incrementobjectTime grouping: 1=daily, 7=weekly, or "monthly"
levelstringAggregation level (default: account): account, campaign, adset, ad
breakdownsarrayDimensions to segment data by. Pass multiple values in a single call to get cross-tabulated rows (e.g. ["age","gender"] → one row per "35-44 / female" segment). Do NOT make separate calls for each dimension. Available: age, gender, country, region, device_platform, publisher_platform, platform_position, impression_device, dma, user_segment_key. Note: `platform_position` is always paired with `publisher_platform` (Meta requires both; added automatically if omitted). Note: `user_segment_key` is Meta's "Audience Segments" breakdown for Sales-objective campaigns (Advantage+ sales; the legacy Advantage+ Shopping flow was retired in v24). Returned values: prospecting, engaged, existing, unknown (lowercase); everything is `unknown` when the ad account has no audience segments defined. Cross-tabulation with demographic breakdowns like age is rejected by Meta's API — combine with country if needed; use separate calls for demographic splits.
filteringarrayFilters as [{field, operator, value}]
action_attribution_windowsarrayAttribution windows for action/conversion metrics. When omitted, each action has a single `value` counted under its ad set's own attribution_setting, as in Ads Manager (this report does not return the setting; call meta_ads_get_insights with fields: ["attribution_setting"] to see it). Listing windows adds one key per window to each action, e.g. ["7d_click"] for 7-day click only. Available: 1d_click, 7d_click, 28d_click, 1d_view, 1d_ev, default. 7d_view and 28d_view were removed by Meta on 2026-01-12: still accepted, but Meta returns no key for them.
limitintegerMaximum number of rows per page (default: 100, max: 500)
cursorstringPagination cursor from previous response
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

search-ad-library

meta_ads_search_ad_library Search Meta Ad Library

Read-onlyIdempotentOpen-world

Search the Meta Ad Library for ads from any advertiser. Returns real creative content — ad copy (primary text, headline, description, CTA), landing URLs, run dates, platforms, and media source/mirrored URLs. Served from Hopkin's scraped ad-library corpus, results under \

ParameterTypeDescription
ad_reached_countries requiredarrayREQUIRED. ISO-3166-1 alpha-2 country codes (e.g. ["US", "GB"] — use "GB" not "UK") or ["ALL"]. Warning: ["ALL"] may return very large result sets — use with small limit values.
reason requiredstringWhy this tool call is needed
13 optional parameters
ParameterTypeDescription
search_termsstringKeywords to search for in ad content. Spaces act as AND. Use the language the ad is written in.
search_typestringSearch mode: KEYWORD_UNORDERED (default, any order) or KEYWORD_EXACT_PHRASE
search_page_idsarrayFilter by up to 10 Facebook Page IDs. Use this for competitor/brand lookups.
ad_typestringFilter by ad category. Default: ALL
ad_active_statusstringFilter by delivery status. Default: ACTIVE
ad_delivery_date_minstringMinimum delivery date (YYYY-MM-DD)
ad_delivery_date_maxstringMaximum delivery date (YYYY-MM-DD)
media_typestringFilter by media type
publisher_platformsarrayFilter by platform(s)
languagesarrayFilter by language (ISO 639-1 codes)
limitintegerResults per page (default: 25, max: 50). Note: 200 calls/hour rate limit — use larger pages to conserve quota.
cursorstringPagination cursor from previous response
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

ads

meta_ads_preview_ads Preview Meta AdsMCP App

Read-onlyIdempotent

Interactive UI for displaying Meta ad previews with creative content and metrics

ParameterTypeDescription
account_id requiredstringThe ad account ID
ads requiredarrayAds to preview (1-20)
reason requiredstringWhy this tool call is needed
2 optional parameters
ParameterTypeDescription
metric_labelsobjectDisplay labels for metric keys
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

meta_ads_list_ads List Meta Ads

Read-onlyIdempotentOpen-world

List ads for a Meta ad account with ad set filtering, status, name search, single/multi-ad lookup by ID, and pagination. Each ad includes a Landing URL when available (extracted from object_story_spec, link_url, or asset_feed_spec depending on ad format) and a URL Tags line exposing the ad's tracking-template string — the URL parameters (UTMs / custom click-tracking) Meta appends to the destination URL at click time, with {{macro}} placeholders preserved verbatim. The URL tags are the creative's url_tags (the Ads Manager "URL parameters"; the Ad node itself has no url_tags field), falling back to the creative's template specs (template_data, template_url_spec query_template) when it is empty. A "Landing Page URLs" summary lists every unique destination URL; a "URL Tags Audit" summary lists the distinct templates in use and names every ad with a destination URL but no tracking template — use these to audit UTM coverage across an account without reading every ad. Set include_assets=true to include resolved creative media URLs (adds latency for cache misses). Entities may optionally include recent activities, and optionally automated rules (set include_rules=true to see which rules affect each ad).

ParameterTypeDescription
account_id requiredstringThe ad account ID (with or without act_ prefix)
reason requiredstringWhy this tool call is needed
13 optional parameters
ParameterTypeDescription
ad_idstringGet a specific ad by ID. When provided, returns only that ad and ignores other filters/pagination.
ad_idsarrayGet multiple ads by ID. Mutually exclusive with ad_id. When provided, ignores other filters/pagination.
adset_idstringFilter by ad set ID
searchstringSearch ads by name (case-insensitive partial match)
statusarrayFilter by configured ad status (user-set): ACTIVE, PAUSED, DELETED, ARCHIVED
effective_statusarrayFilter by Meta-computed serving status: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES, CAMPAIGN_PAUSED, ADSET_PAUSED, DISAPPROVED, PENDING_REVIEW, PENDING_BILLING_INFO, PREAPPROVED
limitintegerNumber of ads per page (default: 20, max: 100)
cursorstringPagination cursor from previous response
refreshbooleanForce fresh data from Meta API instead of using cache. Defaults to false (cache-first). Only set to true when you need real-time data.
include_activitiesbooleanInclude recent activity log (last 7 days of changes) for each entity
include_assetsbooleanInclude resolved creative asset URLs (asset_url, thumbnail_url, asset_type) for each ad. Uses cached GCS URLs when available.
include_rulesbooleanInclude automated rules (from adrules_library) that affect each entity
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

adsets

meta_ads_list_adsets List Meta Ad Sets

Read-onlyIdempotentOpen-world

List ad sets for a Meta ad account with campaign filtering, status, name search, single/multi-adset lookup by ID, and pagination. Entities may optionally include recent activities, and optionally automated rules (set include_rules=true to see which rules affect each ad set).

ParameterTypeDescription
account_id requiredstringThe ad account ID (with or without act_ prefix)
reason requiredstringWhy this tool call is needed
12 optional parameters
ParameterTypeDescription
adset_idstringGet a specific ad set by ID. When provided, returns only that ad set and ignores other filters/pagination.
adset_idsarrayGet multiple ad sets by ID. Mutually exclusive with adset_id. When provided, ignores other filters/pagination.
campaign_idstringFilter by campaign ID
searchstringSearch ad sets by name (case-insensitive partial match)
statusarrayFilter by configured ad-set status (user-set): ACTIVE, PAUSED, DELETED, ARCHIVED
effective_statusarrayFilter by Meta-computed serving status: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES, CAMPAIGN_PAUSED
limitintegerNumber of ad sets per page (default: 20, max: 100)
cursorstringPagination cursor from previous response
refreshbooleanForce fresh data from Meta API instead of using cache. Defaults to false (cache-first). Only set to true when you need real-time data.
include_activitiesbooleanInclude recent activity log (last 7 days of changes) for each entity
include_rulesbooleanInclude automated rules (from adrules_library) that affect each entity
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

auth

meta_ads_check_auth_status Check Meta Ads Authentication Status

Read-onlyIdempotent

Troubleshoot authentication issues and get user profile info. Only use this tool when another tool fails with a permission or authentication error — do NOT call proactively.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

meta_ads_ping Ping Meta Ads MCP Server

Read-onlyIdempotent

Health check for the Meta Ads MCP server.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
1 optional parameter
ParameterTypeDescription
messagestringOptional message to echo back
View full documentation →

campaigns

meta_ads_list_campaigns List Meta Ad Campaigns

Read-onlyIdempotentOpen-world

List campaigns for a Meta ad account with status filtering, name search, single/multi-campaign lookup by ID, and pagination. Entities may optionally include recent activities, and optionally automated rules (set include_rules=true to see which rules affect each campaign).

ParameterTypeDescription
account_id requiredstringThe ad account ID (with or without act_ prefix)
reason requiredstringWhy this tool call is needed
11 optional parameters
ParameterTypeDescription
statusarrayFilter by configured campaign status (user-set): ACTIVE, PAUSED, DELETED, ARCHIVED
effective_statusarrayFilter by Meta-computed serving status: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES
limitintegerNumber of campaigns per page (default: 20, max: 100)
cursorstringPagination cursor from previous response
refreshbooleanForce fresh data from Meta API instead of using cache. Defaults to false (cache-first). Only set to true when you need real-time data.
campaign_idstringGet a specific campaign by ID. When provided, returns only that campaign and ignores other filters/pagination.
campaign_idsarrayGet multiple campaigns by ID. Mutually exclusive with campaign_id. When provided, ignores other filters/pagination.
searchstringSearch campaigns by name (case-insensitive partial match)
include_activitiesbooleanInclude recent activity log (last 7 days of changes) for each entity
include_rulesbooleanInclude automated rules (from adrules_library) that affect each entity
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

chart

meta_ads_render_chart Render ChartMCP App

Read-onlyIdempotent

Interactive UI for rendering data visualizations (bar, scatter, timeseries, funnel, waterfall, choropleth)

bar scatter timeseries funnel waterfall choropleth
ParameterTypeDescription
reason requiredstringBrief explanation of why you are rendering this chart
chart requiredobjectChart configuration. Supported types: bar, scatter, timeseries, funnel, waterfall, choropleth.
View full documentation →

competitor-ads

meta_ads_list_competitor_ads List Competitor Ads

Read-onlyIdempotent

List a competitor's ads from the scraped Meta Ad Library corpus — real creative content (copy, CTA, landing URL, media metadata), not just snapshot links. Filter by active_only (still running), display_format (image, video, carousel, text), since (seen on/after a date), and search (full-text over ad copy). Requires no Meta connection — the corpus is maintained by Hopkin's daily scrape of tracked advertisers. Get advertiser IDs from meta_ads_list_tracked_competitors or meta_ads_track_competitor.

ParameterTypeDescription
advertiser_id requiredstringThe advertiser ID from meta_ads_list_tracked_competitors or meta_ads_track_competitor
reason requiredstringWhy this tool call is needed
6 optional parameters
ParameterTypeDescription
active_onlybooleanOnly ads still running (no stopped_running_at)
display_formatstringFilter by creative format as Meta labels it (case-insensitive). Observed values: image, video, carousel, multi_images, dco, dpa. dco and dpa are Meta's dynamic formats (dynamic creative and catalog/advantage+ ads) and are the most common in the corpus.
sincestringOnly ads seen on or after this ISO date/timestamp (e.g. 2026-07-01)
searchstringCase-insensitive search over ad copy (primary text, headline, description)
limitintegerNumber of ads per page (default: 20, max: 100)
cursorstringPagination cursor from previous response
View full documentation →

competitor-ad

meta_ads_get_competitor_ad Get Competitor Ad

Read-onlyIdempotent

Fetch one competitor ad in full detail from the scraped corpus and SEE the creative: complete copy (headline, primary text, description, CTA), landing URL, run dates, and every media asset. Mirrored images and video thumbnails are returned inline as image content blocks. For videos, pass include_frames to inline extracted frames (capped at ~40 images; window with start/end seconds and stride) — short-TTL signed URLs for EVERY frame, the audio track, and each original are always in structuredContent, along with frame_count/frame_fps (duration ≈ frame_count / frame_fps), the voiceover transcript, and the audio analysis. Media not yet mirrored or processed degrades to source URLs with a note. Requires no Meta connection. Get ad IDs from meta_ads_list_competitor_ads.

ParameterTypeDescription
ad_id requiredstringThe library ad ID from meta_ads_list_competitor_ads
reason requiredstringWhy this tool call is needed
4 optional parameters
ParameterTypeDescription
include_framesbooleanInclude extracted video frames as image content blocks (default: false)
strideintegerReturn every Nth extracted frame. Defaults to a context-safe stride capping frames at ~40 images.
startnumberOnly frames at or after this offset into the video, in seconds
endnumberOnly frames at or before this offset into the video, in seconds
View full documentation →

track-competitor

meta_ads_track_competitor Track Competitor

Idempotent

Register a Meta advertiser for daily ad-library tracking. Provide exactly one identifier: page_id (numeric Facebook Page ID — most precise), page_url (a facebook.com page URL; numeric IDs resolve directly, vanity handles resolve by searching scraped advertisers), or name (searches scraped advertisers). A search resolving to exactly one advertiser tracks it; multiple matches return a candidate list (name, page_id, ad count) and track NOTHING — retry with page_id; zero matches return an error suggesting the page URL. Once tracked, the daily sweep scrapes the advertiser's ads into the corpus for meta_ads_list_competitor_ads. Requires no Meta connection.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
3 optional parameters
ParameterTypeDescription
page_idstringNumeric Facebook Page ID of the advertiser (most precise identifier). A non-numeric value is treated as a handle/name search over scraped advertisers.
page_urlstringFacebook Page URL, e.g. https://www.facebook.com/nike, https://www.facebook.com/profile.php?id=15087023444, or an Ad Library URL with view_all_page_id. Numeric IDs resolve exactly; vanity handles resolve by searching scraped advertisers.
namestringAdvertiser name to search for among scraped advertisers, e.g. "Nike". Exactly one match is tracked; multiple matches return candidates and track nothing.
View full documentation →

untrack-competitor

meta_ads_untrack_competitor Untrack Competitor

DestructiveIdempotent

Stop tracking a Meta advertiser. Removes only your tracking registration — the shared ad corpus is untouched, and untracking an advertiser that was never tracked succeeds with removed: false. Get advertiser IDs from meta_ads_list_tracked_competitors.

ParameterTypeDescription
advertiser_id requiredstringThe advertiser ID from meta_ads_list_tracked_competitors
reason requiredstringWhy this tool call is needed
View full documentation →

tracked-competitors

meta_ads_list_tracked_competitors List Tracked Competitors

Read-onlyIdempotent

List the Meta advertisers you are tracking: advertiser name, page ID, when tracking started, last scrape time and status, and the ad count in the corpus for each. Scrape health is flagged per row — advertisers with no successful scrape in the last 48 hours are marked stale, and a non-ok scrape status (blocked, schema_error, empty) carries an explicit scrape_warning; treat flagged rows' corpus data as possibly out of date. Use the returned advertiser IDs with meta_ads_list_competitor_ads to browse their ads. Requires no Meta connection.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
2 optional parameters
ParameterTypeDescription
limitintegerNumber of tracked competitors per page (default: 20, max: 100)
cursorstringPagination cursor from previous response
View full documentation →

connections

meta_ads_list_connections List Meta Connections

Read-onlyIdempotent

List the Meta Ads connections available to you — both ones you own and ones shared with you via an organization. Use this to discover connection IDs for set_default / share / rename / revoke.

ParameterTypeDescription
reason requiredstringWhy this tool call is needed
View full documentation →

set-default-connection

meta_ads_set_default_connection Set Default Meta Connection

Idempotent

Set the Meta connection that should be used by default for subsequent Meta Ads tool calls. The default is scoped to the calling actor (your user account, or the API key being used).

ParameterTypeDescription
connection_id requiredstringUUID of the connection to mark as the actor's default Meta connection.
reason requiredstringWhy this tool call is needed
View full documentation →

share-connection

meta_ads_share_connection Share Meta Connection With Organization

Idempotent

Share an owned Meta connection with all members of your organization, so teammates can use it without having to reconnect Meta themselves. You must be the owner of the connection.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to share with your organization. You must be the owner.
reason requiredstringWhy this tool call is needed
View full documentation →

unshare-connection

meta_ads_unshare_connection Unshare Meta Connection From Organization

DestructiveIdempotent

Stop sharing an owned Meta connection with your organization. Teammates lose access immediately. You must be the owner.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to stop sharing with your organization. You must be the owner.
reason requiredstringWhy this tool call is needed
View full documentation →

rename-connection

meta_ads_rename_connection Rename Meta Connection

Idempotent

Rename the display name of an owned Meta connection. The OAuth grant and underlying account are unaffected — this only changes the human-readable label. You must be the owner.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to rename. You must be the owner.
display_name requiredstringNew human-readable name for the connection.
reason requiredstringWhy this tool call is needed
View full documentation →

revoke-connection

meta_ads_revoke_connection Revoke Meta Connection

DestructiveIdempotent

Revoke (soft-delete) an owned Meta connection. Any defaults pointing to it are invalidated and shared org members lose access. The OAuth grant at Meta is NOT revoked by this tool — the user must disconnect via the dashboard if they want to fully revoke at Meta. You must be the owner.

ParameterTypeDescription
connection_id requiredstringUUID of the connection to revoke. You must be the owner.
reason requiredstringWhy this tool call is needed
View full documentation →

custom-conversions

meta_ads_list_custom_conversions List Meta Custom Conversions

Read-onlyIdempotentOpen-world

List custom conversion definitions for a Meta ad account, including ID, name, custom_event_type, event_source_id, rule JSON, retention_days, default_conversion_value, and description. Use this to inspect tracking setup and understand URL/event matching rules behind conversions such as offsite_conversion.fb_pixel_custom.*.

ParameterTypeDescription
account_id requiredstringThe ad account ID (with or without act_ prefix)
reason requiredstringWhy this tool call is needed
3 optional parameters
ParameterTypeDescription
limitintegerCustom conversions per page (default: 100, max: 100)
cursorstringPagination cursor from previous response
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

feedback

meta_ads_developer_feedback Submit Developer Feedback

IdempotentOpen-world

Submit feedback about missing tools, improvements, bugs, or workflow gaps in the MCP toolset. Not for user-facing issues like auth or API errors.

ParameterTypeDescription
feedback_type requiredstringFeedback category: new_tool (request new capability), improvement (enhance existing tool), bug (report issue), workflow_gap (missing workflow)
title requiredstringConcise title summarizing the feedback
description requiredstringWhat is needed and why
reason requiredstringWhy this tool call is needed
3 optional parameters
ParameterTypeDescription
current_workaroundstringCurrent workaround, if any
prioritystringImpact level: low (nice-to-have), medium (improves workflow), high (blocking issue)
interfacestringInterface the feedback originated from: MCP (default) or CLI
View full documentation →

insights

meta_ads_get_insights Get Meta Ads Insights

Read-onlyIdempotent

Retrieve performance metrics from Meta Ads with date presets/custom ranges, time grouping, entity-level aggregation, dimensional breakdowns, and filtering. Always fetches fresh data. Provide date_preset or time_range. For standard full-funnel analysis, prefer meta_ads_get_performance_report; use this for custom fields, hourly/creative-asset breakdowns, video metrics, or the \

ParameterTypeDescription
account_id requiredstringMeta ad account ID
reason requiredstringWhy this tool call is needed
12 optional parameters
ParameterTypeDescription
date_presetstringPredefined date range: today, yesterday, last_3d, last_7d, last_14d, last_28d, last_30d, last_90d, this_month, last_month, this_quarter, last_quarter, this_year, last_year, lifetime, maximum
time_rangeobjectCustom date range {since, until} in YYYY-MM-DD
time_incrementobjectTime grouping: 1=daily, 7=weekly, or "monthly"
levelstringAggregation level: account, campaign, adset, ad
fieldsarrayMetrics to retrieve (defaults to standard set)
breakdownsarrayDimensions to segment data by. Pass multiple values in a single call to get cross-tabulated rows (e.g. ["age","gender"] → one row per "35-44 / female" segment). Do NOT make separate calls for each dimension. Available: age, gender, country, region, dma, device_platform, publisher_platform, platform_position, impression_device, frequency_value, place_page_id, product_id, ad_format_asset, body_asset, call_to_action_asset, description_asset, image_asset, link_url_asset, title_asset, video_asset, user_segment_key. Note: `platform_position` is always paired with `publisher_platform` (Meta requires both; added automatically if omitted). Note: `frequency_value` is compatible only with `fields: ["reach"]` and cannot be combined with other breakdowns or with action_breakdowns; the tool rejects incompatible calls. Note: `user_segment_key` is Meta's "Audience Segments" breakdown for Sales-objective campaigns (Advantage+ sales; the legacy Advantage+ Shopping flow was retired in v24). Returned values: prospecting, engaged, existing, unknown (lowercase); everything is `unknown` when the ad account has no audience segments defined. Cross-tabulation with demographic breakdowns like age is rejected by Meta's API — combine with country if needed; use separate calls for demographic splits.
action_breakdownsarrayAction breakdown dimensions: action_type, action_target_id, action_destination, action_reaction, action_video_sound, action_video_type, action_carousel_card_id, action_carousel_card_name
filteringarrayFilters as [{field, operator, value}]
action_attribution_windowsarrayAttribution windows for action/conversion metrics. When omitted, each action has a single `value` counted under its ad set's own attribution_setting, as in Ads Manager (add `attribution_setting` to fields to see it). Listing windows adds one key per window to each action, e.g. ["7d_click"] for 7-day click only. Available: 1d_click, 7d_click, 28d_click, 1d_view, 1d_ev, default. 7d_view and 28d_view were removed by Meta on 2026-01-12: still accepted, but Meta returns no key for them.
limitintegerMaximum number of rows per page (default: 100, max: 500)
cursorstringPagination cursor from previous response
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →

pixel-health

meta_ads_get_pixel_health Get Meta Pixel Health

Read-onlyIdempotent

Comprehensive pixel health check: metadata, CAPI connection status, event volume stats, automatic matching config, and diagnostic checks (including event match quality indicators). capi.connected is true when an active CAPI Gateway config exists or server events were observed in the lookback window (capi.server_event_count), false when both signals were readable and showed neither, and "unknown" when the signals could not be read — NEVER report CAPI as disconnected when it is "unknown"; tell the user to verify in Meta Events Manager instead. Use this to diagnose tracking issues before analyzing ad performance — low ROAS could be a tracking problem, not a campaign problem. When event_stats_status is "permission_denied", surface event_stats_message to the user — the rest of the pixel health audit is still valid.

ParameterTypeDescription
account_id requiredstringThe ad account ID (with or without act_ prefix)
reason requiredstringWhy this tool call is needed
6 optional parameters
ParameterTypeDescription
pixel_idstringSpecific pixel ID to check. If omitted, checks all pixels on the account.
event_namesarrayFilter event stats to these event names (e.g. ["Purchase", "Lead"])
days_backintegerNumber of days of event stats to include (default: 28, max: 90)
limitintegerMax pixels per page (default: 5, max: 20)
cursorstringPagination cursor from previous response
connection_idstringOptional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.
View full documentation →