meta-ads-manager-mcp
Allows creating and managing Facebook ad campaigns, including creating full campaigns with ad sets, creatives, and ads, checking status, pausing, activating, and deleting campaigns.
Allows creating and managing Instagram ad campaigns, utilizing the same tools for campaign, ad set, creative, and ad management.
Provides tools for creating and managing Meta (Facebook/Instagram) ad campaigns, including campaign creation, status checking, pausing, activating, and deleting.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@meta-ads-manager-mcp Create a campaign targeting US women 25-40 with daily budget $30."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
meta-ads-manager-mcp
MCP server for creating and managing Meta (Facebook/Instagram) ad campaigns directly from Claude. Tell Claude what you want. It deploys.
Built by Attainment Labs.
Status in the Meta Ads ecosystem
This is an early independent open source Meta Ads MCP server, first published in February 2026 before Meta later introduced its official Ads AI Connectors and hosted Ads MCP endpoint.
Use Meta's official connector if you want Meta-hosted OAuth and first-party support. Use this project if you want a lightweight, self-managed MCP server that you can inspect, fork, and run with your own Meta app credentials.
Related:
Related MCP server: Meta Ads MCP
What it does
Add this server to your Claude config. You get campaign creation, reporting, bulk operations, budget control, and safety tools:
Tool | What it does |
| Create a full campaign: campaign, ad set, creatives, and ads |
| Confirm connected ad account, currency, timezone, spend, balance, and status |
| List recent campaigns in the configured ad account |
| List recent ad sets in the configured ad account |
| List recent ads in the configured ad account |
| Check status of a campaign, its ad sets, and ads |
| Pull account, campaign, ad set, or ad performance insights |
| Upload an image and return the image hash for creatives |
| Update campaign or ad set daily budget |
| Bulk pause, activate, or delete campaigns |
| Pause a live campaign |
| Activate a paused campaign |
| Permanently delete a campaign |
All campaigns are created as PAUSED by default. You review before spending.
Safety controls:
dry_run=Trueby default on campaign creation, media upload, budget updates, and bulk status changes.confirm=Trueis required for live campaign creation, uploads, budget updates, activation, deletion, and bulk status changes.META_ADS_MAX_DAILY_BUDGET_CENTScan cap campaign and ad set daily budgets.META_ADS_AUDIT_LOG_PATHcan set a JSONL audit log path. Default is~/.meta-ads-mcp/audit.jsonl.
Install
Option 1: Let Claude set it up for you (easiest)
If you use Claude Code, paste this prompt:
"Set up meta-ads-mcp for me: https://github.com/attainmentlabs/meta-ads-mcp"
Claude will check your environment, walk you through getting your Meta credentials step by step, edit your ~/.mcp.json, and confirm when it's done. No docs to read.
Option 2: uvx (recommended, no install needed)
# No setup required. uvx runs it directlyAdd to ~/.mcp.json:
{
"mcpServers": {
"meta-ads": {
"command": "uvx",
"args": ["meta-ads-manager-mcp"],
"env": {
"META_ACCESS_TOKEN": "your-token-here",
"META_AD_ACCOUNT_ID": "your-account-id",
"META_PAGE_ID": "your-page-id",
"META_ADS_MAX_DAILY_BUDGET_CENTS": "5000"
}
}
}
}Option 2: pip install
pip install meta-ads-manager-mcpThen in ~/.mcp.json:
{
"mcpServers": {
"meta-ads": {
"command": "meta-ads-manager-mcp",
"env": {
"META_ACCESS_TOKEN": "your-token-here",
"META_AD_ACCOUNT_ID": "your-account-id",
"META_PAGE_ID": "your-page-id",
"META_ADS_MAX_DAILY_BUDGET_CENTS": "5000"
}
}
}
}Credentials
You need three values from Meta. Full step-by-step walkthrough: SETUP.md
Variable | Where to find it |
| Graph API Explorer. Long-lived token with |
| Business Manager: Ad Accounts. Numbers only, no |
| Facebook Page: About → Page transparency → Page ID |
| Optional daily budget guardrail |
| Optional JSONL audit log path |
The access token expires after 60 days. See SETUP.md for the exchange flow.
Usage examples
Once the server is connected, just describe what you want:
Create a campaign:
"Create a Meta campaign targeting US fitness enthusiasts aged 25-40. Daily budget $30. Use the image at /Users/me/ads/hero.jpg. Copy: 'Track every rep. Hit every goal.' Headline: 'FitCommit AI'. CTA: Learn More. Link to fitcommit.ai."
Check status:
"What's the status of campaign 120243616427570285?"
List campaigns:
"List my recent Meta campaigns."
Pull insights:
"Show Meta ad account insights for the last 7 days by campaign."
Update budget safely:
"Dry run a budget update to set ad set 120243616427570285 to $30 per day."
Bulk pause:
"Dry run pausing these three campaigns: 111, 222, 333."
Pause:
"Pause campaign 120243616427570285."
Activate:
"Go live with campaign 120243616427570285."
Delete:
"Delete campaign 120243616427570285."
dry_run mode
create_meta_campaign, upload_ad_image, update_daily_budget, and bulk_update_campaign_status default to dry_run=True. This simulates API calls and returns fake IDs or planned changes without making requests or spending money.
For live changes, set dry_run=False and confirm=True.
activate_campaign and delete_campaign also require confirm=True.
YAML workflow
Prefer writing campaigns as config files? Use meta-ads-cli, the companion CLI tool.
Requirements
Python 3.10+
uvfor the uvx install pathA Meta Business Manager account with an ad account and Facebook Page
License
MIT
Available Tools
13 toolsactivate_campaignA
Activate (unpause) a Meta campaign. This will resume ad spending.
The campaign must have a valid payment method and approved creatives. Set confirm=True after reviewing the campaign in Ads Manager.
Inputs: campaign_id (required), confirm.
bulk_update_campaign_statusA
Bulk pause, activate, or delete campaigns.
status must be PAUSED, ACTIVE, or DELETED. dry_run defaults to True. Set dry_run=False and confirm=True after reviewing the campaign IDs.
Inputs: status (required), campaign_ids (required), confirm, dry_run.
create_meta_campaignA
Create a complete Meta ad campaign: campaign, ad set, creatives, and ads.
Each item in ads is a dict with:
name (str): ad name
image_path (str): absolute path to image file on disk
primary_text (str): ad body copy
headline (str): ad headline
link (str): destination URL
cta (str, optional): call-to-action button, default "LEARN_MORE"
description (str, optional): ad description text
daily_budget_cents: budget in cents. 1000 = $10/day, 3000 = $30/day.
dry_run: when True (default), simulates all API calls without spending money. Set dry_run=False to actually deploy. All campaigns start as PAUSED regardless. confirm: required when dry_run=False. This is the approval gate.
Valid objectives: OUTCOME_TRAFFIC, OUTCOME_AWARENESS, OUTCOME_ENGAGEMENT, OUTCOME_LEADS, OUTCOME_SALES, OUTCOME_APP_PROMOTION
Valid CTAs: LEARN_MORE, SIGN_UP, DOWNLOAD, SHOP_NOW, BOOK_NOW, GET_OFFER, SUBSCRIBE, CONTACT_US, APPLY_NOW, WATCH_MORE, INSTALL_MOBILE_APP
Inputs: ad_set_name (required), campaign_name (required), ads, age_max, +7 more.
delete_campaignA
Permanently delete a Meta campaign. This cannot be undone.
Set confirm=True after reviewing the campaign ID.
Inputs: campaign_id (required), confirm.
get_ad_account_summaryA
Get the configured Meta ad account summary.
Read-only. Use this before campaign work to confirm the connected account, currency, timezone, spend, balance, and account status.
Inputs: no named parameters.
get_campaign_statusB
Get the status of a Meta campaign including its ad sets and ads.
Returns campaign name, status, objective, and lists of ad sets and ads with their statuses and budgets.
Inputs: campaign_id (required).
get_meta_insightsB
Get Meta Ads performance insights.
Read-only. object_id can be an ad account, campaign, ad set, or ad ID. Leave object_id blank to use the configured ad account. Use level for account breakdowns such as campaign, adset, or ad.
Inputs: level, limit, object_id, date_preset.
list_adsA
List recent ads in the configured Meta ad account.
Read-only. Use this to find ad IDs and inspect delivery status.
Inputs: limit.
list_ad_setsA
List recent ad sets in the configured Meta ad account.
Read-only. Use this to find ad set IDs before budget or status changes.
Inputs: limit.
list_campaignsA
List recent campaigns in the configured Meta ad account.
Read-only. Use this to find campaign IDs before status, insights, budget, pause, activate, or bulk operations.
Inputs: limit.
pause_campaignB
Pause a live Meta campaign. Safe to call on already-paused campaigns.
Inputs: campaign_id (required).
update_daily_budgetA
Update daily budget for a campaign or ad set.
dry_run defaults to True. Set dry_run=False and confirm=True after review. If META_ADS_MAX_DAILY_BUDGET_CENTS is set, the budget cannot exceed it.
Inputs: object_id (required), daily_budget_cents (required), confirm, dry_run.
upload_ad_imageA
Upload an image to the configured Meta ad account.
dry_run defaults to True. Set dry_run=False and confirm=True to upload. Returns an image hash that can be used in ad creatives.
Inputs: image_path (required), confirm, dry_run.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Most tools target distinct resources or actions, and descriptions clarify intent. There is some overlap between single-campaign pause/activate/delete and bulk_update_campaign_status, and get_campaign_status overlaps with list_campaigns/list_ad_sets/list_ads.
All tools use snake_case with a predictable verb-first pattern such as list_campaigns, get_meta_insights, update_daily_budget, and delete_campaign. Minor additions like "meta" or "bulk" do not break consistency.
The server has 13 tools, which is well within a reasonable range for an ad campaign management surface. Each tool has a plausible place in the workflow, from account summary and listing to creation, budget updates, and status controls.
Campaign-level CRUD is mostly covered: create, list, inspect status, update budget, pause/activate, delete, and bulk status updates. However, ad sets, ads, and creatives are not independently manageable after creation, and there are no update operations for targeting, creative content, bidding, or ad/ad set lifecycle beyond budget and campaign status.
Maintenance
Related MCP Connectors
The simplest way to manage your Meta (Facebook and Instagram) ad accounts with your AI agent.
Create, launch, and manage Meta + Google ads from Claude and ChatGPT.
Run Google Ads and Meta Ads from ChatGPT or Claude: audit wasted spend, create and manage campaigns.
Launch Meta ads with your AI agent. Bulk-create Facebook and Instagram ads, import creatives from public Google Drive links, and launch partnership ads with authorized creators. Reuse proven ad settings, create fresh variations, and review saved builds and previews before launch. Requires an Ads Uploader account with MCP access and a connected Meta account.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to manage Facebook and Instagram advertising campaigns through the Meta Marketing API. Supports full campaign lifecycle management, performance analytics, audience targeting, and creative optimization.-
- AlicenseAqualityDmaintenanceEnables AI assistants to manage Meta Ads (Facebook, Instagram) end-to-end through natural conversation, including launching campaigns, uploading creatives, updating budgets, and analyzing performance.42Business Source 1.1
- AlicenseNot gradedqualityDmaintenanceEnables Claude to fetch and analyze Meta ad accounts, campaigns, ad sets, ads, and performance insights via the Meta Marketing API.736 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to create, manage, and automate Meta (Facebook/Instagram) ads campaigns via the Marketing API, with safe defaults and AI-generated creative.1MIT