Meta Ads MCP Server
Self-hosted MCP server providing secure, multi-tenant access to Meta Marketing API for managing Facebook and Instagram Ads via AI agents, with OAuth, encrypted tokens, and compliance features
Detailed security scan evidence is not public for this MCP yet. Public identity, registry metadata, and independently observed protocol inventory remain available.
Install and connect
Installation and connection instructions are shown only when supported by retained package, repository, or endpoint evidence.
No verified installation or connection method is available in the retained evidence yet.
Identity
| Canonical slug | meta-ads-mcp-server-ccc0d196 | Deployment | Hybrid |
|---|---|---|---|
| Canonical package | — | Repository | byadsco/meta-ads-mcp |
| First published | — | Latest release | — |
| Last security verification | — | Classification confidence | 35% |
| Publication | Draft | Official distribution | Not verified |
Distributions
| Channel | Identifier | Current version | Versions | Source |
|---|---|---|---|---|
| source_git | byadsco/meta-ads-mcp | 7cbb099f37412c4b63b187e95c80a20d2bbd637e | 1 | Repository |
Current release
| Package | Version | Published / observed | Inventory | Security scan |
|---|---|---|---|---|
| source_gitbyadsco/meta-ads-mcp | 7cbb099f37412c4b63b187e95c80a20d2bbd637eCurrent | Aug 25, 2026 | 135 toolsSucceeded · 0 resources · 0 prompts | Evidence restricted |
Continuously monitor this MCP for security risk
Independently scan the exact version your agents use, receive alerts when its risk changes, and investigate every finding with retained version evidence.
- Independent exact-version security scans
- Continuous release and vulnerability monitoring
- Risk-change alerts with capability context
- Historical evidence and API exports
Current version evidence
No public current-version evidence is available yet.
Current protocol inventory
Tools 135
| Tool | Category | Annotations | Risk |
|---|---|---|---|
ads_activate_entity⚠️ Modifies live ads/account data. Toggle the status of a campaign, ad set, or ad. Use status='ACTIVE' to start delivery, 'PAUSED' to stop, 'ARCHIVED' to retire. For deletion use ads_delete_campaign / ads_delete_ad_set / ads_delete_ad. Mirrors the official Meta MCP vocabulary.Input schema{
"type": "object",
"properties": {
"entity_type": {
"type": "string",
"enum": [
"campaign",
"ad_set",
"ad"
]
},
"entity_id": {
"type": "string",
"description": "ID of the entity"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"ARCHIVED"
],
"description": "New status"
}
},
"required": [
"entity_type",
"entity_id",
"status"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_bulk_create_video_ads⚠️ Modifies live ads/account data. Turn a list of public video URLs into ads in one call: uploads each video, waits for Meta to finish processing, auto-selects a thumbnail, builds the creative, and creates the ad in the given ad set. Ads are created PAUSED by default. Per-video copy overrides the shared defaults. A video rejected by Meta does not abort the rest — every item reports its own outcome and the stage it failed at — but an expired token, rate limit or abuse signal stops the batch immediately, as does the same failure repeating (which means a shared input like page_id or ad_set_id is wrong). The whole call is capped at 180s so it always returns the IDs it created; videos left unprocessed come back marked "skipped", and re-running with only those is safe. Use this instead of chaining ads_upload_ad_video → ads_create_ad_creative → ads_create_ad manually.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"ad_set_id": {
"type": "string",
"description": "Ad set ID that will hold the new ads"
},
"page_id": {
"type": "string",
"description": "Facebook Page ID used as the ad's identity"
},
"instagram_actor_id": {
"type": "string",
"description": "Instagram account ID for IG placements (from ads_get_instagram_account)"
},
"videos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"file_url": {
"type": "string",
"minLength": 1,
"description": "Public https URL of the video file (MP4/MOV)"
},
"ad_name": {
"type": "string",
"minLength": 1,
"description": "Name of the resulting ad. Defaults to the video name, then to 'Video ad N'."
},
"video_name": {
"type": "string",
"minLength": 1,
"description": "Name of the video in the ad account library"
},
"message": {
"type": "string",
"description": "Primary text. Overrides the shared message."
},
"headline": {
"type": "string",
"description": "Headline. Overrides the shared headline."
},
"description": {
"type": "string",
"description": "Description below the headline. Overrides the shared description."
},
"link_url": {
"type": "string",
"minLength": 1,
"description": "Destination URL. Overrides the shared link_url."
},
"call_to_action_type": {
"type": "string",
"enum": [
"LEARN_MORE",
"SIGN_UP",
"DOWNLOAD",
"SUBSCRIBE",
"CONTACT_US",
"APPLY_NOW",
"GET_OFFER",
"GET_QUOTE",
"GET_STARTED",
"OPEN_LINK",
"NO_BUTTON",
"SEE_MORE",
"SHOP_NOW",
"BUY_NOW",
"ORDER_NOW",
"START_ORDER",
"ADD_TO_CART",
"VIEW_PRODUCT",
"BUY_VIA_MESSAGE",
"GET_PROMOTIONS",
"BOOK_NOW",
"BOOK_TRAVEL",
"MAKE_AN_APPOINTMENT",
"BOOK_A_CONSULTATION",
"ASK_ABOUT_SERVICES",
"GET_A_QUOTE",
"REQUEST_TIME",
"SEND_MESSAGE",
"MESSAGE_PAGE",
"WHATSAPP_MESSAGE",
"CHAT_WITH_US",
"CALL_NOW",
"GET_IN_TOUCH",
"WATCH_MORE",
"WATCH_VIDEO",
"LISTEN_NOW",
"INSTALL_APP",
"USE_APP",
"LIKE_PAGE",
"FOLLOW_PAGE",
"EVENT_RSVP",
"DONATE_NOW",
"GET_DIRECTIONS",
"SHOP_WITH_AI",
"TRY_ON_WITH_AI"
],
"description": "CTA button. Overrides the shared call_to_action_type."
}
},
"required": [
"file_url"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 20,
"description": "Videos to turn into ads (max 20 per call)"
},
"message": {
"type": "string",
"description": "Shared primary text applied to every video without its own message"
},
"headline": {
"type": "string",
"description": "Shared headline applied to every video without its own headline"
},
"description": {
"type": "string",
"description": "Shared description applied to every video without its own description"
},
"link_url": {
"type": "string",
"minLength": 1,
"description": "Shared destination URL applied to every video without its own link_url"
},
"call_to_action_type": {
"$ref": "#/properties/videos/items/properties/call_to_action_type",
"description": "Shared CTA button applied to every video without its own CTA"
},
"url_tags": {
"type": "string",
"description": "Query params appended to clicked URLs (e.g. 'utm_source=meta&utm_medium=paid')"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED"
],
"default": "PAUSED",
"description": "Status of the created ads. PAUSED by default so nothing starts spending unreviewed."
},
"max_wait_seconds": {
"type": "number",
"minimum": 0,
"maximum": 240,
"default": 120,
"description": "Per-video cap on waiting for Meta to finish processing. Also bounded by the batch-wide time budget."
}
},
"required": [
"account_id",
"ad_set_id",
"page_id",
"videos"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_clone_ad_set_bundle⚠️ Modifies live ads/account data. Clone an ad set bundle in one operation: reads a source ad set, clones its targeting/budget/pixel setup into a new ad set, and recreates every ad by duplicating it with Meta's native ad-copy endpoint (POST /{ad_id}/copies). Native copy gives 100% creative-type coverage — link, image, video, carousel, collection, catalog/Advantage+ catalog, dynamic (asset_feed_spec), and boosted posts all clone losslessly, with the destination ad set's pixel applied automatically. Designed for workflows like duplicating a GEO-specific ad set to another country with a different pixel while keeping every new resource PAUSED by default. creative_overrides change copy per source ad: on standard (object_story_spec) creatives the override is applied by swapping a modified creative onto the copied ad; on dynamic or otherwise non-patchable creatives the override cannot be applied and is reported in warnings while the ad remains in created_ads. If a single ad fails to copy it is reported in skipped and the rest proceed. Supports dry_run planning and idempotency_key-based retry safety.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"source_ad_set_id": {
"type": "string",
"description": "Source ad set ID to clone"
},
"target_ad_set": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Name for the cloned ad set"
},
"geo_override": {
"type": "object",
"properties": {
"countries": {
"type": "array",
"items": {
"type": "string"
}
},
"regions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"cities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"radius": {
"type": "number"
},
"distance_unit": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"zips": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"location_types": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true,
"description": "Geo override that REPLACES the source geo_locations (for example, { countries: ['CL'] }). Cities/regions/zips from the source are NOT inherited."
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED"
],
"default": "PAUSED",
"description": "Status for the cloned ad set and ads. Defaults to PAUSED."
},
"daily_budget": {
"type": "number",
"description": "Optional daily budget override in cents. Takes precedence over the source budget, regardless of source budget type."
},
"lifetime_budget": {
"type": "number",
"description": "Optional lifetime budget override in cents. Requires end_time."
},
"end_time": {
"type": "string",
"description": "ISO 8601 end time. Required when lifetime_budget is set."
},
"destination_type": {
"type": "string",
"enum": [
"WEBSITE",
"APP",
"MESSENGER",
"WHATSAPP",
"INSTAGRAM_DIRECT",
"ON_AD",
"ON_PAGE",
"ON_EVENT",
"ON_VIDEO",
"SHOP_AUTOMATIC",
"FACEBOOK",
"FACEBOOK_PAGE",
"INSTAGRAM_PROFILE",
"INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE",
"MESSAGING_INSTAGRAM_DIRECT_MESSENGER",
"MESSAGING_INSTAGRAM_DIRECT_MESSENGER_WHATSAPP",
"MESSAGING_INSTAGRAM_DIRECT_WHATSAPP",
"MESSAGING_MESSENGER_WHATSAPP",
"APPLINKS_AUTOMATIC"
],
"description": "Optional destination_type override"
},
"promoted_object": {
"type": "object",
"additionalProperties": {},
"description": "Optional promoted_object override"
}
},
"required": [
"name",
"geo_override"
],
"additionalProperties": false,
"description": "Configuration for the cloned ad set"
},
"creative_overrides": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source_ad_id": {
"type": "string",
"description": "Source ad ID to override"
},
"source_creative_id": {
"type": "string",
"description": "Source creative ID to override"
},
"name": {
"type": "string",
"description": "Name for the cloned creative"
},
"headline": {
"type": "string",
"description": "Headline/title override"
},
"message": {
"type": "string",
"description": "Primary text override"
},
"description": {
"type": "string",
"description": "Description override"
},
"link_url": {
"type": "string",
"description": "Optional destination URL override"
},
"call_to_action_type": {
"type": "string",
"enum": [
"LEARN_MORE",
"SIGN_UP",
"DOWNLOAD",
"SUBSCRIBE",
"CONTACT_US",
"APPLY_NOW",
"GET_OFFER",
"GET_QUOTE",
"GET_STARTED",
"OPEN_LINK",
"NO_BUTTON",
"SEE_MORE",
"SHOP_NOW",
"BUY_NOW",
"ORDER_NOW",
"START_ORDER",
"ADD_TO_CART",
"VIEW_PRODUCT",
"BUY_VIA_MESSAGE",
"GET_PROMOTIONS",
"BOOK_NOW",
"BOOK_TRAVEL",
"MAKE_AN_APPOINTMENT",
"BOOK_A_CONSULTATION",
"ASK_ABOUT_SERVICES",
"GET_A_QUOTE",
"REQUEST_TIME",
"SEND_MESSAGE",
"MESSAGE_PAGE",
"WHATSAPP_MESSAGE",
"CHAT_WITH_US",
"CALL_NOW",
"GET_IN_TOUCH",
"WATCH_MORE",
"WATCH_VIDEO",
"LISTEN_NOW",
"INSTALL_APP",
"USE_APP",
"LIKE_PAGE",
"FOLLOW_PAGE",
"EVENT_RSVP",
"DONATE_NOW",
"GET_DIRECTIONS",
"SHOP_WITH_AI",
"TRY_ON_WITH_AI"
],
"description": "Optional CTA override"
}
},
"additionalProperties": false
},
"default": [],
"description": "Optional creative overrides keyed by source_ad_id or source_creative_id. Applied via creative swap on standard creatives; ignored (and reported) on dynamic or otherwise non-patchable creatives."
},
"dry_run": {
"type": "boolean",
"default": false,
"description": "Plan the operation without creating any resources"
},
"idempotency_key": {
"type": "string",
"description": "Required for real execution. Reusing the same key returns the prior result instead of duplicating resources."
}
},
"required": [
"account_id",
"source_ad_set_id",
"target_ad_set"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_ad⚠️ Modifies live ads/account data. Create a new ad within an ad set using an existing creative. Ads are created in PAUSED status by default.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Ad name"
},
"ad_set_id": {
"type": "string",
"description": "Ad set ID to place this ad in"
},
"creative_id": {
"type": "string",
"description": "Creative ID to use for this ad"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED"
],
"default": "PAUSED"
},
"tracking_specs": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "Tracking specifications"
}
},
"required": [
"account_id",
"name",
"ad_set_id",
"creative_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_ad_creative⚠️ Modifies live ads/account data. Create a new ad creative. Three modes: (1) Build from scratch with image/video + text via object_story_spec, (2) Promote an existing Facebook Page post via object_story_id ('Boost Post'), (3) Promote an existing Instagram post via source_instagram_media_id. The creative can then be used when creating ads. Important: scratch-built video creatives require a thumbnail via image_hash or image_url; Meta rejects video_id without one.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Creative name"
},
"page_id": {
"type": "string",
"description": "Facebook Page ID (required for object_story_spec mode, not needed for object_story_id or source_instagram_media_id)"
},
"object_story_id": {
"type": "string",
"description": "Existing Facebook Page post ID to promote as an ad ('Boost Post' flow). Format: {page_id}_{post_id}. When provided, object_story_spec is NOT built — the existing post is used as-is."
},
"instagram_actor_id": {
"type": "string",
"description": "Instagram account ID (from ads_get_instagram_account). Required when promoting IG posts."
},
"source_instagram_media_id": {
"type": "string",
"description": "Instagram media ID to create a creative from an existing IG post (from ads_get_instagram_media). When provided, image_hash/image_url/video_id are ignored."
},
"image_hash": {
"type": "string",
"description": "Image hash from ads_upload_ad_image"
},
"image_url": {
"type": "string",
"description": "Image URL (alternative to image_hash)"
},
"video_id": {
"type": "string",
"description": "Video ID"
},
"link_url": {
"type": "string",
"description": "Destination URL"
},
"message": {
"type": "string",
"description": "Primary text / body copy"
},
"headline": {
"type": "string",
"description": "Headline text"
},
"description": {
"type": "string",
"description": "Description text (shown below headline)"
},
"call_to_action_type": {
"type": "string",
"enum": [
"LEARN_MORE",
"SIGN_UP",
"DOWNLOAD",
"SUBSCRIBE",
"CONTACT_US",
"APPLY_NOW",
"GET_OFFER",
"GET_QUOTE",
"GET_STARTED",
"OPEN_LINK",
"NO_BUTTON",
"SEE_MORE",
"SHOP_NOW",
"BUY_NOW",
"ORDER_NOW",
"START_ORDER",
"ADD_TO_CART",
"VIEW_PRODUCT",
"BUY_VIA_MESSAGE",
"GET_PROMOTIONS",
"BOOK_NOW",
"BOOK_TRAVEL",
"MAKE_AN_APPOINTMENT",
"BOOK_A_CONSULTATION",
"ASK_ABOUT_SERVICES",
"GET_A_QUOTE",
"REQUEST_TIME",
"SEND_MESSAGE",
"MESSAGE_PAGE",
"WHATSAPP_MESSAGE",
"CHAT_WITH_US",
"CALL_NOW",
"GET_IN_TOUCH",
"WATCH_MORE",
"WATCH_VIDEO",
"LISTEN_NOW",
"INSTALL_APP",
"USE_APP",
"LIKE_PAGE",
"FOLLOW_PAGE",
"EVENT_RSVP",
"DONATE_NOW",
"GET_DIRECTIONS",
"SHOP_WITH_AI",
"TRY_ON_WITH_AI"
],
"description": "Call-to-action button type"
},
"url_tags": {
"type": "string",
"description": "Query string params appended to URLs clicked from the ad (e.g. 'utm_source=meta&utm_medium=paid')"
}
},
"required": [
"account_id",
"name"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_ad_rule⚠️ Modifies live ads/account data. Create an automated rule. Examples: pause adsets when CPL > $20, notify when CTR < 1%, increase budget when ROAS > 3x.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Rule name"
},
"evaluation_spec": {
"type": "object",
"properties": {
"evaluation_type": {
"type": "string",
"enum": [
"TRIGGER",
"SCHEDULE"
],
"description": "TRIGGER for real-time, SCHEDULE for periodic"
},
"filters": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"description": "Metric field (e.g., cost_per_action_type, ctr, impressions)"
},
"value": {
"type": [
"string",
"number"
],
"description": "Threshold value"
},
"operator": {
"type": "string",
"enum": [
"GREATER_THAN",
"LESS_THAN",
"EQUAL",
"NOT_EQUAL",
"IN_RANGE",
"NOT_IN_RANGE"
],
"description": "Comparison operator"
}
},
"required": [
"field",
"value",
"operator"
],
"additionalProperties": false
},
"description": "Conditions that trigger the rule"
}
},
"required": [
"evaluation_type",
"filters"
],
"additionalProperties": false,
"description": "When to evaluate the rule"
},
"execution_spec": {
"type": "object",
"properties": {
"execution_type": {
"type": "string",
"enum": [
"PAUSE",
"UNPAUSE",
"CHANGE_BUDGET",
"CHANGE_BID",
"ROTATE",
"NOTIFICATION"
],
"description": "Action to take when conditions are met"
},
"execution_options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"value": {
"type": [
"string",
"number"
]
},
"operator": {
"type": "string",
"enum": [
"EQUAL",
"INCREASE_BY",
"DECREASE_BY"
]
}
},
"required": [
"field",
"value"
],
"additionalProperties": false
},
"description": "Options for CHANGE_BUDGET/CHANGE_BID execution types"
}
},
"required": [
"execution_type"
],
"additionalProperties": false,
"description": "What to do when triggered"
},
"schedule_spec": {
"type": "object",
"properties": {
"schedule_type": {
"type": "string",
"enum": [
"CUSTOM",
"SEMI_HOURLY",
"HOURLY",
"DAILY",
"WEEKLY"
],
"description": "How often to evaluate"
}
},
"required": [
"schedule_type"
],
"additionalProperties": false
}
},
"required": [
"account_id",
"name",
"evaluation_spec",
"execution_spec"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_ad_set⚠️ Modifies live ads/account data. Create a new ad set within a campaign. Requires targeting specification, optimization goal, and destination_type (required for ODAX campaigns). Budget belongs at exactly one level: when the parent campaign has either daily_budget or lifetime_budget (campaign budget / CBO), omit both ad-set budget fields. Only pass daily_budget or lifetime_budget here for ad-set budget / ABO campaigns. Common destination_type values: WEBSITE (traffic/sales to website), APP (app installs), MESSENGER/WHATSAPP/INSTAGRAM_DIRECT (messaging), ON_AD (lead forms, instant experiences). Ad sets are created in PAUSED status by default.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"campaign_id": {
"type": "string",
"description": "Parent campaign ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Ad set name"
},
"destination_type": {
"type": "string",
"enum": [
"WEBSITE",
"APP",
"MESSENGER",
"WHATSAPP",
"INSTAGRAM_DIRECT",
"ON_AD",
"ON_PAGE",
"ON_EVENT",
"ON_VIDEO",
"SHOP_AUTOMATIC",
"FACEBOOK",
"FACEBOOK_PAGE",
"INSTAGRAM_PROFILE",
"INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE",
"MESSAGING_INSTAGRAM_DIRECT_MESSENGER",
"MESSAGING_INSTAGRAM_DIRECT_MESSENGER_WHATSAPP",
"MESSAGING_INSTAGRAM_DIRECT_WHATSAPP",
"MESSAGING_MESSENGER_WHATSAPP",
"APPLINKS_AUTOMATIC"
],
"description": "Where the ad traffic is directed. Required for ODAX campaigns. Common values: WEBSITE (website traffic/conversions), APP (app installs), MESSENGER (Messenger conversations), WHATSAPP (WhatsApp conversations), INSTAGRAM_DIRECT (Instagram DMs), ON_AD (lead forms, instant experiences, post engagement), ON_VIDEO (video views), ON_PAGE (page engagement), SHOP_AUTOMATIC (shop)"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED"
],
"default": "PAUSED"
},
"daily_budget": {
"type": "number",
"description": "Ad-set daily budget in cents (e.g., 2000 = $20.00). Omit when the parent campaign has a daily or lifetime budget."
},
"lifetime_budget": {
"type": "number",
"description": "Ad-set lifetime budget in cents. Omit when the parent campaign has a daily or lifetime budget."
},
"optimization_goal": {
"type": "string",
"enum": [
"NONE",
"APP_INSTALLS",
"AD_RECALL_LIFT",
"ENGAGED_USERS",
"EVENT_RESPONSES",
"IMPRESSIONS",
"LEAD_GENERATION",
"QUALITY_LEAD",
"LINK_CLICKS",
"OFFSITE_CONVERSIONS",
"PAGE_LIKES",
"POST_ENGAGEMENT",
"QUALITY_CALL",
"REACH",
"LANDING_PAGE_VIEWS",
"VISIT_INSTAGRAM_PROFILE",
"VALUE",
"THRUPLAY",
"DERIVED_EVENTS",
"APP_INSTALLS_AND_OFFSITE_CONVERSIONS",
"CONVERSATIONS",
"IN_APP_VALUE",
"MESSAGING_PURCHASE_CONVERSION",
"MESSAGING_APPOINTMENT_CONVERSION",
"SUBSCRIBERS",
"REMINDERS_SET"
],
"description": "Optimization goal"
},
"billing_event": {
"type": "string",
"enum": [
"IMPRESSIONS",
"LINK_CLICKS",
"POST_ENGAGEMENT",
"THRUPLAY"
],
"default": "IMPRESSIONS"
},
"bid_amount": {
"type": "number",
"description": "Bid cap in cents"
},
"bid_strategy": {
"type": "string",
"enum": [
"LOWEST_COST_WITHOUT_CAP",
"LOWEST_COST_WITH_BID_CAP",
"COST_CAP",
"LOWEST_COST_WITH_MIN_ROAS"
]
},
"targeting": {
"type": "object",
"properties": {
"geo_locations": {
"type": "object",
"properties": {
"countries": {
"type": "array",
"items": {
"type": "string"
}
},
"regions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"cities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"radius": {
"type": "number"
},
"distance_unit": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"zips": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"location_types": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
},
"excluded_geo_locations": {
"$ref": "#/properties/targeting/properties/geo_locations",
"description": "Locations to exclude from targeting"
},
"age_min": {
"type": "number",
"minimum": 13,
"maximum": 65
},
"age_max": {
"type": "number",
"minimum": 13,
"maximum": 65
},
"genders": {
"type": "array",
"items": {
"type": "number",
"minimum": 0,
"maximum": 2
},
"description": "0=all, 1=male, 2=female"
},
"locales": {
"type": "array",
"items": {
"type": "number"
},
"description": "Locale IDs for language targeting (e.g., 6=English, 24=Spanish)"
},
"relationship_statuses": {
"type": "array",
"items": {
"type": "number"
},
"description": "1=single, 2=in_relationship, 3=married, 4=engaged, 6=unspecified"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"behaviors": {
"$ref": "#/properties/targeting/properties/interests"
},
"education_statuses": {
"type": "array",
"items": {
"type": "number"
},
"description": "1=HIGH_SCHOOL, 2=UNDERGRAD, 3=ALUM, 7=IN_GRAD_SCHOOL, 9=MASTER_DEGREE, etc."
},
"education_schools": {
"$ref": "#/properties/targeting/properties/interests"
},
"education_majors": {
"$ref": "#/properties/targeting/properties/interests"
},
"college_years": {
"type": "array",
"items": {
"type": "number"
}
},
"work_employers": {
"$ref": "#/properties/targeting/properties/interests"
},
"work_positions": {
"$ref": "#/properties/targeting/properties/interests"
},
"life_events": {
"$ref": "#/properties/targeting/properties/interests"
},
"industries": {
"$ref": "#/properties/targeting/properties/interests"
},
"income": {
"$ref": "#/properties/targeting/properties/interests"
},
"family_statuses": {
"$ref": "#/properties/targeting/properties/interests"
},
"user_adclusters": {
"$ref": "#/properties/targeting/properties/interests",
"description": "Broad category targeting clusters"
},
"custom_audiences": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"excluded_custom_audiences": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"device_platforms": {
"type": "array",
"items": {
"type": "string"
},
"description": "mobile, desktop"
},
"user_os": {
"type": "array",
"items": {
"type": "string"
},
"description": "OS targeting: iOS, Android, or versioned like iOS_ver_15.0_and_above"
},
"user_device": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target specific devices (e.g., Galaxy S24, iPhone 15)"
},
"excluded_user_device": {
"type": "array",
"items": {
"type": "string"
}
},
"wireless_carrier": {
"type": "array",
"items": {
"type": "string"
},
"description": "Carrier targeting (use 'Wifi' for wifi-only users)"
},
"publisher_platforms": {
"type": "array",
"items": {
"type": "string"
},
"description": "facebook, instagram, threads, messenger, audience_network"
},
"facebook_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "feed, right_hand_column, marketplace, video_feeds, story, search, instream_video, facebook_reels, facebook_reels_overlay, profile_feed, notification"
},
"instagram_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "stream, story, explore, explore_home, reels, profile_feed, ig_search, profile_reels"
},
"threads_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "threads_stream (requires instagram stream)"
},
"audience_network_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "classic, rewarded_video"
},
"messenger_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "sponsored_messages, story"
},
"whatsapp_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "status (requires instagram story)"
},
"brand_safety_content_filter_levels": {
"type": "array",
"items": {
"type": "string"
},
"description": "FACEBOOK_RELAXED/STANDARD/STRICT, AN_RELAXED/STANDARD/STRICT, FEED_RELAXED/STANDARD/STRICT"
},
"excluded_publisher_categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "dating, gambling, debated_social_issues, mature_audiences, tragedy_and_conflict"
},
"excluded_publisher_list_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Block list IDs to exclude specific publishers"
},
"flexible_spec": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "Array of targeting groups combined with AND; items within each group use OR"
},
"exclusions": {
"type": "object",
"additionalProperties": {}
},
"targeting_automation": {
"type": "object",
"properties": {
"advantage_audience": {
"type": "number",
"description": "1 to enable Advantage+ audience"
}
},
"additionalProperties": true,
"description": "Advantage+ audience automation settings"
}
},
"additionalProperties": true,
"description": "Targeting specification for the ad set"
},
"start_time": {
"type": "string",
"description": "ISO 8601 start time"
},
"end_time": {
"type": "string",
"description": "ISO 8601 end time (required for lifetime_budget)"
},
"promoted_object": {
"type": "object",
"additionalProperties": {},
"description": "Promoted object (e.g., { page_id: '123' } or { pixel_id: '456', custom_event_type: 'PURCHASE' })"
}
},
"required": [
"account_id",
"campaign_id",
"name",
"destination_type",
"optimization_goal",
"targeting"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_ad_study⚠️ Modifies live ads/account data. Create an A/B test (split test) to compare ad variations with statistical significance. Supports testing creative, audience, placement, and delivery optimization variables.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Study name"
},
"description": {
"type": "string"
},
"start_time": {
"type": "string",
"description": "Start time (ISO 8601, e.g., 2025-01-15T00:00:00-0500)"
},
"end_time": {
"type": "string",
"description": "End time (ISO 8601)"
},
"type": {
"type": "string",
"enum": [
"SPLIT_TEST",
"LIFT_STUDY"
],
"default": "SPLIT_TEST"
},
"cells": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Cell/variant name"
},
"treatment_percentage": {
"type": "number",
"minimum": 1,
"maximum": 100,
"description": "Traffic percentage for this cell"
},
"ad_sets": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ad set IDs for this cell"
},
"campaigns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Campaign IDs for this cell"
}
},
"required": [
"name",
"treatment_percentage"
],
"additionalProperties": false
},
"description": "Test cells/variants — each gets a portion of the traffic"
},
"objectives": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Objective type (e.g., CONVERSIONS, LEADS)"
},
"name": {
"type": "string",
"description": "Objective display name"
}
},
"required": [
"type",
"name"
],
"additionalProperties": false
},
"description": "Study objectives to measure"
},
"confidence_level": {
"type": "number",
"minimum": 80,
"maximum": 99,
"default": 95,
"description": "Required confidence level (%)"
}
},
"required": [
"account_id",
"name",
"start_time",
"end_time",
"cells"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_async_report⚠️ Modifies live ads/account data. Create an asynchronous report for large data exports. Use this when you need to pull extensive insights data that would time out with a synchronous request. NOTE: report_run_id expires 30 days after creation. Consider ads_run_report_and_wait for small/medium reports that finish in <10 min.Input schema{
"type": "object",
"properties": {
"object_id": {
"type": "string",
"description": "Campaign, Ad Set, Ad, or Account ID (use act_XXX for accounts)"
},
"level": {
"type": "string",
"enum": [
"ad",
"adset",
"campaign",
"account"
],
"description": "Aggregation level"
},
"time_range": {
"type": "object",
"properties": {
"since": {
"type": "string",
"description": "Start date YYYY-MM-DD"
},
"until": {
"type": "string",
"description": "End date YYYY-MM-DD"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"this_quarter",
"maximum",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d",
"last_week_mon_sun",
"last_week_sun_sat",
"last_quarter",
"last_year",
"this_week_mon_today",
"this_week_sun_today",
"this_year"
]
},
"breakdowns": {
"type": "array",
"items": {
"type": "string",
"enum": [
"age",
"gender",
"country",
"region",
"dma",
"impression_device",
"device_platform",
"platform_position",
"publisher_platform",
"product_id",
"frequency_value",
"hourly_stats_aggregated_by_advertiser_time_zone",
"hourly_stats_aggregated_by_audience_time_zone"
]
}
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Metrics to include"
},
"use_unified_attribution_setting": {
"type": "boolean",
"default": true
},
"time_increment": {
"anyOf": [
{
"type": "number",
"minimum": 1,
"maximum": 90
},
{
"type": "string",
"enum": [
"monthly",
"all_days"
]
}
],
"description": "Time increment for series data"
}
},
"required": [
"object_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_budget_schedule⚠️ Modifies live ads/account data. Schedule a temporary budget increase for a campaign during high-demand periods (e.g., Black Friday, product launches).Input schema{
"type": "object",
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign ID"
},
"budget_value": {
"type": "string",
"description": "Budget amount in cents (for ABSOLUTE) or multiplier value (for MULTIPLIER)"
},
"budget_value_type": {
"type": "string",
"enum": [
"ABSOLUTE",
"MULTIPLIER"
],
"description": "ABSOLUTE = set exact budget in cents, MULTIPLIER = multiply current budget"
},
"time_start": {
"type": "string",
"description": "ISO 8601 start time for the budget increase"
},
"time_end": {
"type": "string",
"description": "ISO 8601 end time for the budget increase"
}
},
"required": [
"campaign_id",
"budget_value",
"budget_value_type",
"time_start",
"time_end"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_campaign⚠️ Modifies live ads/account data. Create a new Meta advertising campaign. Uses outcome-based (ODAX) objectives. Campaigns are created in PAUSED status by default.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 400,
"description": "Campaign name"
},
"objective": {
"type": "string",
"enum": [
"OUTCOME_AWARENESS",
"OUTCOME_ENGAGEMENT",
"OUTCOME_LEADS",
"OUTCOME_SALES",
"OUTCOME_TRAFFIC",
"OUTCOME_APP_PROMOTION"
],
"description": "Campaign objective (OUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_LEADS, OUTCOME_SALES, OUTCOME_APP_PROMOTION)"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED"
],
"default": "PAUSED"
},
"special_ad_categories": {
"type": "array",
"items": {
"type": "string",
"enum": [
"NONE",
"EMPLOYMENT",
"HOUSING",
"CREDIT",
"ISSUES_ELECTIONS_POLITICS"
]
},
"default": [
"NONE"
],
"description": "Special ad categories (NONE, EMPLOYMENT, HOUSING, CREDIT, ISSUES_ELECTIONS_POLITICS)"
},
"daily_budget": {
"type": "number",
"description": "Daily budget in cents (e.g., 5000 = $50.00)"
},
"lifetime_budget": {
"type": "number",
"description": "Lifetime budget in cents"
},
"bid_strategy": {
"type": "string",
"enum": [
"LOWEST_COST_WITHOUT_CAP",
"LOWEST_COST_WITH_BID_CAP",
"COST_CAP",
"LOWEST_COST_WITH_MIN_ROAS"
]
},
"buying_type": {
"type": "string",
"enum": [
"AUCTION",
"RESERVED"
],
"default": "AUCTION"
}
},
"required": [
"account_id",
"name",
"objective"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_custom_audience⚠️ Modifies live ads/account data. Create a custom audience on an ad account. Two main flows: (a) WEBSITE pixel-based — pass 'rule' (event_sources of type 'pixel') and OMIT 'subtype' (Meta v18+ infers it; passing subtype: WEBSITE returns error 2654). (b) CUSTOM customer-list — pass subtype: 'CUSTOM' + customer_file_source; PII must be SHA-256 hashed before uploading users. After creation: build a lookalike with ads_create_lookalike_audience and apply the id to an ad set with ads_update_ad_set (targeting.custom_audiences=[{id}]).Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Audience name"
},
"description": {
"type": "string",
"description": "Audience description"
},
"subtype": {
"type": "string",
"enum": [
"CUSTOM",
"WEBSITE",
"APP",
"OFFLINE_CONVERSION",
"ENGAGEMENT"
],
"description": "Audience subtype. OMIT (or pass 'WEBSITE') when 'rule' is set — for pixel-based audiences Meta infers the subtype and rejects an explicit one (error 2654); the tool drops it automatically. For non-rule flows: when omitted, defaults to 'CUSTOM' (customer-list), which also requires customer_file_source."
},
"customer_file_source": {
"type": "string",
"enum": [
"USER_PROVIDED_ONLY",
"PARTNER_PROVIDED_ONLY",
"BOTH_USER_AND_PARTNER_PROVIDED"
],
"description": "Required only when subtype = 'CUSTOM' (customer-list)."
},
"retention_days": {
"type": "number",
"description": "Retention period in days"
},
"rule": {
"type": "string",
"description": "JSON rule for pixel/event-based audiences (WEBSITE). Shape: {inclusions:{operator:'or',rules:[{event_sources:[{id:'<pixel_id>',type:'pixel'}],retention_seconds:<n>,filter:{operator:'and',filters:[{field:'event',operator:'=',value:'<event_name>'}]}}]}}. When 'rule' is set, omit 'subtype'."
},
"prefill": {
"type": "boolean",
"description": "Whether to prefill with existing data (for WEBSITE)"
}
},
"required": [
"account_id",
"name"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_custom_conversion⚠️ Modifies live ads/account data. Create a custom conversion for an ad account. Define rules based on URL or pixel events.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Custom conversion name"
},
"description": {
"type": "string"
},
"pixel_id": {
"type": "string",
"description": "Pixel ID to associate with"
},
"event_source_type": {
"type": "string",
"enum": [
"WEB",
"APP",
"MOBILE"
],
"default": "WEB",
"description": "Event source type"
},
"custom_event_type": {
"type": "string",
"enum": [
"ADD_PAYMENT_INFO",
"ADD_TO_CART",
"ADD_TO_WISHLIST",
"COMPLETE_REGISTRATION",
"CONTENT_VIEW",
"INITIATED_CHECKOUT",
"LEAD",
"PURCHASE",
"SEARCH",
"OTHER"
],
"description": "Standard event type to track"
},
"rule": {
"type": "string",
"description": "Conversion rule (JSON string, e.g., URL contains, event parameters)"
},
"default_conversion_value": {
"type": "number",
"description": "Default monetary value"
}
},
"required": [
"account_id",
"name",
"pixel_id",
"custom_event_type",
"rule"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_lead_form⚠️ Modifies live ads/account data. Create a new lead generation form for a Facebook Page.Input schema{
"type": "object",
"properties": {
"page_id": {
"type": "string",
"description": "Facebook Page ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Form name"
},
"questions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Question type (e.g., FULL_NAME, EMAIL, PHONE_NUMBER, CUSTOM)"
},
"key": {
"type": "string",
"description": "Custom question key"
},
"label": {
"type": "string",
"description": "Custom question label"
}
},
"required": [
"type"
],
"additionalProperties": false
},
"description": "Form questions"
},
"privacy_policy_url": {
"type": "string",
"description": "Privacy policy URL (required by Meta)"
},
"follow_up_action_url": {
"type": "string",
"description": "Thank you page URL"
},
"locale": {
"type": "string",
"description": "Form locale (e.g., en_US)"
}
},
"required": [
"page_id",
"name",
"questions",
"privacy_policy_url"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_create_lookalike_audience⚠️ Modifies live ads/account data. Create a lookalike audience seeded by an existing custom audience. Source must have ~100+ matched users or Meta rejects the request. Ratio controls similarity vs. reach (0.01 = closest 1%, 0.20 = top 20% — bigger reach, lower similarity). After creation, apply the lookalike id to an ad set with ads_update_ad_set (targeting.custom_audiences=[{id}]). Lookalikes typically need ~24 h to compute users — id is returned immediately but reach starts at zero.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Lookalike audience name"
},
"origin_audience_id": {
"type": "string",
"description": "Source custom audience ID"
},
"ratio": {
"type": "number",
"minimum": 0.01,
"maximum": 0.2,
"description": "Lookalike ratio (0.01 = 1%, 0.20 = 20%)"
},
"country": {
"type": "string",
"description": "Target country ISO code (e.g., CO, US, MX)"
},
"description": {
"type": "string"
}
},
"required": [
"account_id",
"name",
"origin_audience_id",
"ratio",
"country"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_delete_ad⚠️ Modifies live ads/account data. Delete an ad (soft delete — sets status to DELETED).Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID to delete"
}
},
"required": [
"ad_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_delete_ad_rule⚠️ Modifies live ads/account data. Delete an automated rule.Input schema{
"type": "object",
"properties": {
"rule_id": {
"type": "string",
"description": "Rule ID to delete"
}
},
"required": [
"rule_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_delete_ad_set⚠️ Modifies live ads/account data. Delete an ad set (soft delete — sets status to DELETED).Input schema{
"type": "object",
"properties": {
"ad_set_id": {
"type": "string",
"description": "Ad set ID to delete"
}
},
"required": [
"ad_set_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_delete_campaign⚠️ Modifies live ads/account data. Delete a campaign (soft delete — sets status to DELETED). The campaign can still be viewed but will stop serving.Input schema{
"type": "object",
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign ID to delete"
}
},
"required": [
"campaign_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_delete_comment⚠️ Modifies live ads/account data. Delete a comment on an ad post. This action cannot be undone.Input schema{
"type": "object",
"properties": {
"comment_id": {
"type": "string",
"description": "Comment ID to delete"
}
},
"required": [
"comment_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_delete_custom_audience⚠️ Modifies live ads/account data. Permanently delete a custom audience from the ad account. Cannot be undone. To remove an audience from a single ad set without destroying it everywhere, prefer ads_update_ad_set with targeting.custom_audiences set to a different array (or omitted from a fresh targeting spec).Input schema{
"type": "object",
"properties": {
"audience_id": {
"type": "string",
"description": "Custom audience ID to delete"
}
},
"required": [
"audience_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_delete_token⚠️ Modifies live ads/account data. Delete a Meta token registered for the current authenticated user. No-op for the legacy in-memory pool.Input schema{
"type": "object",
"properties": {
"bm_name": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"description": "Name of the token to delete"
}
},
"required": [
"bm_name"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_diagnose_underperformanceRun a compound diagnostic on an underperforming object: anomaly detection vs prior period, auction rankings (when applicable), pixel signal quality (when a pixel is associated), and active errors/issues. Returns a unified report with hypothesis. Agency-tier diagnostic — combines work that the official Meta MCP requires multiple tool calls to do.Input schema{
"type": "object",
"properties": {
"object_id": {
"type": "string",
"description": "Account, campaign, ad set, or ad ID"
},
"level": {
"type": "string",
"enum": [
"account",
"campaign",
"ad_set",
"ad"
],
"default": "campaign"
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d"
],
"default": "last_7d"
},
"pixel_id": {
"type": "string",
"description": "Optional pixel ID to include signal-quality diagnostics"
}
},
"required": [
"object_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_estimate_audience_sizeEstimate the audience size for a targeting specification. Useful for validating targeting before creating ad sets.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"targeting_spec": {
"type": "object",
"additionalProperties": {},
"description": "Targeting specification (same format as ads_create_ad_set targeting)"
}
},
"required": [
"account_id",
"targeting_spec"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_generate_previewGenerate a preview from a creative specification without creating an actual ad. Useful for previewing creative concepts before launch.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"ad_format": {
"type": "string",
"enum": [
"DESKTOP_FEED_STANDARD",
"MOBILE_FEED_STANDARD",
"MOBILE_FEED_BASIC",
"MOBILE_INTERSTITIAL",
"MOBILE_BANNER",
"RIGHT_COLUMN_STANDARD",
"MARKETPLACE_MOBILE",
"INSTAGRAM_STANDARD",
"INSTAGRAM_STORY",
"INSTAGRAM_REELS",
"INSTAGRAM_EXPLORE_CONTEXTUAL",
"INSTAGRAM_EXPLORE_GRID_HOME",
"INSTAGRAM_REELS_OVERLAY",
"INSTAGRAM_PROFILE_FEED",
"INSTAGRAM_PROFILE_REELS",
"INSTAGRAM_SEARCH_CHAIN",
"INSTAGRAM_FEED_WEB",
"FACEBOOK_STORY_MOBILE",
"FACEBOOK_STORY_STICKER_MOBILE",
"FACEBOOK_REELS_MOBILE",
"FACEBOOK_REELS_BANNER",
"FACEBOOK_REELS_POSTLOOP",
"FACEBOOK_REELS_STICKER",
"MESSENGER_MOBILE_INBOX_MEDIA",
"MESSENGER_MOBILE_STORY_MEDIA",
"WHATSAPP_STATUS_MEDIA",
"AUDIENCE_NETWORK_OUTSTREAM_VIDEO",
"INSTREAM_VIDEO_DESKTOP",
"INSTREAM_VIDEO_MOBILE",
"SUGGESTED_VIDEO_MOBILE"
],
"default": "MOBILE_FEED_STANDARD"
},
"creative": {
"type": "object",
"properties": {
"object_story_spec": {
"type": "object",
"properties": {
"page_id": {
"type": "string",
"description": "Facebook Page ID"
},
"link_data": {
"type": "object",
"properties": {
"image_hash": {
"type": "string"
},
"picture": {
"type": "string",
"description": "Image URL"
},
"link": {
"type": "string",
"description": "Destination URL"
},
"message": {
"type": "string",
"description": "Primary text"
},
"name": {
"type": "string",
"description": "Headline"
},
"description": {
"type": "string"
},
"call_to_action": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"value": {
"type": "object",
"properties": {
"link": {
"type": "string"
}
},
"additionalProperties": false
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"additionalProperties": false
},
"video_data": {
"type": "object",
"properties": {
"video_id": {
"type": "string"
},
"image_hash": {
"type": "string"
},
"message": {
"type": "string"
},
"title": {
"type": "string",
"description": "Video headline"
},
"description": {
"type": "string"
},
"call_to_action": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"value": {
"type": "object",
"properties": {
"link": {
"type": "string"
}
},
"additionalProperties": false
}
},
"required": [
"type"
],
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"required": [
"page_id"
],
"additionalProperties": false,
"description": "Creative story spec"
}
},
"required": [
"object_story_spec"
],
"additionalProperties": false,
"description": "Creative specification"
}
},
"required": [
"account_id",
"creative"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_account_infoGet detailed information about a specific ad account including spend, balance, capabilities, and business details.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID (with or without 'act_' prefix)"
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_accountsGet all ad accounts accessible by the authenticated user. Returns account names, IDs, status, currency, and spend information.Input schema{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"default": "me",
"description": "User ID or 'me' for the authenticated user"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 500,
"default": 100,
"description": "Maximum number of accounts to return"
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to include (defaults to standard set)"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_commentsList comments on an ad post. Uses the ad's effective_object_story_id to fetch comments. Important for compliance monitoring in regulated industries.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID — will resolve to the post automatically"
},
"post_id": {
"type": "string",
"description": "Post ID directly (effective_object_story_id)"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 50
},
"filter": {
"type": "string",
"enum": [
"toplevel",
"stream"
],
"default": "toplevel",
"description": "Filter: toplevel (only direct comments) or stream (all including replies)"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_creativesGet creative details for an ad or list creatives for an ad account. Returns url_tags (UTM parameters) by default, so a single call can audit tracking across an account.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID to get creatives for"
},
"account_id": {
"type": "string",
"description": "Account ID to list all creatives"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Creative fields to request. 'effective_link_url' is a virtual field derived by this server (never sent to Meta) — requesting it fetches link_url, object_story_spec and asset_feed_spec instead."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_detailsGet detailed information about a specific ad.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"ad_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_entitiesGeneric getter for campaigns, ad sets, or ads under a parent. Use entity_type to choose. parent_id is the ad account ID for campaigns, the campaign ID for ad sets, the ad set ID (or campaign/account) for ads. Mirrors the official Meta MCP vocabulary; equivalent to ads_get_campaigns / ads_get_ad_sets / ads_get_ads.Input schema{
"type": "object",
"properties": {
"entity_type": {
"type": "string",
"enum": [
"campaign",
"ad_set",
"ad"
],
"description": "Which entity to list: 'campaign', 'ad_set', or 'ad'"
},
"parent_id": {
"type": "string",
"description": "Account ID for campaigns, campaign ID for ad_sets, ad_set/campaign/account ID for ads"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"status_filter": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DELETED",
"ARCHIVED"
]
}
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"entity_type",
"parent_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_imagesList images uploaded to an ad account with their full URLs. Useful for previewing creative assets without opening Ads Manager.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"hashes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by specific image hashes"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_leadsGet leads generated by a specific ad. Useful for analyzing lead quality per ad variant.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 500,
"default": 100
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"ad_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_previewGenerate a preview of an existing ad in a specific placement format (feed, stories, reels, etc.). Returns HTML preview and shareable link.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID to preview"
},
"ad_format": {
"type": "string",
"enum": [
"DESKTOP_FEED_STANDARD",
"MOBILE_FEED_STANDARD",
"MOBILE_FEED_BASIC",
"MOBILE_INTERSTITIAL",
"MOBILE_BANNER",
"RIGHT_COLUMN_STANDARD",
"MARKETPLACE_MOBILE",
"INSTAGRAM_STANDARD",
"INSTAGRAM_STORY",
"INSTAGRAM_REELS",
"INSTAGRAM_EXPLORE_CONTEXTUAL",
"INSTAGRAM_EXPLORE_GRID_HOME",
"INSTAGRAM_REELS_OVERLAY",
"INSTAGRAM_PROFILE_FEED",
"INSTAGRAM_PROFILE_REELS",
"INSTAGRAM_SEARCH_CHAIN",
"INSTAGRAM_FEED_WEB",
"FACEBOOK_STORY_MOBILE",
"FACEBOOK_STORY_STICKER_MOBILE",
"FACEBOOK_REELS_MOBILE",
"FACEBOOK_REELS_BANNER",
"FACEBOOK_REELS_POSTLOOP",
"FACEBOOK_REELS_STICKER",
"MESSENGER_MOBILE_INBOX_MEDIA",
"MESSENGER_MOBILE_STORY_MEDIA",
"WHATSAPP_STATUS_MEDIA",
"AUDIENCE_NETWORK_OUTSTREAM_VIDEO",
"INSTREAM_VIDEO_DESKTOP",
"INSTREAM_VIDEO_MOBILE",
"SUGGESTED_VIDEO_MOBILE"
],
"default": "MOBILE_FEED_STANDARD",
"description": "Ad placement format"
}
},
"required": [
"ad_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_rulesList automated rules for an ad account. Shows rules that auto-pause, adjust budgets, or send notifications based on performance.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_set_detailsGet detailed information about a specific ad set including targeting, budget, and optimization settings.Input schema{
"type": "object",
"properties": {
"ad_set_id": {
"type": "string",
"description": "Ad set ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"ad_set_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_setsGet ad sets for an ad account. Optionally filter by campaign or status.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"campaign_id": {
"type": "string",
"description": "Filter by campaign ID"
},
"status_filter": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DELETED",
"ARCHIVED"
]
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_studiesList A/B test studies (split tests) for an ad account.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_ad_videosList videos uploaded to an ad account with source URLs and thumbnails. Use this to preview video creatives directly.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_adsGet ads for an ad account. Filter by campaign, ad set, or status.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"campaign_id": {
"type": "string",
"description": "Filter by campaign ID"
},
"ad_set_id": {
"type": "string",
"description": "Filter by ad set ID"
},
"status_filter": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DELETED",
"ARCHIVED"
]
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_audience_detailsGet detailed information about a specific custom audience, including subtype, retention period, approximate size bounds and lookalike spec. Useful before applying it to an ad set via ads_update_ad_set.Input schema{
"type": "object",
"properties": {
"audience_id": {
"type": "string",
"description": "Custom audience ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"audience_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_audience_shared_accountsList ad accounts that currently have shared access to a custom audience. Returns each account id + name. Use before ads_share_custom_audience / ads_unshare_custom_audience to audit the share set.Input schema{
"type": "object",
"properties": {
"audience_id": {
"type": "string",
"description": "Custom audience ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
}
},
"required": [
"audience_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_billing_infoGet billing and payment information for an ad account, including funding source, account status, and spend data.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_campaign_detailsGet detailed information about a specific campaign.Input schema{
"type": "object",
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"campaign_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_campaignsGet campaigns for an ad account. Filter by status to see active, paused, or all campaigns.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"status_filter": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DELETED",
"ARCHIVED"
]
},
"description": "Filter by status (e.g., ['ACTIVE', 'PAUSED'])"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_creative_detailsGet detailed information about a specific creative. 'effective_link_url' is a virtual field this server derives from link_url / object_story_spec / asset_feed_spec — it is accepted in `fields` but never forwarded to Meta.Input schema{
"type": "object",
"properties": {
"creative_id": {
"type": "string",
"description": "Creative ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Creative fields to request. 'effective_link_url' is a virtual field derived by this server (never sent to Meta) — requesting it fetches link_url, object_story_spec and asset_feed_spec instead."
}
},
"required": [
"creative_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_creative_mediaDownload the actual creative media for an ad or creative and return the images inline for visual analysis. Images (including carousel cards and video thumbnails) come back as image content blocks a multimodal model can see directly; videos additionally return a short-lived signed source URL in the JSON metadata for external download or analysis (e.g. curl or a video-capable model).Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID — its creative is resolved automatically"
},
"creative_id": {
"type": "string",
"description": "Creative ID (alternative to ad_id)"
},
"account_id": {
"type": "string",
"description": "Ad account ID (act_… or numeric). Only needed as a fallback when the creative references image hashes and the account cannot be derived from the ad/creative"
},
"image_size": {
"type": "string",
"enum": [
"full",
"small"
],
"default": "full",
"description": "full = original CDN image; small = 128px preview (url_128) when available — cheaper on context"
},
"max_images": {
"type": "number",
"minimum": 1,
"maximum": 10,
"default": 5,
"description": "Cap on returned image blocks (bounds response/context size)"
},
"include_videos": {
"type": "boolean",
"default": true,
"description": "Also resolve videos: returns each video's thumbnail as an image block plus its signed source URL in the JSON metadata"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_custom_audiencesList custom audiences for an ad account. Includes lookalikes, website audiences, customer lists, engagement audiences and offline-conversion audiences. Use the returned audience id with ads_update_ad_set (targeting.custom_audiences=[{id}]) to apply the audience to an ad set.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_custom_conversionsList custom conversions for an ad account.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_dataset_qualitySynthetic health overview for a pixel/dataset: last fire time, match rate, automatic matching configuration. For raw event stats use ads_get_pixel_events; for installation code use ads_get_pixel_details.Input schema{
"type": "object",
"properties": {
"pixel_id": {
"type": "string",
"description": "Pixel/Dataset ID"
}
},
"required": [
"pixel_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_errorsList current errors and issues at the account level: rejected ads, ads with delivery issues, account restrictions. Combine with ads_get_help_article to look up rejection reasons. Mirrors the official Meta MCP tool.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"severity": {
"type": "string",
"enum": [
"critical",
"warning",
"info",
"all"
],
"default": "all"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 200,
"default": 50
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_help_articleSearch Meta Business Help Center articles by query. Returns curated articles relevant to common workflows: rejections, pixel/CAPI setup, audience requirements, billing, learning phase, ad rankings, etc. Mirrors the official Meta MCP tool. Backed by a curated dataset, not a live API — for the most current article, follow the returned URL.Input schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Search query (e.g., 'why was my ad rejected', 'pixel setup', 'lookalike requirements')"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 20,
"default": 5
}
},
"required": [
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_insightsGet performance insights (metrics) for a campaign, ad set, ad, or account. Supports breakdowns, date ranges, attribution windows, and time series. Unsafe combos (account-level + high-cardinality breakdowns, wide date ranges + breakdowns in sync) are rejected early — use ads_run_report_and_wait for those. Recommended: pass filtering=[{field:"ad.impressions",operator:"GREATER_THAN",value:0}] to skip objects without data.Input schema{
"type": "object",
"properties": {
"object_id": {
"type": "string",
"description": "Campaign, Ad Set, Ad, or Account ID (use act_XXX for accounts)"
},
"level": {
"type": "string",
"enum": [
"ad",
"adset",
"campaign",
"account"
],
"description": "Aggregation level — useful when querying account/campaign to break down to ad set or ad level"
},
"time_range": {
"type": "object",
"properties": {
"since": {
"type": "string",
"description": "Start date YYYY-MM-DD"
},
"until": {
"type": "string",
"description": "End date YYYY-MM-DD"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false,
"description": "Custom date range (prefer date_preset when one matches — it's more efficient server-side)"
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"this_quarter",
"maximum",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d",
"last_week_mon_sun",
"last_week_sun_sat",
"last_quarter",
"last_year",
"this_week_mon_today",
"this_week_sun_today",
"this_year"
],
"description": "Predefined date range (preferred over time_range for stability and performance)"
},
"breakdowns": {
"type": "array",
"items": {
"type": "string",
"enum": [
"age",
"gender",
"country",
"region",
"dma",
"impression_device",
"device_platform",
"platform_position",
"publisher_platform",
"product_id",
"frequency_value",
"hourly_stats_aggregated_by_advertiser_time_zone",
"hourly_stats_aggregated_by_audience_time_zone",
"body_asset",
"call_to_action_asset",
"description_asset",
"image_asset",
"link_url_asset",
"title_asset",
"video_asset"
]
},
"description": "Breakdown dimensions. Avoid product_id / asset-level on account-wide queries."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Metrics to retrieve (defaults to standard set)"
},
"action_attribution_windows": {
"type": "array",
"items": {
"type": "string",
"enum": [
"1d_click",
"7d_click",
"1d_view",
"28d_click"
]
}
},
"use_unified_attribution_setting": {
"type": "boolean",
"default": true,
"description": "Default true: match Ads Manager behaviour (Meta change effective 2025-06-10). Set false only for bespoke attribution."
},
"filtering": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"operator": {
"type": "string",
"enum": [
"EQUAL",
"NOT_EQUAL",
"GREATER_THAN",
"GREATER_THAN_OR_EQUAL",
"LESS_THAN",
"LESS_THAN_OR_EQUAL",
"IN_RANGE",
"NOT_IN_RANGE",
"CONTAIN",
"NOT_CONTAIN",
"IN",
"NOT_IN",
"STARTS_WITH"
]
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "array",
"items": {
"type": [
"string",
"number"
]
}
}
]
}
},
"required": [
"field",
"operator",
"value"
],
"additionalProperties": false
},
"description": "Server-side filter, e.g. [{field:\"ad.impressions\",operator:\"GREATER_THAN\",value:0}] to skip empty objects."
},
"time_increment": {
"anyOf": [
{
"type": "number",
"minimum": 1,
"maximum": 90
},
{
"type": "string",
"enum": [
"monthly",
"all_days"
]
}
],
"description": "Time increment for series data — number of days, 'monthly', or 'all_days'"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 1000,
"default": 100
}
},
"required": [
"object_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_instagram_accountGet the Instagram Business account linked to a Facebook Page. Returns the Instagram account ID needed for creating ad creatives with Instagram placement.Input schema{
"type": "object",
"properties": {
"page_id": {
"type": "string",
"description": "Facebook Page ID to look up its linked Instagram Business account"
}
},
"required": [
"page_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_instagram_mediaList recent media posts from an Instagram Business account. Returns media IDs that can be used with source_instagram_media_id in create_ad_creative to promote existing posts.Input schema{
"type": "object",
"properties": {
"instagram_account_id": {
"type": "string",
"description": "Instagram Business account ID (from ads_get_instagram_account)"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Number of posts to return"
}
},
"required": [
"instagram_account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_interest_suggestionsGet interest suggestions based on existing interests. Useful for expanding targeting.Input schema{
"type": "object",
"properties": {
"interest_list": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "List of interest names to get suggestions for"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
}
},
"required": [
"interest_list"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_invoicesGet invoices for a business (Meta's business_invoices), with their PDF download links. Provide business_id directly, or account_id to resolve its business automatically. Optionally filter by date range, invoice_id, or type. Note: Meta only exposes invoices for businesses on a credit line / monthly invoicing, and the access token needs the FINANCE_EDITOR or FINANCE_ANALYST role; card-billed accounts have no API invoices.Input schema{
"type": "object",
"properties": {
"business_id": {
"type": "string",
"description": "Business ID. Either this or account_id is required."
},
"account_id": {
"type": "string",
"description": "Ad account ID. Used to resolve the owning business when business_id is not given."
},
"start_date": {
"type": "string",
"description": "Filter invoices from this date (YYYY-MM-DD)."
},
"end_date": {
"type": "string",
"description": "Filter invoices up to this date (YYYY-MM-DD)."
},
"invoice_id": {
"type": "string",
"description": "Return a single invoice by its invoice_id."
},
"type": {
"type": "string",
"enum": [
"CM",
"DM",
"INV",
"PRO_FORMA"
],
"description": "Invoice type: CM (credit memo), DM (debit memo), INV (invoice), PRO_FORMA."
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Maximum number of invoices to return."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_lead_formsList lead generation forms for a Facebook Page. Returns form details including questions, status, and lead count.Input schema{
"type": "object",
"properties": {
"page_id": {
"type": "string",
"description": "Facebook Page ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to retrieve"
}
},
"required": [
"page_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_leadsDownload leads from a lead generation form. Returns lead data including field values, timestamps, and associated ad/campaign info.Input schema{
"type": "object",
"properties": {
"form_id": {
"type": "string",
"description": "Lead form ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 500,
"default": 100
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to retrieve"
},
"filtering": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"operator": {
"type": "string"
},
"value": {
"type": [
"string",
"number"
]
}
},
"required": [
"field",
"operator",
"value"
],
"additionalProperties": false
},
"description": "Filter leads (e.g., by time_created)"
}
},
"required": [
"form_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_opportunity_scoreGet Meta's Opportunity Score for an account or campaign — a 0-100 health/improvement signal Meta surfaces in Ads Manager. Includes recommendations when available. Mirrors the official Meta MCP tool.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"level": {
"type": "string",
"enum": [
"account",
"campaign"
],
"default": "account"
},
"object_id": {
"type": "string",
"description": "Required when level='campaign' — the campaign ID to score"
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_pages_for_businessGet Facebook Pages associated with an ad account or the authenticated user. Pages are required for creating ad creatives.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID to get associated pages. Omit to get user's own pages."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_pixel_detailsGet detailed information about a specific pixel including its installation code snippet.Input schema{
"type": "object",
"properties": {
"pixel_id": {
"type": "string",
"description": "Pixel ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"pixel_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_pixel_eventsGet event statistics for a pixel. Useful for debugging tracking issues — shows which events are being received and their counts.Input schema{
"type": "object",
"properties": {
"pixel_id": {
"type": "string",
"description": "Pixel ID"
},
"aggregation": {
"type": "string",
"enum": [
"event",
"device",
"url",
"custom_data_field"
],
"default": "event",
"description": "How to aggregate stats"
},
"start_time": {
"type": "string",
"description": "Start time (ISO 8601 or Unix timestamp)"
},
"end_time": {
"type": "string",
"description": "End time (ISO 8601 or Unix timestamp)"
}
},
"required": [
"pixel_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_pixelsList pixels for an ad account. Returns pixel IDs, names, and last fire times.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_report_resultsDownload the results of a completed async report.Input schema{
"type": "object",
"properties": {
"report_run_id": {
"type": "string",
"description": "Report run ID"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 1000,
"default": 500
}
},
"required": [
"report_run_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_report_statusCheck the status of an asynchronous report. Enforces a 5-second minimum between polls for the same report to avoid burning quota. Returns clear guidance on Job Failed / Job Skipped states.Input schema{
"type": "object",
"properties": {
"report_run_id": {
"type": "string",
"description": "Report run ID from ads_create_async_report"
}
},
"required": [
"report_run_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_rule_detailsGet detailed information about an automated rule and its execution history.Input schema{
"type": "object",
"properties": {
"rule_id": {
"type": "string",
"description": "Rule ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
},
"include_history": {
"type": "boolean",
"default": false,
"description": "Include rule execution history"
}
},
"required": [
"rule_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_spend_limitGet spending limits and current spend for an ad account. Shows spend cap, amount spent, daily limits, and remaining balance.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_study_detailsGet detailed information and results of an A/B test study, including per-cell performance and statistical significance.Input schema{
"type": "object",
"properties": {
"study_id": {
"type": "string",
"description": "Study ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"study_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_targeting_descriptionGet a human-readable description of an ad's targeting specification. Can also preview what a targeting_spec would describe before creating an ad set.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID to get targeting description for"
},
"account_id": {
"type": "string",
"description": "Ad account ID (required when using targeting_spec)"
},
"targeting_spec": {
"type": "object",
"additionalProperties": {},
"description": "Targeting spec to preview (same format as ads_create_ad_set targeting). Requires account_id."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_get_video_detailsGet detailed information about a specific video including source URL, thumbnails at different sizes, and processing status.Input schema{
"type": "object",
"properties": {
"video_id": {
"type": "string",
"description": "Video ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"video_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_hide_comment⚠️ Modifies live ads/account data. Hide or unhide a comment on an ad post. Hidden comments are only visible to the commenter and their friends.Input schema{
"type": "object",
"properties": {
"comment_id": {
"type": "string",
"description": "Comment ID to hide/unhide"
},
"is_hidden": {
"type": "boolean",
"default": true,
"description": "true to hide, false to unhide"
}
},
"required": [
"comment_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_insights_advertiser_contextFirst-message account snapshot for an agent: account-level KPIs, top campaigns by spend, and key totals over a date range. Use this when starting an analysis session before drilling into specific campaigns.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"this_quarter",
"maximum",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d",
"last_week_mon_sun",
"last_week_sun_sat",
"last_quarter",
"last_year",
"this_week_mon_today",
"this_week_sun_today",
"this_year"
],
"default": "last_30d"
},
"top_n_campaigns": {
"type": "number",
"minimum": 1,
"maximum": 20,
"default": 5
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_insights_anomaly_signalDetect anomalies by comparing the last N days against the previous N days. Returns metrics whose change exceeds threshold_pct. Useful for `why is spend up?` / `did CPL spike?` workflows.Input schema{
"type": "object",
"properties": {
"object_id": {
"type": "string",
"description": "Account, campaign, ad set, or ad ID"
},
"level": {
"type": "string",
"enum": [
"account",
"campaign",
"ad_set",
"ad"
],
"default": "campaign"
},
"window_days": {
"type": "number",
"minimum": 1,
"maximum": 30,
"default": 7,
"description": "Days in each comparison window"
},
"threshold_pct": {
"type": "number",
"minimum": 1,
"maximum": 500,
"default": 30,
"description": "Min %change to flag as anomaly"
}
},
"required": [
"object_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_insights_auction_ranking_benchmarksQuality, engagement, and conversion rate rankings for an ad in Meta's auction. Only available at level=ad with sufficient delivery (~500 impressions). Useful to diagnose 'below average' creatives that compete poorly.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID (rankings are only published at ad level)"
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"this_quarter",
"maximum",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d",
"last_week_mon_sun",
"last_week_sun_sat",
"last_quarter",
"last_year",
"this_week_mon_today",
"this_week_sun_today",
"this_year"
],
"default": "last_7d"
}
},
"required": [
"ad_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_insights_industry_benchmarkCompare an object's CTR / CPC / CPM against industry medians (when available). For now uses a curated benchmark table; falls back to portfolio averages if industry not specified. Best-effort signal — Meta does not expose an authoritative benchmark API.Input schema{
"type": "object",
"properties": {
"object_id": {
"type": "string",
"description": "Account, campaign, ad set, or ad ID"
},
"level": {
"type": "string",
"enum": [
"account",
"campaign",
"ad_set",
"ad"
],
"default": "campaign"
},
"industry": {
"type": "string",
"enum": [
"igaming",
"ecommerce",
"lead_gen",
"saas",
"finance",
"education",
"default"
],
"default": "default",
"description": "Industry vertical for benchmark lookup"
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"this_quarter",
"maximum",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d",
"last_week_mon_sun",
"last_week_sun_sat",
"last_quarter",
"last_year",
"this_week_mon_today",
"this_week_sun_today",
"this_year"
],
"default": "last_30d"
}
},
"required": [
"object_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_insights_performance_trendTime-series view of core KPIs (spend, impressions, CTR, CPC, conversions) for an account, campaign, ad set, or ad. Choose granularity to bucket the series by day/week/month. Mirrors the official Meta MCP view.Input schema{
"type": "object",
"properties": {
"object_id": {
"type": "string",
"description": "Account, campaign, ad set, or ad ID"
},
"level": {
"type": "string",
"enum": [
"account",
"campaign",
"ad_set",
"ad"
],
"default": "account"
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"this_quarter",
"maximum",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d",
"last_week_mon_sun",
"last_week_sun_sat",
"last_quarter",
"last_year",
"this_week_mon_today",
"this_week_sun_today",
"this_year"
],
"default": "last_30d"
},
"granularity": {
"type": "string",
"enum": [
"daily",
"weekly",
"monthly"
],
"default": "daily"
}
},
"required": [
"object_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_library_abort_run⚠️ Uses your Apify account (paid credits / stored credentials). Abort a running Ad Library scrape to stop it accruing cost. Ads already written to the dataset remain readable with ads_library_get_results.Input schema{
"type": "object",
"properties": {
"run_id": {
"type": "string",
"description": "Run id to abort"
}
},
"required": [
"run_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_library_delete_apify_token⚠️ Uses your Apify account (paid credits / stored credentials). Delete the Apify token stored for the current user. Does not affect the APIFY_TOKEN environment fallback, if one is configured.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
ads_library_get_apify_token_statusCheck whether an Apify token is available for the current user, where it comes from (encrypted per-user storage or the APIFY_TOKEN environment fallback), and optionally verify it is still valid against the Apify API.Input schema{
"type": "object",
"properties": {
"verify": {
"type": "boolean",
"default": false,
"description": "Also call the Apify API to confirm the token still works"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_library_get_resultsRead scraped ads from a completed Ad Library run's dataset. Returns a compact projection of each ad (page, copy, CTA, dates, platforms, spend) by default; pass raw=true for every field the actor produced.Input schema{
"type": "object",
"properties": {
"dataset_id": {
"type": "string",
"description": "Dataset id from ads_library_scrape or ads_library_get_run_status"
},
"offset": {
"type": "integer",
"minimum": 0,
"default": 0,
"description": "Number of ads to skip"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"default": 50,
"description": "Ads to return per call (1-200)"
},
"raw": {
"type": "boolean",
"default": false,
"description": "Return the actor's full untrimmed records instead of the compact projection"
}
},
"required": [
"dataset_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_library_get_run_statusCheck the status of an Ad Library scrape started with ads_library_scrape. Returns the run state, elapsed runtime, accrued cost, and the dataset id to read results from.Input schema{
"type": "object",
"properties": {
"run_id": {
"type": "string",
"description": "Run id returned by ads_library_scrape"
}
},
"required": [
"run_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_library_list_runsList recent Ad Library scrape runs for the current Apify account, newest first. Useful for recovering a run_id or dataset_id, and for reviewing what each run cost.Input schema{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 10,
"description": "Runs to return (1-50)"
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_library_register_apify_token⚠️ Uses your Apify account (paid credits / stored credentials). Register your Apify API token so the ads_library_* tools can scrape the public Meta Ad Library. The token is validated against the Apify API and then stored encrypted (AES-256-GCM) and scoped to your account. Get a token at console.apify.com/settings/integrations. Most users register it on the server's /auth/connections page instead of calling this tool.Input schema{
"type": "object",
"properties": {
"apify_token": {
"type": "string",
"minLength": 10,
"maxLength": 200,
"description": "Apify API token (starts with apify_api_)"
}
},
"required": [
"apify_token"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_library_scrape⚠️ Uses your Apify account (paid credits / stored credentials). Start an asynchronous scrape of the public Meta Ad Library (competitor ad research) via the curious_coder/facebook-ads-library-scraper Apify actor. Costs about $0.75 per 1,000 ads; a hard spend cap derived from "count" is sent to Apify so a run can never bill beyond it. Returns a run_id and dataset_id — poll ads_library_get_run_status, then read ads_library_get_results.Input schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Keyword to search in the Ad Library. Mutually exclusive with 'url'."
},
"url": {
"type": "string",
"description": "An https://www.facebook.com Ad Library search URL or a Facebook page URL to scrape ads from. Mutually exclusive with 'query'."
},
"country": {
"type": "string",
"pattern": "^([A-Z]{2}|ALL)$",
"default": "ALL",
"description": "Uppercase ISO 3166-1 alpha-2 country code (e.g. CO, US), or ALL"
},
"active_status": {
"type": "string",
"enum": [
"all",
"active",
"inactive"
],
"default": "active",
"description": "Filter by whether the ad is currently running"
},
"ad_type": {
"type": "string",
"enum": [
"all",
"political_and_issue_ads",
"housing_ads",
"employment_ads",
"financial_products_and_services_ads"
],
"default": "all",
"description": "Ad Library category filter (applies to keyword searches)"
},
"search_type": {
"type": "string",
"enum": [
"keyword_unordered",
"keyword_exact_phrase"
],
"default": "keyword_unordered",
"description": "Whether the keyword must match as an exact phrase"
},
"period": {
"type": "string",
"enum": [
"last24h",
"last7d",
"last14d",
"last30d"
],
"description": "Date range filter. Only applies when scraping a Facebook page URL. Omit for no date filter."
},
"sort_by": {
"type": "string",
"enum": [
"impressions_desc",
"most_recent"
],
"default": "impressions_desc",
"description": "Result ordering. Only applies when scraping a Facebook page URL."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"default": 100,
"description": "Maximum ads to scrape (1-2000). Drives the spend cap: roughly $0.75 per 1,000 ads."
},
"scrape_ad_details": {
"type": "boolean",
"default": false,
"description": "Also fetch per-ad detail such as EU reach/transparency data. Slower."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_list_tokensList Meta tokens registered for the current authenticated user (or the legacy global pool when running stdio / API key). Never exposes raw token values.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_portfolio_summaryCross-account aggregation: spend, impressions, clicks, CTR, CPC across N ad accounts in parallel. Agency-tier tool — the official Meta MCP cannot do this because it operates one-user/one-account at a time. Use to get a portfolio-level snapshot for the current period.Input schema{
"type": "object",
"properties": {
"account_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 20,
"description": "Up to 20 ad account IDs to aggregate"
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d"
],
"default": "last_30d"
}
},
"required": [
"account_ids"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_rate_statusShow the current Meta API rate-limit usage across tokens, accounts, and use-case types, plus any open circuits and the write-pacer state. Does NOT call Meta — returns in-process state.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_register_token⚠️ Modifies live ads/account data. Register a Meta access token (typically a System User token that does not expire) for the current authenticated user. Validates the token via GET /me before registering. In stdio / API-key mode, falls back to the in-memory legacy registry.Input schema{
"type": "object",
"properties": {
"bm_name": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[a-zA-Z0-9_-]+$",
"description": "Friendly name (a-z, A-Z, 0-9, _, -)"
},
"access_token": {
"type": "string",
"minLength": 10,
"description": "Meta API access token to register"
}
},
"required": [
"bm_name",
"access_token"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_reply_comment⚠️ Modifies live ads/account data. Reply to a comment on an ad post. The reply will appear as a nested comment. Re-running creates duplicate replies — not idempotent.Input schema{
"type": "object",
"properties": {
"comment_id": {
"type": "string",
"description": "Comment ID to reply to"
},
"message": {
"type": "string",
"minLength": 1,
"description": "Reply message text"
}
},
"required": [
"comment_id",
"message"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_run_report_and_wait⚠️ Modifies live ads/account data. Create an async report and wait for completion in one call. Uses safe polling (start 10s, backoff to 60s max) and returns results directly when Job Completed. On timeout, returns the report_run_id so you can continue polling later. Max wait: 3600s.Input schema{
"type": "object",
"properties": {
"object_id": {
"type": "string"
},
"level": {
"type": "string",
"enum": [
"ad",
"adset",
"campaign",
"account"
]
},
"time_range": {
"type": "object",
"properties": {
"since": {
"type": "string"
},
"until": {
"type": "string"
}
},
"required": [
"since",
"until"
],
"additionalProperties": false
},
"date_preset": {
"type": "string",
"enum": [
"today",
"yesterday",
"this_month",
"last_month",
"this_quarter",
"maximum",
"last_3d",
"last_7d",
"last_14d",
"last_28d",
"last_30d",
"last_90d",
"last_week_mon_sun",
"last_week_sun_sat",
"last_quarter",
"last_year",
"this_week_mon_today",
"this_week_sun_today",
"this_year"
]
},
"breakdowns": {
"type": "array",
"items": {
"type": "string",
"enum": [
"age",
"gender",
"country",
"region",
"dma",
"impression_device",
"device_platform",
"platform_position",
"publisher_platform",
"product_id",
"frequency_value",
"hourly_stats_aggregated_by_advertiser_time_zone",
"hourly_stats_aggregated_by_audience_time_zone"
]
}
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
},
"use_unified_attribution_setting": {
"type": "boolean",
"default": true
},
"time_increment": {
"anyOf": [
{
"type": "number",
"minimum": 1,
"maximum": 90
},
{
"type": "string",
"enum": [
"monthly",
"all_days"
]
}
]
},
"max_wait_seconds": {
"type": "number",
"minimum": 30,
"maximum": 3600,
"default": 600
},
"poll_interval_seconds": {
"type": "number",
"minimum": 5,
"maximum": 60,
"default": 10
},
"result_limit": {
"type": "number",
"minimum": 1,
"maximum": 1000,
"default": 500
}
},
"required": [
"object_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_search_behaviorsGet behavior targeting options. Behaviors include purchase behavior, device usage, travel, etc.Input schema{
"type": "object",
"properties": {
"limit": {
"type": "number",
"minimum": 1,
"maximum": 200,
"default": 50
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_search_demographicsGet demographic targeting options by category (e.g., income, family status, education, life events, industries).Input schema{
"type": "object",
"properties": {
"demographic_class": {
"type": "string",
"enum": [
"demographics",
"work_employers",
"work_positions",
"education_schools",
"education_majors",
"family_statuses",
"life_events",
"industries",
"income",
"net_worth",
"home_type",
"home_ownership",
"home_value",
"ethnic_affinity",
"generation",
"politics"
],
"description": "Demographic category to search"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 200,
"default": 50
}
},
"required": [
"demographic_class"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_search_geo_locationsSearch for geographic targeting locations (countries, regions, cities, zip codes, etc.).Input schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Location to search for"
},
"location_types": {
"type": "array",
"items": {
"type": "string",
"enum": [
"country",
"region",
"city",
"zip",
"geo_market",
"electoral_district",
"neighborhood",
"country_group"
]
},
"default": [
"country",
"region",
"city"
],
"description": "Types of locations to include"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
}
},
"required": [
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_search_interestsSearch for interest targeting options by keyword. Returns matching interests with audience sizes.Input schema{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Interest keyword to search"
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25
}
},
"required": [
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
ads_set_active_token⚠️ Modifies live ads/account data. Switch the active Meta API token for the current user (or the legacy global pool when running stdio / API key).Input schema{
"type": "object",
"properties": {
"bm_name": {
"type": "string",
"minLength": 1,
"description": "Name of the registered token / Business Manager to activate"
}
},
"required": [
"bm_name"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_share_custom_audience⚠️ Modifies live ads/account data. Share a custom audience with one or more ad accounts under the same Business Manager. Both source and target accounts must belong to the same BM and the caller needs ads_management on each. Shareable subtypes: CUSTOM, LOOKALIKE, WEBSITE (engagement/offline-conversion audiences cannot be shared — Meta returns code 2655). Re-sharing with the same account is a no-op. After sharing, the target account can target the audience via ads_update_ad_set (targeting.custom_audiences=[{id}]).Input schema{
"type": "object",
"properties": {
"audience_id": {
"type": "string",
"description": "Custom audience ID to share"
},
"ad_account_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Target ad account IDs (numeric or act_<id>). Must be in the same Business Manager as the audience owner."
},
"relationship_type": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional relationship tags (e.g. [\"AGENCY\"])."
}
},
"required": [
"audience_id",
"ad_account_ids"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_unshare_custom_audience⚠️ Modifies live ads/account data. Revoke a custom audience share from one or more ad accounts. Only removes the share relationship — the audience itself remains on the owner account. Use ads_get_audience_shared_accounts first to confirm which accounts currently have access.Input schema{
"type": "object",
"properties": {
"audience_id": {
"type": "string",
"description": "Custom audience ID to unshare"
},
"ad_account_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Ad account IDs to revoke (numeric or act_<id>)."
}
},
"required": [
"audience_id",
"ad_account_ids"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_ad⚠️ Modifies live ads/account data. Update an existing ad's name, status, or creative. To change UTM parameters use ads_update_ad_url_tags — url_tags live on the creative, which is immutable.Input schema{
"type": "object",
"properties": {
"ad_id": {
"type": "string",
"description": "Ad ID to update"
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DELETED",
"ARCHIVED"
]
},
"creative_id": {
"type": "string",
"description": "New creative ID"
}
},
"required": [
"ad_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_ad_creative⚠️ Modifies live ads/account data. Update an existing creative's name. Every other creative field (content, links, url_tags) is immutable after creation — to change an ad's UTM parameters use ads_update_ad_url_tags, which clones the creative and repoints the ad.Input schema{
"type": "object",
"properties": {
"creative_id": {
"type": "string",
"description": "Creative ID to update"
},
"name": {
"type": "string",
"description": "New name for the creative"
}
},
"required": [
"creative_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_ad_rule⚠️ Modifies live ads/account data. Update an existing automated rule's name, status, or specs.Input schema{
"type": "object",
"properties": {
"rule_id": {
"type": "string",
"description": "Rule ID to update"
},
"name": {
"type": "string",
"description": "New name"
},
"status": {
"type": "string",
"enum": [
"ENABLED",
"DISABLED"
],
"description": "Enable or disable the rule"
},
"evaluation_spec": {
"type": "object",
"properties": {
"evaluation_type": {
"type": "string",
"enum": [
"TRIGGER",
"SCHEDULE"
]
},
"filters": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"value": {
"type": [
"string",
"number"
]
},
"operator": {
"type": "string"
}
},
"required": [
"field",
"value",
"operator"
],
"additionalProperties": false
}
}
},
"required": [
"evaluation_type",
"filters"
],
"additionalProperties": false
},
"execution_spec": {
"type": "object",
"properties": {
"execution_type": {
"type": "string",
"enum": [
"PAUSE",
"UNPAUSE",
"CHANGE_BUDGET",
"CHANGE_BID",
"ROTATE",
"NOTIFICATION"
]
},
"execution_options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"value": {
"type": [
"string",
"number"
]
},
"operator": {
"type": "string"
}
},
"required": [
"field",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"execution_type"
],
"additionalProperties": false
}
},
"required": [
"rule_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_ad_set⚠️ Modifies live ads/account data. Update an existing ad set in place. Common use cases: change daily_budget or lifetime_budget (values in cents — e.g., 2000 = $20.00), pause/reactivate via status (ACTIVE/PAUSED), extend end_time, replace targeting, adjust bid_amount/bid_strategy, or rename. Only the fields you pass are sent to Meta — omitted fields keep their current value. lifetime_budget requires a corresponding end_time on the ad set. Authentication is handled transparently: the active Meta token is resolved from the request context (Sign in with Meta OAuth, registered System User token, or X-Meta-Token header in service-to-service mode). Note that meaningful changes to bid_amount, bid_strategy, or targeting can re-trigger Meta's learning phase.Input schema{
"type": "object",
"properties": {
"ad_set_id": {
"type": "string",
"description": "Ad set ID to update"
},
"name": {
"type": "string",
"description": "New ad set name"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DELETED",
"ARCHIVED"
],
"description": "New status. Use ACTIVE to start delivery, PAUSED to stop, ARCHIVED to retire. Use ads_delete_ad_set for soft-deletion."
},
"destination_type": {
"type": "string",
"enum": [
"WEBSITE",
"APP",
"MESSENGER",
"WHATSAPP",
"INSTAGRAM_DIRECT",
"ON_AD",
"ON_PAGE",
"ON_EVENT",
"ON_VIDEO",
"SHOP_AUTOMATIC",
"FACEBOOK",
"FACEBOOK_PAGE",
"INSTAGRAM_PROFILE",
"INSTAGRAM_PROFILE_AND_FACEBOOK_PAGE",
"MESSAGING_INSTAGRAM_DIRECT_MESSENGER",
"MESSAGING_INSTAGRAM_DIRECT_MESSENGER_WHATSAPP",
"MESSAGING_INSTAGRAM_DIRECT_WHATSAPP",
"MESSAGING_MESSENGER_WHATSAPP",
"APPLINKS_AUTOMATIC"
],
"description": "Where the ad traffic is directed. Common values: WEBSITE (website traffic/conversions), APP (app installs), MESSENGER (Messenger conversations), WHATSAPP (WhatsApp conversations), INSTAGRAM_DIRECT (Instagram DMs), ON_AD (lead forms, instant experiences, post engagement), ON_VIDEO (video views), ON_PAGE (page engagement), SHOP_AUTOMATIC (shop)"
},
"daily_budget": {
"type": "number",
"description": "Daily budget in cents (e.g., 2000 = $20.00). Mutually exclusive with lifetime_budget."
},
"lifetime_budget": {
"type": "number",
"description": "Lifetime budget in cents. Requires the ad set to have an end_time set; pass end_time in the same call if it isn't already configured."
},
"targeting": {
"type": "object",
"properties": {
"geo_locations": {
"type": "object",
"properties": {
"countries": {
"type": "array",
"items": {
"type": "string"
}
},
"regions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"cities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"radius": {
"type": "number"
},
"distance_unit": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"zips": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
}
},
"required": [
"key"
],
"additionalProperties": false
}
},
"location_types": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
},
"excluded_geo_locations": {
"$ref": "#/properties/targeting/properties/geo_locations",
"description": "Locations to exclude from targeting"
},
"age_min": {
"type": "number",
"minimum": 13,
"maximum": 65
},
"age_max": {
"type": "number",
"minimum": 13,
"maximum": 65
},
"genders": {
"type": "array",
"items": {
"type": "number",
"minimum": 0,
"maximum": 2
},
"description": "0=all, 1=male, 2=female"
},
"locales": {
"type": "array",
"items": {
"type": "number"
},
"description": "Locale IDs for language targeting (e.g., 6=English, 24=Spanish)"
},
"relationship_statuses": {
"type": "array",
"items": {
"type": "number"
},
"description": "1=single, 2=in_relationship, 3=married, 4=engaged, 6=unspecified"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"behaviors": {
"$ref": "#/properties/targeting/properties/interests"
},
"education_statuses": {
"type": "array",
"items": {
"type": "number"
},
"description": "1=HIGH_SCHOOL, 2=UNDERGRAD, 3=ALUM, 7=IN_GRAD_SCHOOL, 9=MASTER_DEGREE, etc."
},
"education_schools": {
"$ref": "#/properties/targeting/properties/interests"
},
"education_majors": {
"$ref": "#/properties/targeting/properties/interests"
},
"college_years": {
"type": "array",
"items": {
"type": "number"
}
},
"work_employers": {
"$ref": "#/properties/targeting/properties/interests"
},
"work_positions": {
"$ref": "#/properties/targeting/properties/interests"
},
"life_events": {
"$ref": "#/properties/targeting/properties/interests"
},
"industries": {
"$ref": "#/properties/targeting/properties/interests"
},
"income": {
"$ref": "#/properties/targeting/properties/interests"
},
"family_statuses": {
"$ref": "#/properties/targeting/properties/interests"
},
"user_adclusters": {
"$ref": "#/properties/targeting/properties/interests",
"description": "Broad category targeting clusters"
},
"custom_audiences": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"excluded_custom_audiences": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
},
"device_platforms": {
"type": "array",
"items": {
"type": "string"
},
"description": "mobile, desktop"
},
"user_os": {
"type": "array",
"items": {
"type": "string"
},
"description": "OS targeting: iOS, Android, or versioned like iOS_ver_15.0_and_above"
},
"user_device": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target specific devices (e.g., Galaxy S24, iPhone 15)"
},
"excluded_user_device": {
"type": "array",
"items": {
"type": "string"
}
},
"wireless_carrier": {
"type": "array",
"items": {
"type": "string"
},
"description": "Carrier targeting (use 'Wifi' for wifi-only users)"
},
"publisher_platforms": {
"type": "array",
"items": {
"type": "string"
},
"description": "facebook, instagram, threads, messenger, audience_network"
},
"facebook_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "feed, right_hand_column, marketplace, video_feeds, story, search, instream_video, facebook_reels, facebook_reels_overlay, profile_feed, notification"
},
"instagram_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "stream, story, explore, explore_home, reels, profile_feed, ig_search, profile_reels"
},
"threads_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "threads_stream (requires instagram stream)"
},
"audience_network_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "classic, rewarded_video"
},
"messenger_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "sponsored_messages, story"
},
"whatsapp_positions": {
"type": "array",
"items": {
"type": "string"
},
"description": "status (requires instagram story)"
},
"brand_safety_content_filter_levels": {
"type": "array",
"items": {
"type": "string"
},
"description": "FACEBOOK_RELAXED/STANDARD/STRICT, AN_RELAXED/STANDARD/STRICT, FEED_RELAXED/STANDARD/STRICT"
},
"excluded_publisher_categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "dating, gambling, debated_social_issues, mature_audiences, tragedy_and_conflict"
},
"excluded_publisher_list_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Block list IDs to exclude specific publishers"
},
"flexible_spec": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"description": "Array of targeting groups combined with AND; items within each group use OR"
},
"exclusions": {
"type": "object",
"additionalProperties": {}
},
"targeting_automation": {
"type": "object",
"properties": {
"advantage_audience": {
"type": "number",
"description": "1 to enable Advantage+ audience"
}
},
"additionalProperties": true,
"description": "Advantage+ audience automation settings"
}
},
"additionalProperties": true,
"description": "Replacement targeting spec. Replaces the entire targeting object — pass the full spec, not a partial one."
},
"bid_amount": {
"type": "number",
"description": "Bid cap in cents. Only meaningful with bid_strategy = LOWEST_COST_WITH_BID_CAP or COST_CAP."
},
"bid_strategy": {
"type": "string",
"enum": [
"LOWEST_COST_WITHOUT_CAP",
"LOWEST_COST_WITH_BID_CAP",
"COST_CAP",
"LOWEST_COST_WITH_MIN_ROAS"
],
"description": "Bidding strategy. Changing strategy may require corresponding changes to bid_amount."
},
"end_time": {
"type": "string",
"description": "ISO 8601 end time. Required when setting or keeping lifetime_budget."
}
},
"required": [
"ad_set_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_ad_url_tags⚠️ Modifies live ads/account data. Change the UTM parameters (url_tags) of one or more live ads. Meta creatives are immutable, so each ad's creative is cloned with the new url_tags and the ad is repointed at the clone. The clone re-references the source wholesale — the existing Facebook post, the creative spec, or the Instagram post — so media, copy, destination link and CTA are preserved, along with the post's likes and comments. Side effect: every updated ad re-enters Meta review. Ads whose url_tags already match are skipped, so re-running converges — though an ad whose write failed mid-flight gets its own replacement creative on retry, leaving the earlier one unused (the response reports its id). Do not run two batches over the same ads concurrently. Dynamic creatives (asset_feed_spec) are reported as skipped. Use dry_run to preview.Input schema{
"type": "object",
"properties": {
"ad_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 50,
"description": "Ad IDs to update (1-50)"
},
"url_tags": {
"type": "string",
"description": "New UTM query string, e.g. 'utm_source=meta&utm_medium=paid'. A leading '?' is stripped. Pass an empty string to remove tracking parameters."
},
"dry_run": {
"type": "boolean",
"default": false,
"description": "Preview the plan without creating creatives or touching ads"
}
},
"required": [
"ad_ids",
"url_tags"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_campaign⚠️ Modifies live ads/account data. Update an existing campaign's name, status, budget, or bid strategy.Input schema{
"type": "object",
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign ID to update"
},
"name": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"ACTIVE",
"PAUSED",
"DELETED",
"ARCHIVED"
]
},
"daily_budget": {
"type": "number",
"description": "Daily budget in cents"
},
"lifetime_budget": {
"type": "number",
"description": "Lifetime budget in cents"
},
"bid_strategy": {
"type": "string",
"enum": [
"LOWEST_COST_WITHOUT_CAP",
"LOWEST_COST_WITH_BID_CAP",
"COST_CAP",
"LOWEST_COST_WITH_MIN_ROAS"
]
}
},
"required": [
"campaign_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_entity⚠️ Modifies live ads/account data. Generic updater for a campaign, ad set, or ad. Pass the changes in 'updates'. Mirrors the official Meta MCP vocabulary; equivalent to ads_update_campaign / ads_update_ad_set / ads_update_ad. Only the fields you pass are sent to Meta — omitted fields keep their current value.Input schema{
"type": "object",
"properties": {
"entity_type": {
"type": "string",
"enum": [
"campaign",
"ad_set",
"ad"
],
"description": "Which entity to update: 'campaign', 'ad_set', or 'ad'"
},
"entity_id": {
"type": "string",
"description": "ID of the entity to update"
},
"updates": {
"type": "object",
"additionalProperties": {},
"description": "Fields to update (e.g. { name, status, daily_budget }). See entity-specific update tools for valid keys per type. Complex fields (targeting, creative, evaluation_spec) are JSON-encoded automatically."
}
},
"required": [
"entity_type",
"entity_id",
"updates"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_update_spend_cap⚠️ Modifies live ads/account data. Update the spending limit (spend cap) for an ad account. Set to 0 or omit to remove the cap.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"spend_cap": {
"type": "number",
"minimum": 0,
"description": "New spend cap in cents (e.g., 100000 = $1,000.00). Use 0 to remove."
}
},
"required": [
"account_id",
"spend_cap"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
ads_upload_ad_image⚠️ Modifies live ads/account data. Upload an image to Meta for use in ad creatives. Provide an image URL — the server will download and upload it to Meta. Returns an image hash for use in ads_create_ad_creative.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"image_url": {
"type": "string",
"description": "URL of the image to upload"
},
"name": {
"type": "string",
"description": "Optional name for the image"
}
},
"required": [
"account_id",
"image_url"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
ads_upload_ad_video⚠️ Modifies live ads/account data. Upload a video to Meta for use in ad creatives. Provide either a public video URL (file_url) or an Instagram media ID (source_instagram_media_id) to upload directly from IG. Returns a video_id for use in ads_create_ad_creative. Useful for promoting Instagram Reels.Input schema{
"type": "object",
"properties": {
"account_id": {
"type": "string",
"description": "Ad account ID"
},
"file_url": {
"type": "string",
"description": "Public URL of the video file (MP4). Required unless source_instagram_media_id is provided. Can be an Instagram Reel media_url."
},
"source_instagram_media_id": {
"type": "string",
"description": "Instagram media ID (V2) to upload an IG video directly to the ad library. Alternative to file_url — simplifies the Reel promotion flow."
},
"name": {
"type": "string",
"description": "Name of the video in the ad library (for organization). Different from title."
},
"title": {
"type": "string",
"description": "Title for the video"
},
"description": {
"type": "string",
"description": "Description for the video"
}
},
"required": [
"account_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
whatsapp_create_flow⚠️ Modifies live WhatsApp Business data. Create a WhatsApp Flow (draft). Optionally provide flow_json to set the flow content in the same call, clone_flow_id to copy an existing flow, or publish=true to publish immediately (only works if the flow has no validation errors).Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Flow name."
},
"categories": {
"type": "array",
"items": {
"type": "string",
"enum": [
"SIGN_UP",
"SIGN_IN",
"APPOINTMENT_BOOKING",
"LEAD_GENERATION",
"CONTACT_US",
"CUSTOMER_SUPPORT",
"SURVEY",
"OTHER"
]
},
"minItems": 1,
"description": "Flow categories (at least one)."
},
"flow_json": {
"type": "string",
"description": "Stringified Flow JSON defining the screens and logic."
},
"clone_flow_id": {
"type": "string",
"description": "Existing flow ID to clone content from."
},
"endpoint_uri": {
"type": "string",
"format": "uri",
"description": "Data endpoint URL for dynamic flows (Flow JSON 3.0+)."
},
"publish": {
"type": "boolean",
"description": "Publish immediately after creation (requires valid flow_json)."
}
},
"required": [
"waba_id",
"name",
"categories"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
whatsapp_create_qr_code⚠️ Modifies live WhatsApp Business data. Create a QR code deep link for a WhatsApp phone number. Scanning it opens a chat with the prefilled message. Returns the code, wa.me deep link, and optionally a QR image URL.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID."
},
"prefilled_message": {
"type": "string",
"minLength": 1,
"maxLength": 140,
"description": "Message prefilled in the user's chat when they scan the code."
},
"generate_qr_image": {
"type": "string",
"enum": [
"SVG",
"PNG"
],
"description": "Also return a rendered QR image in this format."
}
},
"required": [
"phone_number_id",
"prefilled_message"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
whatsapp_create_template⚠️ Modifies live WhatsApp Business data. Create a message template on a WhatsApp Business Account. The template enters Meta's review queue (status PENDING). Name must be lowercase letters, digits and underscores. AUTHENTICATION templates only accept OTP-style components. Meta may recategorize the template unless allow_category_change is false.Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
},
"name": {
"type": "string",
"maxLength": 512,
"pattern": "^[a-z0-9_]+$",
"description": "Template name (lowercase, digits, underscores)."
},
"category": {
"type": "string",
"enum": [
"MARKETING",
"UTILITY",
"AUTHENTICATION"
],
"description": "Template category."
},
"language": {
"type": "string",
"pattern": "^[a-z]{2}(_[A-Z]{2})?$",
"description": "Language/locale code (e.g. en_US, es_MX)."
},
"components": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {},
"description": "Template component object (type HEADER/BODY/FOOTER/BUTTONS plus its fields)."
},
"minItems": 1,
"description": "Template components array, e.g. [{\"type\":\"BODY\",\"text\":\"Hi {{1}}\"},{\"type\":\"FOOTER\",\"text\":\"Reply STOP to opt out\"}]."
},
"allow_category_change": {
"type": "boolean",
"default": true,
"description": "Let Meta recategorize automatically instead of rejecting on category mismatch."
},
"parameter_format": {
"type": "string",
"enum": [
"POSITIONAL",
"NAMED"
],
"description": "Placeholder style: {{1}} (POSITIONAL) or {{name}} (NAMED)."
}
},
"required": [
"waba_id",
"name",
"category",
"language",
"components"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
whatsapp_delete_flow⚠️ Modifies live WhatsApp Business data. Delete a flow. Only DRAFT flows can be deleted — published flows must be deprecated instead. Cannot be undone.Input schema{
"type": "object",
"properties": {
"flow_id": {
"type": "string",
"description": "Flow ID to delete (must be in DRAFT status)."
}
},
"required": [
"flow_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
whatsapp_delete_qr_code⚠️ Modifies live WhatsApp Business data. Delete a QR code deep link. Scans of the printed code stop working. Cannot be undone.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID."
},
"code": {
"type": "string",
"description": "QR code id to delete."
}
},
"required": [
"phone_number_id",
"code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
whatsapp_delete_template⚠️ Modifies live WhatsApp Business data. Delete a message template by name. Without hsm_id, ALL language versions of that name are deleted. Deleted template names cannot be reused for ~4 weeks (pending deletion). Cannot be undone.Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
},
"name": {
"type": "string",
"maxLength": 512,
"pattern": "^[a-z0-9_]+$",
"description": "Template name to delete."
},
"hsm_id": {
"type": "string",
"description": "Specific template ID to delete only one language version instead of all."
}
},
"required": [
"waba_id",
"name"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
whatsapp_deprecate_flow⚠️ Modifies live WhatsApp Business data. Deprecate a PUBLISHED flow. IRREVERSIBLE — a deprecated flow can never be reactivated; users who open it see an error. Only use when the flow is retired for good.Input schema{
"type": "object",
"properties": {
"flow_id": {
"type": "string",
"description": "Flow ID to deprecate."
}
},
"required": [
"flow_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": true,
"idempotentHint": true
} | — | DestructiveIdempotent | — |
whatsapp_deregister_phone⚠️ Modifies live WhatsApp Business data. Deregister a phone number from the WhatsApp Cloud API. Reversible: the number stays on the WABA and can be re-registered with whatsapp_register_phone.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID to deregister."
}
},
"required": [
"phone_number_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_get_analyticsGet WhatsApp Business Account analytics: MESSAGING (messages sent/delivered), CONVERSATION (legacy conversation counts and cost), or PRICING (per-message pricing analytics, current model since July 2025).Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
},
"metric_type": {
"type": "string",
"enum": [
"MESSAGING",
"CONVERSATION",
"PRICING"
],
"default": "MESSAGING",
"description": "Which analytics family to query."
},
"start": {
"type": "string",
"description": "Start of range: YYYY-MM-DD or UNIX seconds."
},
"end": {
"type": "string",
"description": "End of range: YYYY-MM-DD or UNIX seconds."
},
"granularity": {
"type": "string",
"enum": [
"HALF_HOUR",
"DAY",
"MONTH"
],
"default": "DAY",
"description": "Aggregation granularity (mapped automatically per metric family)."
},
"dimensions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Breakdown dimensions for CONVERSATION/PRICING, e.g. CONVERSATION_CATEGORY, PRICING_CATEGORY, COUNTRY, PHONE."
},
"phone_numbers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter to specific phone numbers (display format, e.g. +16505551111)."
}
},
"required": [
"waba_id",
"start",
"end"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_business_accountsList WhatsApp Business Accounts (WABAs) owned by or shared with a business, or get details for one WABA. Without business_id, discovers WABAs across the businesses the token can access. Use this first to find the waba_id required by the other whatsapp_* tools. If Meta returns a permission error (code 200/10), the access token was issued without the whatsapp_business_management scope — re-authorize via the OAuth flow to grant WhatsApp permissions.Input schema{
"type": "object",
"properties": {
"business_id": {
"type": "string",
"description": "Business ID to list WABAs for. Omit to scan all accessible businesses."
},
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID. Provide to fetch details for a single WABA."
},
"include_client_wabas": {
"type": "boolean",
"default": true,
"description": "Also list WABAs shared with the business by clients (client_whatsapp_business_accounts)."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to return per WABA."
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Maximum WABAs to return."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_business_profileGet the WhatsApp business profile shown to customers for a phone number: about text, address, description, email, websites, vertical, and profile picture URL.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID."
}
},
"required": [
"phone_number_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_flowsList WhatsApp Flows on a WhatsApp Business Account, or get full details for one flow (including validation errors and a web preview URL).Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID to list flows for."
},
"flow_id": {
"type": "string",
"description": "Flow ID for single-flow details."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to return per flow."
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Maximum flows to return."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_phone_numbersList phone numbers registered on a WhatsApp Business Account, or get details for a single phone number. Shows verification status, quality rating, and messaging throughput.Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID to list phone numbers for."
},
"phone_number_id": {
"type": "string",
"description": "Phone number ID for single-number details."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to return per phone number."
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"default": 25,
"description": "Maximum phone numbers to return."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_qr_codesList QR code deep links for a WhatsApp phone number, or get one by its code. Each QR code opens a chat with a prefilled message when scanned.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID."
},
"code": {
"type": "string",
"description": "Specific QR code id to fetch."
}
},
"required": [
"phone_number_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_template_analyticsGet per-template performance analytics (sent, delivered, read, clicked) for up to 10 templates. Window must be within the last 90 days; granularity is always DAILY. Requires template analytics to be enabled on the WABA (is_enabled_for_insights) — if Meta returns an error saying it is disabled, report it to the user instead of enabling it (enabling is irreversible).Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
},
"start": {
"type": "string",
"description": "Start of range: YYYY-MM-DD or UNIX seconds (max 90 days back)."
},
"end": {
"type": "string",
"description": "End of range: YYYY-MM-DD or UNIX seconds."
},
"template_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 10,
"description": "Template IDs to report on (1-10)."
},
"metric_types": {
"type": "array",
"items": {
"type": "string",
"enum": [
"SENT",
"DELIVERED",
"READ",
"CLICKED"
]
},
"description": "Metrics to include. Defaults to all."
}
},
"required": [
"waba_id",
"start",
"end",
"template_ids"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_templatesList message templates on a WhatsApp Business Account (filterable by name, status, category, language), or get full details (including components) for a single template by ID.Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID to list templates for."
},
"template_id": {
"type": "string",
"description": "Template ID for single-template details."
},
"name": {
"type": "string",
"description": "Filter by template name (prefix match)."
},
"status": {
"type": "string",
"enum": [
"APPROVED",
"PENDING",
"REJECTED",
"PAUSED",
"DISABLED",
"IN_APPEAL"
],
"description": "Filter by review status."
},
"category": {
"type": "string",
"enum": [
"MARKETING",
"UTILITY",
"AUTHENTICATION"
],
"description": "Filter by category."
},
"language": {
"type": "string",
"description": "Filter by language code (e.g. en_US, es_MX)."
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields to return per template."
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 200,
"default": 25,
"description": "Maximum templates to return."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_get_webhook_subscriptionsList the apps subscribed to webhook events on a WhatsApp Business Account, including any callback URI override.Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
}
},
"required": [
"waba_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"readOnlyHint": true
} | — | Read only | — |
whatsapp_publish_flow⚠️ Modifies live WhatsApp Business data. Publish a DRAFT flow so it can be sent to users. Fails if the flow has validation errors (check with whatsapp_get_flows first). Published flows cannot be edited — only cloned or deprecated.Input schema{
"type": "object",
"properties": {
"flow_id": {
"type": "string",
"description": "Flow ID to publish."
}
},
"required": [
"flow_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_register_phone⚠️ Modifies live WhatsApp Business data. Register a phone number for use with the WhatsApp Cloud API. Requires the number's 6-digit two-step verification PIN. If the PIN is rejected, the number already has two-step verification enabled with a different PIN — do not retry with guesses.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID to register."
},
"pin": {
"type": "string",
"pattern": "^\\d{6}$",
"description": "6-digit two-step verification PIN."
},
"data_localization_region": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "Optional 2-letter country code for local storage of messages (e.g. 'BR', 'IN')."
}
},
"required": [
"phone_number_id",
"pin"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_request_verification_code⚠️ Modifies live WhatsApp Business data. Request an ownership verification code for a not-yet-verified phone number, delivered via SMS or voice call. Each call sends a new code. Only applies to numbers whose code_verification_status is not VERIFIED.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID to verify."
},
"code_method": {
"type": "string",
"enum": [
"SMS",
"VOICE"
],
"description": "How to deliver the code."
},
"language": {
"type": "string",
"default": "en_US",
"description": "Locale for the code message (e.g. en_US, es_ES)."
}
},
"required": [
"phone_number_id",
"code_method"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": false
} | — | Non-destructiveNon-idempotent | — |
whatsapp_subscribe_webhook⚠️ Modifies live WhatsApp Business data. Subscribe the Meta app that owns this access token to webhook events on a WABA (messages, template status updates, etc.). Events are delivered to the app's configured webhook endpoint — this server does not receive them. Optionally override the callback URL for this WABA (override_callback_uri and verify_token must be provided together).Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
},
"override_callback_uri": {
"type": "string",
"format": "uri",
"description": "Alternate callback URL for this WABA only (requires verify_token)."
},
"verify_token": {
"type": "string",
"description": "Verify token Meta will send to the override callback (required with override_callback_uri)."
}
},
"required": [
"waba_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_unsubscribe_webhook⚠️ Modifies live WhatsApp Business data. Unsubscribe the Meta app that owns this access token from webhook events on a WABA. The app stops receiving message and template events for this account.Input schema{
"type": "object",
"properties": {
"waba_id": {
"type": "string",
"description": "WhatsApp Business Account ID."
}
},
"required": [
"waba_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_update_business_profile⚠️ Modifies live WhatsApp Business data. Update the WhatsApp business profile for a phone number. Only provided fields are changed. Profile picture updates are not supported here (they require a resumable media upload).Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID."
},
"about": {
"type": "string",
"maxLength": 139,
"description": "Profile about text (max 139 chars)."
},
"address": {
"type": "string",
"maxLength": 256,
"description": "Business address."
},
"description": {
"type": "string",
"maxLength": 512,
"description": "Business description (max 512 chars)."
},
"email": {
"type": "string",
"format": "email",
"description": "Contact email."
},
"websites": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"maxItems": 2,
"description": "Up to 2 website URLs."
},
"vertical": {
"type": "string",
"enum": [
"UNDEFINED",
"OTHER",
"AUTO",
"BEAUTY",
"APPAREL",
"EDU",
"ENTERTAIN",
"EVENT_PLAN",
"FINANCE",
"GROCERY",
"GOVT",
"HOTEL",
"HEALTH",
"NONPROFIT",
"PROF_SERVICES",
"RETAIL",
"TRAVEL",
"RESTAURANT",
"NOT_A_BIZ"
],
"description": "Business industry vertical."
}
},
"required": [
"phone_number_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_update_flow⚠️ Modifies live WhatsApp Business data. Update a flow's metadata (name, categories, endpoint) and/or replace its Flow JSON content. Content updates only apply to DRAFT flows — published flows must be cloned first. Always check validation_errors in the response before publishing.Input schema{
"type": "object",
"properties": {
"flow_id": {
"type": "string",
"description": "Flow ID to update."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "New flow name."
},
"categories": {
"type": "array",
"items": {
"type": "string",
"enum": [
"SIGN_UP",
"SIGN_IN",
"APPOINTMENT_BOOKING",
"LEAD_GENERATION",
"CONTACT_US",
"CUSTOMER_SUPPORT",
"SURVEY",
"OTHER"
]
},
"minItems": 1,
"description": "New categories."
},
"endpoint_uri": {
"type": "string",
"format": "uri",
"description": "New data endpoint URL."
},
"flow_json": {
"type": "string",
"description": "Stringified Flow JSON to replace the flow content."
}
},
"required": [
"flow_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_update_qr_code⚠️ Modifies live WhatsApp Business data. Update the prefilled message of an existing QR code deep link. The code and deep link URL stay the same.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID."
},
"code": {
"type": "string",
"description": "QR code id to update."
},
"prefilled_message": {
"type": "string",
"minLength": 1,
"maxLength": 140,
"description": "New prefilled message."
}
},
"required": [
"phone_number_id",
"code",
"prefilled_message"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_update_template⚠️ Modifies live WhatsApp Business data. Edit a message template's components, category, or message TTL. Only templates in APPROVED, REJECTED, or PAUSED status can be edited. APPROVED templates can be edited at most once per 24 hours and 10 times per month; editing re-triggers review (status returns to PENDING). Do NOT retry on an edit-limit error.Input schema{
"type": "object",
"properties": {
"template_id": {
"type": "string",
"description": "Template ID to edit."
},
"components": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {},
"description": "Template component object (type HEADER/BODY/FOOTER/BUTTONS plus its fields)."
},
"description": "Replacement components array (replaces ALL components)."
},
"category": {
"type": "string",
"enum": [
"MARKETING",
"UTILITY",
"AUTHENTICATION"
],
"description": "New category."
},
"message_send_ttl_seconds": {
"type": "integer",
"description": "Custom time-to-live for sent messages, in seconds."
}
},
"required": [
"template_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
whatsapp_verify_code⚠️ Modifies live WhatsApp Business data. Submit the verification code received via whatsapp_request_verification_code to complete phone number ownership verification.Input schema{
"type": "object",
"properties": {
"phone_number_id": {
"type": "string",
"description": "Phone number ID being verified."
},
"code": {
"type": "string",
"pattern": "^\\d{4,8}$",
"description": "Verification code received via SMS or voice."
}
},
"required": [
"phone_number_id",
"code"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"destructiveHint": false,
"idempotentHint": true
} | — | Non-destructiveIdempotent | — |
Resources 0
- None observed.
Resource templates 0
- None observed.
Prompts 0
- None observed.
Remote endpoints
| Endpoint | Transport | Authentication | Health | Observed |
|---|---|---|---|---|
| No verified remote endpoint is linked. | ||||
Meta Ads MCP Server questions
How do I install Meta Ads MCP Server?
No verified package installation command is available in the retained catalog evidence.
What tools does Meta Ads MCP Server provide?
Meta Ads MCP Server exposed 135 tools during independent protocol observation, including ads_activate_entity, ads_bulk_create_video_ads, ads_clone_ad_set_bundle, ads_create_ad, ads_create_ad_creative, ads_create_ad_rule, ads_create_ad_set, ads_create_ad_study, and others.
Is Meta Ads MCP Server secure?
The selected current version does not yet have completed public verification. Unknown does not mean clean or vulnerable.
Explore related MCP server guides
Curated product and capability guides containing this catalog record.