AdMake AI
AdMake AI is an ad creative platform.
What it can do
- User Me: Get the authenticated user's profile, plan, and credit balance.
- User GetCredits: Get the authenticated user's current credit balance only.
- AdResearch ListProjects: List the user's projects (brands). ALWAYS call this before generating anything: every generation needs a projectId, and the project's brand brief is what the render is built f
What data it sees
Do you need an account
No: the server works without sign-in
AdMake AI is an ad creative platform. Its MCP server exposes the same tool surface the app uses, so an agent can do three things:
- Generate ad creative. Create Facebook, Instagram, and TikTok ad images from a text prompt and an optional product photo, edit existing ads, generate ad copy, and batch out variations from an ad set. Generation runs as a background job that you poll to completion.
- Research competitor ads. List research projects, pull competitor ads sourced from the Meta Ad Library, and read saved inspirations.
- Manage and measure Meta campaigns. Upload finished creative to a connected Meta ad account through the official Marketing API, run preflight validation before uploading, read the campaign/ad set/ad hierarchy, and pull day-by-day spend, CTR, CPC, and conversion analytics.
Authentication is OAuth 2.1 with dynamic client registration and S256 PKCE, so clients such as Claude custom connectors and ChatGPT connectors need only the server URL. Three scopes gate the surface: mcp:read (read account, projects, ads, and performance), mcp:write (generate ads and prepare drafts, spends credits), and mcp:publish (push drafts live). Tools are filtered by granted scope, so a connection approved without mcp:publish cannot even list the live-action tools. No delete operations are exposed. An API key over the x-api-key header works as an alternative to OAuth.
Full machine-readable server card: https://admakeai.com/.well-known/mcp.json
Server tool list (60)
Raw names from tools/list. Only developers need these.
| user__me | Get the authenticated user's profile, plan, and credit balance. |
| user__getCredits | Get the authenticated user's current credit balance only. |
| adResearch__listProjects | List the user's projects (brands). ALWAYS call this before generating anything: every generation needs a projectId, and the project's brand brief is what the render is built from. Pick the project the user's request is about; if more than one could fit, ask which. Projects cannot be created through this API — if the user has none, tell them to set one up at https://admakeai.com/dashboard. |
| adResearch__getProject | Get one project with its full brand brief, competitors, research jobs, and scraped-ad counts. Read this before generating so the creative matches the brand. |
| adResearch__pollStatus | Poll a project's research status: pipeline stage, running scrape jobs, competitor and saved-ad counts. |
| project__updateBrief | [write] Update a project's brand brief (product summary, target audience, value proposition, industry, keywords). Sharpening the brief improves every later generation. |
| project__getAssets | List a project's stored assets (product photos, logos) with their URLs, for use as reference images. |
| upload__uploadImageBase64 | [write] Upload a JPEG, PNG, or WebP image from base64 bytes into AdMakeAI storage. Returns an image ID and public URL for image generation or Facebook campaign drafts. |
| upload__getUserImages | List the user's previously uploaded source images, newest first, with pagination. |
| adGeneration__create | [write] Queue a FINISHED AD image render. Required: projectId. Call adResearch.listProjects first and pick the project the request is about, or ask the user when it is ambiguous; never guess an id. Also required: prompt, a creative brief rather than a finished image prompt. How the prompt is used: a creative-director model rewrites it into the real image prompt using the project's brand brief, and that rewrite always adds a specific headline, a subline, a CTA button, and the project logo when the project has one. Negative instructions in the prompt ('no text', 'no logo', 'nothing but the product') cannot suppress those; use adGeneration.generateImage when the caller wants exact or no text. Optional: adType, aspectRatio, quality (low/high/ultra), referenceImageUrls, inputImageId (from upload.uploadImageBase64), referenceAdId or referenceInspirationId to remix an existing ad. Costs credits. Returns a generation ID. Poll adGeneration.getById until status is COMPLETED. |
| adGeneration__generateImage | [write] Queue an image render from a VERBATIM prompt. The prompt goes to the image model exactly as written: no creative-director rewrite, no brand brief, no added headline, subline or CTA, and no project logo. The image contains only what the prompt stipulates. Use this when the caller wants only specific stipulated text, forbids text/logos/CTAs, or wants raw scene, product, or photography imagery rather than a finished ad; use adGeneration.create for finished ads. Required: projectId (credit scoping only, nothing from it enters the prompt) and prompt. Optional: aspectRatio, quality (low/high/ultra), referenceImageUrls and inputImageId for image-to-image. Costs the same credits as adGeneration.create. Returns a generation ID. Poll adGeneration.getById until status is COMPLETED. |
| adGeneration__edit | [write] Queue an image-to-image edit and return immediately. The universal edit tool: change background, restyle, swap a subject, change aspect ratio, add brand assets, or remix a competitor ad. Source is either sourceAdId (one of the user's own generations) or sourceImageUrl (any direct image URL). Costs credits. Poll adGeneration.getById until COMPLETED. |
| adGeneration__getById | Get the status, prompt, and resulting image URLs of a single ad generation by ID. Use to poll until status is COMPLETED. |
| adGeneration__list | Paginated list of the user's ad generations, newest first. |
| adGeneration__getRecent | Get the user's most recent ad generations (default limit 12). |
| adGeneration__searchAll | Full-text search across the user's ad generations by prompt. |
| adGeneration__listPending | List the user's currently-pending ad generations. |
| adGeneration__toggleFavorite | [write] Star or unstar one of the user's ad generations. Free — use it to mark the winner of a batch. |
| adCopyGeneration__generate | [write] Write Facebook/Instagram ad copy for an ad image URL: headline, primary text, description, CTA, and hook angle. Returns up to 5 variations. Pass projectId so the copy uses the brand brief. Call this right after a generation completes. |
| adCopyGeneration__getMessagingStyles | List the ad-copy messaging styles (clickbait, professional, UGC, direct response, storytelling, ...) accepted by adCopyGeneration.generate. |
| adSet__list | Paginated list of the user's ad sets. |
| adSet__get | Get an ad set by ID, including its general instructions. |
| adSet__create | [write] Create an ad set: a project + shared brief + ad type + quality + aspect ratio that many variations are generated from. Free — the credits are charged by adSet.generateBatch. |
| adSet__update | [write] Update an ad set's brief, ad type, quality, aspect ratio, or reference images before generating another batch. |
| adSet__getGenerations | List all ad generations belonging to an ad set. |
| adSet__generateBatch | [write] Generate a batch of ad variations from one ad set + per-variation instructions. Enqueues N background jobs and returns their generation IDs. |
| adSet__suggestDirections | [write] Ask the model for distinct creative directions (angles/hooks) for an ad set, to feed back in as per-variation instructions. |
| videoGeneration__start | [write] Queue UGC-style video ad generation for a project (script, voice, and render). Costs credits per video. Poll videoGeneration.getStatus. |
| videoGeneration__getStatus | Get the status and output URL of a single video generation by ID. Poll until COMPLETED. |
| videoGeneration__list | Paginated list of the user's completed UGC video ads. |
| videoGeneration__listPending | List the user's currently-rendering video generations. |
| adResearch__searchCompanies | Resolve a brand name to its Facebook advertiser Page (id, name, category, follower counts). Step 1 of looking up any brand's live ads. |
| adResearch__getCompanyAds | Get the ads a Facebook Page is currently running, from the Meta Ad Library, by pageId (from adResearch.searchCompanies). Works for any advertiser, not just the user's competitors. |
| adResearch__addCompetitors | [write] Add competitors to a project by name (optionally with website URL) and kick off ad scraping for them. |
| adResearch__scrapeCompetitor | [write] Re-scrape one competitor's live Facebook ads into the project. Returns a research job — poll adResearch.pollStatus. |
| adResearch__getCompetitorPreview | Preview the ads already scraped for a single competitor. |
| adResearch__getScrapedAds | Browse the competitor ads scraped into a project, with sorting (relevance, longest_running, newest) and media-type/keyword filters. This is the raw material for remixes. |
| adResearch__getAdDetails | Get one scraped competitor ad in full: creative URLs, ad text, headline, run dates, and platform placements. |
| adResearch__saveInspiration | [write] Save a scraped competitor ad to a project as inspiration. The returned inspiration ID can be passed to adGeneration.create as referenceInspirationId to remix it. |
| adResearch__getSavedInspirations | List the competitor ads saved as inspiration for a project, with their inspiration IDs. |
| facebookConnection__list | List the user's connected Facebook ad accounts and Pages, with their cached identity info. |
| facebookUpload__getCampaigns | List Meta campaigns for a specific connected ad account (cache-first; refresh from Meta if cold). |
| facebookUpload__getAdSets | List Meta ad sets under a given campaign. |
| facebookUpload__runPreflight | [write] Validate an ad-creative + ad-account pair for Meta upload (image dimensions, copy length, etc.) without uploading. |
| facebookUpload__request | [DANGER: live action] Enqueue an upload of an AdMakeAI-generated ad creative to a Meta ad account / campaign / ad set. Creates a real ad on Meta. ALWAYS confirm with the user before calling. Always confirm with the user before calling. |
| facebookUpload__list | List previously-uploaded ads, filterable by ad account and state. |
| facebookUpload__get | Get the upload state and Meta IDs of a single uploaded ad. |
| facebookCampaignDraft__sourceAssets | Resolve previously-uploaded Meta ads into reusable creative assets for a campaign draft. |
| facebookCampaignDraft__getAgentDraft | Read a saved agent-created Facebook campaign draft by draft ID before pushing. |
| facebookCampaignDraft__pushAgentDraft | [DANGER: live action] Push a saved agent-created Facebook campaign draft to Meta as draft campaigns/ad sets/ads. ALWAYS confirm with the user before calling. Always confirm with the user before calling. |
| facebookCampaignDraft__pushDraftCampaign | [DANGER: live action] Create Meta draft campaigns/ad sets/ads from explicit campaign data, ad sets, ad copy, and image URLs. Supports raw externally-hosted image URLs. ALWAYS confirm with the user before calling. Always confirm with the user before calling. |
| zernioAnalytics__accountOverview | Get total ad-account spend and performance (spend, impressions, clicks, CTR, CPC, conversions, ROAS) for a date range like last_30_days or last_month, with previous-period comparison. |
| zernioAnalytics__tree | Get the campaign → ad-set → ad hierarchy for an ad account. |
| zernioAnalytics__timeline | Get time-series performance metrics for an ad account. |
| zernioAnalytics__listCampaigns | List Meta campaigns with rolled-up performance metrics. |
| zernioAnalytics__listAds | List Meta ads under a campaign or ad set with performance metrics. |
| zernioAnalytics__getAd | Get a single Meta ad's metadata and creative. |
| zernioAnalytics__getAdAnalytics | Get day-by-day analytics (spend, CTR, CPC, conversions) for a single Meta ad. |
| zernioAnalytics__getAdComments | List public comments on the boosted post behind a Meta ad (Facebook or Instagram placement). |
| zernioAnalytics__pauseAd | [DANGER: live action] Currently disabled: Meta ad status changes fail closed in AdMakeAI. Launch/pause from Meta Ads Manager. Always confirm with the user before calling. |