Install
openclaw skills install @jeannen/meta-ads-mcpCreate, edit, and report on Meta (Facebook and Instagram) ads from an AI agent through the AdKit MCP connector: campaigns, ad sets, ads, carousels, media upload, interest search, and results. Every change is saved as a draft that the user approves before it goes live. Use when the user wants to run, change, or check Facebook or Instagram ads. Not for Meta ad strategy: use meta-ads-strategy for that.
openclaw skills install @jeannen/meta-ads-mcpThis skill tells you how to create, edit, and report on Facebook and Instagram ads through AdKit. It covers the steps. For what to build (objective, audience, creative, budget), read the meta-ads-strategy skill.
AdKit is one MCP connector for Meta, Google, TikTok, LinkedIn, Microsoft, Reddit, X, and Pinterest ads.
https://mcp.adkit.so, then sign in.claude mcp add --transport http adkit https://mcp.adkit.soFor other AI apps, see how to set up the AdKit MCP server for Meta Ads. If the AdKit tools are not available, tell the user how to connect. Then stop.
| Entity | Actions |
|---|---|
campaigns | list, get, create, update, delete |
adsets | list, get, create, update, delete |
ads | list, get, create, update, delete |
media | list, upload, delete (images and videos) |
research | interests (find interest IDs for targeting) |
lead-forms | list (existing Instant Forms of a Facebook Page) |
conversions | list (custom conversions and recent pixel events) |
results | list (spend, impressions, clicks, conversions, ROAS) |
accounts | list, available, connect, disconnect, update, pages, pixels |
drafts | get, publish (review your changes, then send them) |
creatives | create, update, delete (advanced; normal ads do not need this) |
All calls go through adkit_manage with platform: "meta". Before a call you have not made in this session, read its fields with adkit_help({ path: "manage meta <entity> <action>" }). Do not guess field names. In this skill, campaigns create means entity: "campaigns", action: "create".
Project: call adkit_projects and get the projectId. Every call needs it.
Account: call adkit_status. If no Meta account is connected, call adkit_setup with platform: "meta" and give the user the link. After they sign in, use accounts available, then accounts connect.
Account defaults: find the Facebook Page with accounts pages and the pixel with accounts pixels. Save them with accounts update (defaultPageId, defaultPixelId). To also run ads under an Instagram account, ask the user for its ID and save it as defaultInstagramUserId. This change applies immediately, with no draft.
Build from the top down. Each create saves a draft. For each level, do these steps before you start the next level:
drafts get, or the link https://app.adkit.so/manage/drafts?open=<draftId>).drafts publish.The levels, in order:
campaigns create with a name, an objective, and status: "paused". A paused campaign spends nothing.adsets create with the campaignId, budget, optimization, and targeting. Use research interests to get interest IDs.media upload from a public URL. It returns an imageHash or a videoId. For a local file: call adkit_manage with entity: "media" and action: "request_upload_url" (no platform). It returns an upload URL. Send the file to that URL with PUT. Then call media upload with source: "temporary_upload".ads create with the adsetId, the copy, the URL, and the creative.Go live: campaigns update with status: "active". Publish that draft only after the user says yes. Then check with adsets list and ads list that the ad sets and ads are active too.
Results: results list with a level and a period or a date range (from and to).
media (one image or video), carouselCards, existingPostId (promote an existing post), or creativeId. Use ads, not creatives, for normal ads. AdKit builds the creative.campaigns, adsets, and ads list actions return settings only. Spend and conversions come from results.conversions shows what is tracked, not how many conversions happened.accounts update (dsaDefaults).For a Meta feature that AdKit does not cover, use entity: "platform-api-request" with action: "mutate". The action is always mutate, also for reads. AdKit sends the request to the Meta Marketing API as it is. The user must turn on Advanced Platform Access in AdKit's Agent Permissions.
adkit_feedback.{
"projectId": "<projectId>",
"entity": "platform-api-request",
"action": "mutate",
"data": {
"platform": "meta",
"accountId": "act_<accountId>",
"endpoint": "act_<accountId>/campaigns",
"method": "POST",
"payload": {
"name": "Test campaign",
"objective": "OUTCOME_TRAFFIC",
"status": "PAUSED",
"special_ad_categories": []
},
"description": "Create a paused traffic campaign"
}
}
The same AdKit connector runs Google Ads, TikTok Ads, LinkedIn Ads, Microsoft Ads, Reddit Ads, X Ads, and Pinterest Ads ads. Each platform has its own skill in this repo, for example google-ads and tiktok-ads.