Share one connected ad account with another of the user's pen names: { destination, accountId, sharedWithProfileId, ownerProfileId? (defaults to the active pen name) }. Both pen names must be the user's and the account must be connected on the owner. Reads and launches from the sharee then go upstream as the owner while every campaign row keeps the sharee's pen name. Amazon accounts cannot be shared yet. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (5)
| Name | Type | Required | Description |
|---|
| destination | "meta" | "tiktok" | "linkedin" | "pinterest" | "x" | "google" | "chatgpt" | "amazon" | Yes | |
| accountId | string | Yes | |
| sharedWithProfileId | string | Yes | |
| ownerProfileId | string | No | |
| profileId | string | No | |
End an ad-account share (either the owner or the receiving pen name may). id from aa_ads_account_shares_list. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| id | string | Yes | |
| profileId | string | No | |
List ad-account shares touching the active pen name: accounts other pen names shared with it (receiving) and accounts it shared out (giving). Ad accounts connect under one pen name; a publisher with one Meta ad account and several pen names shares it here. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
What the active pen name can do with ads right now: whether the ads upgrade is active (and the checkout path if not), every destination (Meta, Amazon, TikTok, ChatGPT, LinkedIn, Google, Pinterest, X) with its connection state, ad accounts (own and shared from other pen names), pixel state and setup facts (destinations connected, tracking ready, first ad created). Call this before connecting, tracking or creating anything. Pass profileId for a non-primary pen name.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
Assign campaigns to a campaign group and/or remove campaigns from it, in one batch (up to 200 refs). A campaign belongs to ONE group at a time so spend is never counted twice — assigning a campaign that already sits in another group answers 409; unassign it there first. Refs are { network, campaignId } from aa_list_all_ads. addedBy defaults to manual. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (5)
| Name | Type | Required | Description |
|---|
| id | string | Yes | Group id from aa_ads_groups_list. |
| assign | object[] | No | |
| unassign | object[] | No | |
| addedBy | "wizard" | "manual" | "suggestion" | No | |
| profileId | string | No | |
Create a campaign group (a human label that rolls ads up across networks). Optional author target drives the winner/loser verdict: targetMetric roas | acos | cpc with a positive targetValue (both or neither). Optional breakEvenRoas ('I need 1.8× to break even') is the fallback verdict rule when no target is set; startedOn (YYYY-MM-DD) overrides the 7-day 'too early' clock. Names are unique per pen name (case-insensitive) — a duplicate answers 409. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (6)
| Name | Type | Required | Description |
|---|
| name | string | Yes | |
| targetMetric | "roas" | "acos" | "cpc" | No | |
| targetValue | number | No | |
| breakEvenRoas | number | No | |
| startedOn | string | No | YYYY-MM-DD |
| profileId | string | No | |
List the active pen name's campaign groups — human labels like 'Curses launch Sep 26' that roll ads up across every network — with each group's optional author target (roas | acos | cpc), break-even ROAS, start date and member count. Use aa_ads_groups_rollup for spend, ROAS and the winner/loser verdict. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
The goal-to-result view: every campaign group with cross-network spend, reported revenue, ROAS, clicks, CPC, /day budget, per-platform chips, mapped books, member campaigns and a verdict (winning | watch | losing | too_early | no_data with the reason), plus the Ungrouped bucket with name-match suggestions and the pen-name summary strip. The response also carries `campaigns` and `accounts` for the same window — every unified campaign and connected account, so callers don't need a separate campaigns fetch just to cross-reference a group member. Verdicts wait 7 days and judge against the author's target first, then the group's break-even ROAS, else say no_data honestly. window: 7d | 30d (default) | 90d | lifetime (capped at the 90 days the networks report). Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| window | "7d" | "30d" | "90d" | "lifetime" | No | |
| profileId | string | No | |
Rename a campaign group or change its verdict rules — targetMetric/targetValue (set both, or pass both as null to clear), breakEvenRoas, startedOn. Only the fields you pass change. id from aa_ads_groups_list. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (7)
| Name | Type | Required | Description |
|---|
| id | string | Yes | |
| name | string | No | |
| targetMetric | "roas" | "acos" | "cpc" | null | No | |
| targetValue | number | null | No | |
| breakEvenRoas | number | null | No | |
| startedOn | string | null | No | YYYY-MM-DD or null |
| profileId | string | No | |
The generative prompt the look panel will paint this ad draft's sample from — the look in plain words turned into the scene the image model receives. Read-only: nothing is painted and nothing is saved, so an agent can show the author the prompt before they approve the look. Edit it by saving the draft, then paint. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| draftId | string | Yes | Ad draft id (from aa_list_campaign_drafts). |
| profileId | string | No | |
Search Meta's or LinkedIn's public ad archive to see what similar authors are running.
Meta (no account needed): query = keywords (write them in the ads' language), or pageIds for specific Facebook Pages.
Returns per ad: advertiser (Page name), pageId, body text variants, link titles, start/stop dates,
publisher platforms (Facebook, Instagram, …), languages and libraryUrl (the ad's public Ad Library page, which shows the creative).
countries defaults to GB,IE and status to ACTIVE. Meta's archive only includes ordinary ads that ran in the EU or UK
(for a year after they ran); ads that ran only in the US never appear, so don't claim US-only results.
Optional: platforms (FACEBOOK,INSTAGRAM,…), mediaType (IMAGE|VIDEO|…), searchType (KEYWORD_EXACT_PHRASE for a phrase).
LinkedIn: query = the advertiser's Page name; needs a connected LinkedIn ads account (accountId).
limit up to 50 (LinkedIn 25); pass the result's nextCursor as after for the next page.
Degrades to available:false with a reason instead of failing.
Parameters (13)
| Name | Type | Required | Description |
|---|
| query | string | No | Keywords (Meta) or the advertiser's Page name (LinkedIn). Required unless pageIds is given. |
| platform | "meta" | "linkedin" | No | |
| countries | string | No | Comma-separated ISO country codes the ads reached. Meta default GB,IE; ordinary ads are only archived for the EU and UK. |
| status | "ACTIVE" | "INACTIVE" | "ALL" | No | Meta only. Default ACTIVE. |
| platforms | string | No | Meta only. Comma-separated: FACEBOOK, INSTAGRAM, AUDIENCE_NETWORK, MESSENGER, THREADS. |
| mediaType | "ALL" | "IMAGE" | "MEME" | "VIDEO" | "NONE" | No | |
| searchType | "KEYWORD_UNORDERED" | "KEYWORD_EXACT_PHRASE" | No | |
| pageIds | string | No | Meta only. Comma-separated Facebook Page ids (max 10), e.g. a pageId from an earlier result. |
| limit | integer | No | |
| after | string | No | nextCursor from the previous page. |
| accountId | string | No | |
| bookId | string | No | |
| profileId | string | No | |
Google Ads keyword ideas expanded from seed terms. Requires a connected Google Ads account; returns available:false with a reason otherwise.
Parameters (4)
| Name | Type | Required | Description |
|---|
| seedKeywords | string[] | Yes | |
| accountId | string | No | |
| bookId | string | No | |
| profileId | string | No | |
Adopts a specific version of a plan: stamps it adopted and points the plan at it. Prior versions stay immutable — adopting never edits them.
Parameters (3)
| Name | Type | Required | Description |
|---|
| planId | string | Yes | |
| versionId | string | Yes | |
| profileId | string | No | |
Creates a draft ads strategy plan from a situation brief (workType, genre, catalogDepth, distribution, budgetPosture, compliance flags, and nonFictionPurpose for non-fiction). Optionally scoped to a book. Does not generate a version yet — call aa_ads_strategy_plan_generate next.
Parameters (3)
| Name | Type | Required | Description |
|---|
| situation | object | Yes | |
| bookId | string | No | |
| profileId | string | No | |
Generates a new version of a plan: runs the deterministic house playbook always, and — unless includeCreative is set to false for a power user who wants to review the numbers first — also generates stage-4 creative (personas, messaging angles, hooks) grounded on the book's real reviews. Never mutates an existing version; always inserts a new one. The version's contract also carries `testPlan`: six sequential single-variable click tests (hook, headline, proof, image, primary text, stress), 12 ideas each as four angles by three versions, $30 a day for 24–36 hours until each idea has been seen by about 400 people, winners carried forward. Hooks carry angleIndex and the creative carries a visual look for the image test.
Parameters (6)
| Name | Type | Required | Description |
|---|
| planId | string | Yes | |
| includeCreative | boolean | No | |
| bookTitle | string | No | |
| synopsis | string | No | |
| asin | string | No | |
| profileId | string | No | |
Gets one ads strategy plan with all of its versions, each carrying the assembled contract (playbook decisions + creative + provenance).
Parameters (2)
| Name | Type | Required | Description |
|---|
| planId | string | Yes | |
| profileId | string | No | |
Lists this pen name's ads strategy plans (draft, adopted, archived) with their situation brief and current version id.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
Validates a proposed targeting spec against the live catalog before it's shown to the author — call this AFTER a targeting spec has been proposed, not to browse targeting blind. Returns available:false on platforms without a pre-flight estimate (Google, TikTok).
Parameters (6)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| spec | object | Yes | |
| optimizationGoal | string | No | |
| bookId | string | No | |
| profileId | string | No | |
Buckets a book's real reader reviews into pain points, trigger moments, objections, transformations and ad-ready phrases, plus a 1-5 quality score. Flags when there are fewer than 20 reviews. Grounded on the book's actual reviews — never fabricates a quote. Requires an ASIN on the book.
Parameters (3)
| Name | Type | Required | Description |
|---|
| bookId | string | Yes | |
| asin | string | No | |
| profileId | string | No | |
Judge a click test. Without confirm it only READS the run's results (per-idea impressions, clicks, CTR, which ideas are still under the 400-people floor, and the suggested winners — the top share by CTR) so the author can decide. With confirm: true it records the winners you pass (creative ids from the results), marks the run judged, and returns `nextTest` (the next test's order and wizard link) with `held` updated. Judging is refused with 409 while any idea is under 400 people unless override: true, which is recorded on the run. Winners are never chosen automatically — always show the author the results and get their confirmation before calling with confirm. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (5)
| Name | Type | Required | Description |
|---|
| runId | string | Yes | |
| winners | string[] | No | Creative ids to record as winners (from the run's results). Required with confirm. |
| override | boolean | No | Judge anyway while some ideas are under the 400-people floor. Recorded on the run. |
| confirm | boolean | No | false/omitted: read results only. true: record the winners. |
| profileId | string | No | |
Lists this pen name's click-test runs — one per test launched from a strategy plan (which test, its ideas' ads, the values held constant, status draft/running/judged/superseded, and the judged winners) — plus `held`, the winner values the next test carries forward. Pass planId to scope to one plan, or runId to read ONE run's live results: impressions, clicks and CTR per idea, which ideas have reached the 400-people floor, and the suggested winners. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (3)
| Name | Type | Required | Description |
|---|
| planId | string | No | |
| runId | string | No | |
| profileId | string | No | |
REAL MONEY — boost an already-published post as a paid ad.
accountId (connected social account) and adAccountId (platform act_*) are required, plus ONE of:
postId (a post published through this app) or platformPostId (the native post id —
required for Meta business-login connections).
status: PAUSED (default to this unless the user explicitly asks to launch live) or ACTIVE.
name and goal are optional (defaults: an auto name, goal 'engagement'). goal is one of
engagement, traffic, awareness, video_views, lead_generation, conversions, app_promotion.
budget: { type: 'daily'|'lifetime', amount }. schedule: { startDate, endDate } (endDate required for lifetime).
callToAction only together with linkUrl — a callToAction without a link is dropped.
targeting: structured object — ageMin/ageMax, gender ('all'|'male'|'female'), countries,
regions/cities/zips/metros ([{ key }] from aa_search_ad_targeting), interests, advantage_audience (0|1).
Meta extras places, neighborhoods, excludedLocations and customAudienceIds are also accepted.
rawTargeting: paste raw Meta targeting JSON instead of building it with `targeting`.
MUTUALLY EXCLUSIVE with targeting — pass one or the other, never both (the server 422s).
Networks: Meta, TikTok, LinkedIn, Google, Pinterest (goals vary per network; budget minimums
TikTok $20 / Pinterest $5). adAccountId comes from aa_list_ad_accounts — Google/LinkedIn/
Pinterest connections may return none, in which case boosting is not possible for that account.
ChatGPT and Amazon ads are reporting-only (no boost).
ALWAYS confirm budget + duration with the user before calling. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (13)
| Name | Type | Required | Description |
|---|
| postId | string | No | |
| platformPostId | string | No | |
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| name | string | No | |
| goal | "engagement" | "traffic" | "awareness" | "video_views" | "lead_generation" | "conversions" | "app_promotion" | No | |
| status | "PAUSED" | "ACTIVE" | No | |
| budget | object | No | |
| schedule | object | No | |
| targeting | object | No | |
| rawTargeting | object | No | |
| extra | object | No | Any other boostPost fields not covered above (e.g. linkUrl + callToAction, adSetId, destinationType) — forwarded verbatim. |
| profileId | string | No | |
Start an OAuth flow to connect an AD account (Meta / TikTok / LinkedIn / Pinterest / Google Ads) to the active pen name. Use when the user asks to 'connect Facebook Ads' / 'add my TikTok ad account' / 'hook up Google Ads' — distinct from aa_list_accounts which lists organic social accounts. platform takes the underlying OAuth platform (facebook / instagram / linkedin / tiktok / twitter / pinterest / googleads); the resulting connected account-platform is metaads / googleads / etc. Returns either `{authUrl}` for a fresh OAuth (open in browser, complete consent), or `{alreadyConnected:true, accountId}` when ads scopes are already on the underlying social account. Separate-token platforms (tiktok, twitter) require the parent social account to already be connected — connect organic first via aa_list_accounts → reconnect flow. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on. Optional redirect_url for a custom callback target. When the pen name has several accounts on that platform (two Facebook Pages, say) the call returns code ACCOUNT_CHOICE_REQUIRED with `accounts` — ask the user which one and call again with that accountId. A `reconnect_required` refusal carries an `authUrl` that repairs the connection. Meta only: loginMode 'business' connects for ads with no posting account; force starts a fresh OAuth.
Parameters (6)
| Name | Type | Required | Description |
|---|
| platform | "facebook" | "instagram" | "tiktok" | "linkedin" | "googleads" | "pinterest" | "twitter" | Yes | |
| redirect_url | string | No | |
| accountId | string | No | |
| loginMode | "classic" | "business" | No | |
| force | boolean | No | |
| profileId | string | No | |
Store OpenAI/ChatGPT ads credentials for the active pen name — plumbing connection, not a full OAuth flow. Pass the OpenAI Ads API key. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| apiKey | string | Yes | |
| profileId | string | No | |
Create an empty Meta product catalog (commerce) under the ad account's business. Only when aa_list_ad_catalogs shows none to reuse: catalogs are not cheap to clean up. Fill it from the author's Shopify store with aa_create_catalog_sync. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (5)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | The connected Meta account id from aa_list_accounts (facebook, instagram or metaads). |
| name | string | Yes | |
| adAccountId | string | No | |
| businessId | string | No | |
| profileId | string | No | |
Keep a connected Shopify store synced into a Meta product catalog, so catalog ads show the store's books with their own covers and prices. accountId is the Shopify store (aa_list_accounts, platform shopify); catalogAccountId the Meta account whose login writes to the catalog (usually the same Meta account used for ads); catalogId from aa_list_ad_catalogs. Then start it with aa_run_catalog_sync. Confirm with the user first. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | The Shopify store's accountId from aa_list_accounts (platform shopify). |
| catalogAccountId | string | Yes | The connected Meta account id from aa_list_accounts (facebook, instagram or metaads). |
| catalogId | string | Yes | |
| profileId | string | No | |
REAL MONEY — create a Click-to-WhatsApp ad (an ad whose CTA opens a WhatsApp conversation with the user's business number). accountId is the connected social account; all other fields (creative, budget, targeting, WhatsApp number binding) forward verbatim to the upstream CTWA API. Default to paused unless the user explicitly says launch live, and ALWAYS confirm budget + duration first. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (3)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| extra | object | No | All CTWA fields (creative, budget, targeting, …) — forwarded verbatim. |
| profileId | string | No | |
Create a Meta lead-generation form. accountId (connected social account) + adAccountId (platform act_*) + formType + questions[] + privacyPolicy are required. Optional contextCard, thankYouPage, block/organic toggles. Upstream also requires the form's name and privacyPolicyUrl; pass them in extra. contextCard and thankYouPage are passed through untranslated; for the intro card and thank-you screen prefer extra.platformSpecificData.contextCard and the thankYouTitle / thankYouBody / thankYouButtonText / thankYouWebsiteUrl fields in extra. If you send extra.platformSpecificData at all, it must also carry the questions (extra.platformSpecificData.questions) besides the top-level questions. Returns the new form's id: pass it to aa_create_standalone_ad as extra.leadGenFormId with extra.goal 'lead_generation'. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (9)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| formType | string | Yes | |
| questions | object[] | Yes | |
| privacyPolicy | object | Yes | |
| contextCard | object | No | |
| thankYouPage | object | No | |
| extra | object | No | Any other lead-form fields (headline, block/organic toggles, etc) — forwarded verbatim. |
| profileId | string | No | |
REAL MONEY — create a brand-new ad (not boosting an existing post).
accountId + adAccountId required. Never pass postId or platformPostId: those make it a boost
(postId is stripped here; use aa_boost_post for existing posts).
The body is forwarded as-is, so ad fields go FLAT inside `extra` — nested creative/budget
objects are not translated. A typical ad:
extra: { name, goal: 'traffic', status: 'PAUSED', headline, body, imageUrl, linkUrl,
callToAction: 'LEARN_MORE', budgetAmount: 20, budgetType: 'daily'|'lifetime',
startDate, endDate } (lifetime budgets need endDate)
Always pass status 'PAUSED' (it works on every network) unless the user explicitly says
launch live; PAUSED holds the new campaign with its ad set and ad switched on. Start it
in-app with aa_update_ad_campaign_status, never in a network's own ads manager. Google
Performance Max and Demand Gen are always created paused and need their nested
`assetGroup` / `demandGen` payloads in extra.
Lead ads: aa_create_lead_form first, then extra: { goal: 'lead_generation', leadGenFormId }.
Catalog ads (Meta only, goal 'catalog_sales'): Meta builds one ad per product from a
catalog, with each product's own image. Pick a set first: aa_list_ad_catalogs →
aa_list_ad_catalog_product_sets (a Shopify store fills a catalog via aa_create_catalog_sync).
extra: { goal: 'catalog_sales', promotedObject: { productSetId, pixelId,
customEventType: 'PURCHASE', productCatalogId? }, headline, body, linkUrl,
callToAction: 'SHOP_NOW', budget fields }. Copy may use tags like {{product.name}}.
One template only: no imageUrl, video, creatives, carouselCards, adSetId,
dynamicCreative or placementAssets (refused with a 400 naming them).
targeting (forwarded as-is): countries, regions, cities, zips, metros, ageMin/ageMax,
gender ('all'|'male'|'female'), languages, interests (ids from aa_search_ad_interests),
excludedLocations: { countries, regions, cities, zips }. Age and gender apply on Meta,
TikTok, Pinterest, LinkedIn, X and Google Search/Display; languages everywhere but
ChatGPT; Google interests only on Search/Display. ChatGPT takes none of age, gender,
languages or interests, and Google Performance Max / Demand Gen refuse age, gender and
interests. A field a network can't use is refused with an error naming it, not ignored.
rawTargeting: raw Meta targeting JSON (places, neighborhoods, custom audiences). It is the
base layer and `targeting` merges on top; usually pass one or the other.
Networks: Meta (full fields incl. creatives/bid/lead forms), TikTok (imageUrl may be a
video URL; min budget $20), LinkedIn (LinkedIn conversions run as a boost), Google
(campaignType search|display, also pmax|demand_gen; goals engagement/traffic/awareness;
keywords, businessName, longHeadline;
headline max 30 / body max 90), Pinterest (boardId optional; headline max 100 / body
max 500; $5 min), ChatGPT (openaiads account; goals traffic/awareness/conversions), X.
Goals differ by network (Pinterest: engagement/traffic/awareness/video_views);
an unsupported goal is refused. adAccountId comes from aa_list_ad_accounts; if a
connection lists none, connect that network's ads with aa_connect_ads_account first
(ChatGPT: aa_connect_openai_ads).
Amazon: use aa_create_amazon_campaign.
ALWAYS confirm budget + duration with the user before calling. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (9)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| budget | object | No | |
| targeting | object | No | |
| rawTargeting | object | No | |
| creative | object | No | |
| leadFormId | string | No | |
| extra | object | No | Any other createStandaloneAd fields not covered above (e.g. objective, duration, name) — forwarded verbatim. |
| profileId | string | No | |
Delete an ad carousel (the underlying library images are NOT deleted). Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| id | string | Yes | |
| profileId | string | No | |
Delete an ad set (cancels its ads; returns { deleted, adCount }). The ad set must contain at least one ad owned by the pen name — empty ad sets are refused and should be removed in the platform's own ads manager. Pass profileId for a non-primary pen name.
Parameters (2)
| Name | Type | Required | Description |
|---|
| adSetId | string | Yes | |
| profileId | string | No | |
Delete a video from the Meta ad account library (numeric Meta video id). accountId + adAccountId required. Pass profileId for a non-primary pen name.
Parameters (4)
| Name | Type | Required | Description |
|---|
| videoId | string | Yes | |
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| profileId | string | No | |
Stop syncing a Shopify store into a Meta catalog. This removes the sync, not the catalog itself. Confirm with the user first. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| syncId | string | Yes | |
| profileId | string | No | |
Draft a full ad campaign for a book — validated audiences (interests checked against the ad platform's live catalog), hooks, a conservative budget suggestion, and an objective — as a REVIEWABLE DRAFT. Never creates an ad and never spends anything; hand the draft to the user, then build for real with aa_create_standalone_ad once approved. Provide bookId OR the inline `book` object, plus accountId (the connected social account whose ad platform to validate against, from aa_list_accounts). audienceCount 2–3, hookCount 3–5. Runs on the user's own text-LLM key (code ai_settings_required when unset). Each hook now carries tactic, awarenessStage and angle alongside headline, copy, imagePrompt and style — the same shape the ad wizard's creatives use, so a draft can seed a click test directly. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (6)
| Name | Type | Required | Description |
|---|
| bookId | string | No | |
| book | object | No | Inline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library. |
| accountId | string | Yes | |
| audienceCount | integer | No | |
| hookCount | integer | No | |
| profileId | string | No | |
Generate ad hooks + body copy for a book (the Creative Studio copy pass). Provide bookId OR the inline `book` object, a style angle, and count (variations, 1–6, default 3). Optional directive (campaign goal) and hooks (pre-approved headlines the copy must use). Runs on the user's OWN text-LLM key (missing/disabled AI settings return code ai_settings_required / ai_key_missing — point them at Settings → AI Providers). Feed the returned hook/adBody/imagePrompt into aa_generate_ad_creative or aa_generate_ad_video. With perHook: true (and hooks), writes one complete ad per hook — its own headline, primary text, description and CTA, no two ads sharing an opening — returning `copy` keyed by hook-1, hook-2, … and then by network; use this for a click test where every idea is a complete ad. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (9)
| Name | Type | Required | Description |
|---|
| bookId | string | No | |
| book | object | No | Inline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library. |
| style | "clean" | "promotional" | "hook" | "hook-high-stakes" | "mockup" | "reviews" | Yes | Visual/copy angle: clean (cover-forward), promotional (offer-led), hook (curiosity headline), hook-high-stakes (dramatic), mockup (device/scene mockup), reviews (social proof). |
| count | integer | No | |
| directive | string | No | Campaign objective — every variation must serve it. |
| hooks | string[] | No | Pre-approved hooks the copy must build on (one variation per hook, in order). |
| perHook | boolean | No | Write one complete ad per hook (own headline, primary text, description, CTA) instead of a shared copy pass. Requires hooks. |
| network | "meta" | "google" | "tiktok" | "linkedin" | "pinterest" | "x" | "openai" | "amazon" | No | Network whose copy limits apply when perHook is set; default meta. |
| profileId | string | No | |
Generate ad IMAGES for a book in the Creative Studio. Provide bookId (a book in the user's library) OR the inline `book` object (title metadata from anywhere else). Pick a visual style, 1–3 ad formats (ad_square 1:1, ad_portrait 4:5, ad_story 9:16, ad_landscape 1.91:1, ad_pin 2:3), and count (variations per format, 1–6). Optional hook (headline for typography styles), adBody + scenePrompt from a prior aa_generate_ad_copy pass. Image generation can run on the INCLUDED tier — 12 generations/day shared across image features — when the user has no image-provider key on file; with a key it uses their provider. Results land in the shared creative library (aa_list_ad_creatives). Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (10)
| Name | Type | Required | Description |
|---|
| bookId | string | No | Book id from the user's library. Omit when passing `book`. |
| book | object | No | Inline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library. |
| style | "clean" | "promotional" | "hook" | "hook-high-stakes" | "mockup" | "reviews" | Yes | Visual/copy angle: clean (cover-forward), promotional (offer-led), hook (curiosity headline), hook-high-stakes (dramatic), mockup (device/scene mockup), reviews (social proof). |
| formats | ("ad_square" | "ad_portrait" | "ad_story" | "ad_landscape" | "ad_pin")[] | Yes | |
| count | integer | No | |
| hook | string | No | |
| adBody | string | No | |
| scenePrompt | string | No | |
| enhance | boolean | No | Creative-director scene rewrite before generation (default true). |
| profileId | string | No | |
Write hook text for the ideas in one ad draft — the line each ad leads with, kept in that idea's own tactic and awareness stage. Provide bookId OR the inline `book` object, plus the ideas to write for (1–12, each with its own id and optionally tactic, awarenessStage and angle). Included in every plan, and never counted against the daily image allowance. Answers `hooks` keyed by idea id, plus `missing` for any idea the model skipped. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (6)
| Name | Type | Required | Description |
|---|
| bookId | string | No | Book id from the user's library. Omit when passing `book`. |
| book | object | No | Inline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library. |
| ideas | object[] | Yes | The ideas to write hooks for. |
| personaTag | string | No | Brand-guide persona whose voice the hooks use. |
| directive | string | No | Campaign objective every hook must serve. |
| profileId | string | No | |
Generate a short ad VIDEO for a book. Provide bookId OR the inline `book` object. USER-KEY-ONLY: video models are priced per second, so there is NO included/shared tier — the user must have their own video-provider key configured or this returns a friendly add-a-key message. Options: style, aspectRatio 9:16 (default) or 16:9, duration seconds, hook (steers the emotional beat, never rendered as text), optional voiceoverScript (spoken VERBATIM and muxed over the clip), useCoverStartFrame (default true — opens on the book cover). Results land in the shared creative library. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (13)
| Name | Type | Required | Description |
|---|
| bookId | string | No | |
| book | object | No | Inline book/title metadata. When present it WINS outright over a bookId lookup — use it for titles that only exist outside this app's book library. |
| style | "clean" | "promotional" | "hook" | "hook-high-stakes" | "mockup" | "reviews" | No | Visual/copy angle: clean (cover-forward), promotional (offer-led), hook (curiosity headline), hook-high-stakes (dramatic), mockup (device/scene mockup), reviews (social proof). |
| aspectRatio | "9:16" | "16:9" | No | |
| model | string | No | Video model id; omit for the catalog default. |
| duration | integer | No | |
| hook | string | No | |
| adBody | string | No | |
| scenePrompt | string | No | |
| useCoverStartFrame | boolean | No | |
| voiceoverScript | string | No | |
| enhance | boolean | No | |
| profileId | string | No | |
Get one ad by id. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| id | string | Yes | |
| profileId | string | No | |
Performance metrics for one ad — impressions, clicks, spend, conversions over its run. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| id | string | Yes | |
| profileId | string | No | |
List the campaign → book-title mappings for the active pen name (which book each ad campaign advertises). Returns [{ network, campaignId, titleId, titleLabel }]. Used to group unified-ads rows by book. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
Hierarchical campaign → ad-set → ad view across the user's ad accounts. Use for navigating the structure before drilling into one ad. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
'Analyze my ads' — builds a compact cross-network performance summary over the window and runs it through the user's own text-LLM key, returning up to 5 recommendations tied to named campaigns. NOTHING is auto-applied — relay recommendations to the user and act only on their say-so via the pause/status tools. Requires the user's AI settings to be configured (missing key returns code ai_settings_required — point them at Settings → AI Providers). Optional accounts[]/from/to same as aa_list_all_ads. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accounts | string[] | No | |
| from | string | No | YYYY-MM-DD; default 30 days ago. |
| to | string | No | YYYY-MM-DD; default today. |
| profileId | string | No | |
Daily spend + results points per network across every connected ad account, merged into one flat series — the data behind the all-ads trend chart. Optional accounts[] filter and from/to window (YYYY-MM-DD, default last 30 days). Response includes `currencies` (more than one means mixed-currency totals — don't sum them blindly) and per-account `errors` for partial failures. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accounts | string[] | No | Connected-account ids to include; omit for all. |
| from | string | No | YYYY-MM-DD; default 30 days ago. |
| to | string | No | YYYY-MM-DD; default today. |
| profileId | string | No | |
Read one Shopify → Meta catalog sync: runStatus, lastRunStartedAt/lastRunFinishedAt, lastError and item counts. Poll this after aa_run_catalog_sync. syncId from aa_list_catalog_syncs. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| syncId | string | Yes | |
| profileId | string | No | |
List the platform ad accounts (act_*) reachable from one connected social account. accountId is the connected social-account id (from aa_list_accounts). Returns the platform ad-account ids needed for boost / audience / interest calls. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| profileId | string | No | |
List custom audiences for one ad account. All three of accountId (connected social account), adAccountId (platform act_*), and platform are required. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| platform | string | Yes | |
| profileId | string | No | |
List the business centers reachable from a connected ad account (TikTok Business Center hierarchy). accountId is the connected social account from aa_list_accounts. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| profileId | string | No | |
List the user's ad campaigns across connected ad accounts. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
List the pen name's ad carousels — ordered sets of square (ad_square) creative-library images assembled for carousel ad placements — with hydrated card thumbnails. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (1)
| Name | Type | Required | Description |
|---|
| profileId | string | No | |
List the product sets in one Meta catalog (id, name, productCount). A catalog ad advertises one set: pass its id as promotedObject.productSetId to aa_create_standalone_ad with goal catalog_sales. catalogId from aa_list_ad_catalogs. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (3)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | The connected Meta account id from aa_list_accounts (facebook, instagram or metaads). |
| catalogId | string | Yes | |
| profileId | string | No | |
List the Meta product catalogs a Meta ad account's business owns (id, name, productCount). Call this first for catalog ads or a Shopify catalog sync. Pass adAccountId (act_..., from aa_list_ad_accounts) so the right business portfolio is used; when the Meta login sees several portfolios and neither adAccountId nor businessId is given, the 400 carries details.businesses to pick from. Empty list: create one with aa_create_ad_catalog. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | The connected Meta account id from aa_list_accounts (facebook, instagram or metaads). |
| adAccountId | string | No | |
| businessId | string | No | |
| profileId | string | No | |
List generated ad creatives (images + videos) in the active pen name's creative library, newest first, including generation status and the shared included-tier allowance ({ used, limit } per day). Optional batchId narrows to one generation batch. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| batchId | string | No | |
| profileId | string | No | |
List the Meta ad account's VIDEO LIBRARY (previously-uploaded ad videos). Each row's video id is reusable on ad creation (video.id / videoId) and `source` is a playable signed CDN preview URL. accountId + adAccountId required; `after` continues paging. Pass profileId for a non-primary pen name.
Parameters (5)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| after | string | No | |
| limit | integer | No | |
| profileId | string | No | |
List ads across the user's connected ad accounts. Optional accountId / platform / status filters. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accountId | string | No | |
| platform | string | No | |
| status | string | No | |
| profileId | string | No | |
Normalized campaign list across EVERY connected ad network in one call — Meta, Google, TikTok, LinkedIn, Pinterest, X, ChatGPT, and Amazon — each row with status, spend, results, and any book-title mapping attached (see aa_get_ad_title_map). Optional accounts[] (connected-account ids from aa_list_accounts) narrows the sweep; from/to (YYYY-MM-DD) sets the window, default last 30 days. Partial network failures come back in `errors` rather than failing the whole call. Start here for any 'how are all my ads doing?' question. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accounts | string[] | No | Connected-account ids to include; omit for all. |
| from | string | No | YYYY-MM-DD; default 30 days ago. |
| to | string | No | YYYY-MM-DD; default today. |
| profileId | string | No | |
List a connected Shopify store's syncs into Meta product catalogs: runStatus (pending, running, succeeded, failed), last run times, lastError, and counts (itemsSent, itemsSkipped = not on the online store or no image, itemsDeleted). Check here before creating a sync. Shopify only; WooCommerce catalogs go through the StorytellerOS WordPress plugin. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | The Shopify store's accountId from aa_list_accounts (platform shopify). |
| profileId | string | No | |
List Meta lead-generation forms available on an ad account. Use before aa_create_standalone_ad for a LEADS-objective ad. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| profileId | string | No | |
Deterministic ads performance engine — scores every campaign in the window with a fixed profitability decision tree (no LLM, no key needed; same inputs always give the same verdicts) and flags creative fatigue (spend up, results down, last 7 days vs prior 7). Returns per-campaign verdicts + suggested actions. SUGGESTIONS ONLY — never applies anything; confirm with the user, then act via aa_update_ad_campaign_status. Optional accounts[]/from/to same as aa_list_all_ads. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accounts | string[] | No | |
| from | string | No | YYYY-MM-DD; default 30 days ago. |
| to | string | No | YYYY-MM-DD; default today. |
| profileId | string | No | |
Start a full sync of the Shopify store into its Meta catalog now. Runs in the background: poll aa_get_catalog_sync for runStatus and counts. Products that are not published to the online store, or have no image, are skipped. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| syncId | string | Yes | |
| profileId | string | No | |
Create or update an ad carousel. assetIds are creative-library image ids (from aa_list_ad_creatives) — array ORDER is the card order; 2–10 cards. Pass id to update an existing carousel, omit it to create. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| id | string | No | Existing carousel id to update; omit to create. |
| name | string | Yes | |
| assetIds | string[] | Yes | |
| profileId | string | No | |
Search the targeting-interests catalog (e.g., look up 'cozy mystery' to find Meta's interest id for ad targeting). accountId required (connected social account); q is the search term. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (3)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| q | string | Yes | |
| profileId | string | No | |
Search the ad platform's full targeting catalog — geo locations, and other targeting entities beyond plain interests (aa_search_ad_interests covers interests only). accountId is the connected social account; q the search term. Optional extra query params (e.g. type, geoType 'all', lat, lng) are forwarded verbatim. Use the returned ids inside the `targeting` object of aa_boost_post / aa_create_standalone_ad. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (4)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| q | string | Yes | |
| extra | object | No | Additional query params forwarded verbatim (type, geoType, lat, lng, …). |
| profileId | string | No | |
Map one ad campaign to a book title (or clear the mapping). network is the normalized network id (meta | google | tiktok | linkedin | pinterest | x | openai | amazon); campaignId from aa_list_all_ads. titleLabel is the display name; titleId optionally links a known book record. Omit BOTH titleId and titleLabel to clear the mapping. Pass profileId for a non-primary pen name. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (5)
| Name | Type | Required | Description |
|---|
| network | "meta" | "google" | "tiktok" | "linkedin" | "pinterest" | "x" | "openai" | "amazon" | Yes | |
| campaignId | string | Yes | |
| titleId | string | No | |
| titleLabel | string | No | |
| profileId | string | No | |
Pause or resume a paid ad campaign. This flips the campaign's own switch only: pausing stops all delivery under it, resuming restarts the ad sets and ads that are switched on (any paused on their own stay paused), except on Google, where resuming a campaign also switches its ad groups and ads back on. id is the platform campaign id; accountId is the connected social account (tenant boundary); platform names the network. REAL MONEY — confirm with the user before resuming a paused campaign. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (5)
| Name | Type | Required | Description |
|---|
| id | string | Yes | |
| accountId | string | Yes | |
| platform | string | Yes | |
| status | "active" | "paused" | Yes | |
| profileId | string | No | |
Update the brand identity (custom display name and/or avatar) shown on a connected TikTok-ads account's ads. Field contract isn't published in our docs — pass fields the way the upstream TikTok-ads brand-identity API expects (e.g. displayName, avatarUrl); they forward verbatim. Ads tools are included on the $19 MCP plan and with StorytellerOS; the $29 plan needs the ads add-on.
Parameters (2)
| Name | Type | Required | Description |
|---|
| fields | object | Yes | Brand-identity fields to update, forwarded verbatim upstream. |
| profileId | string | No | |
Upload a standalone video to the Meta ad account library for reuse across ads. Provide exactly one of videoUrl (public https, downloaded server-side) or videoBase64 (~4.5MB cap). Returns the reusable video id (+ thumbnailUrl when Meta has produced a poster). accountId + adAccountId required. Pass profileId for a non-primary pen name.
Parameters (6)
| Name | Type | Required | Description |
|---|
| accountId | string | Yes | |
| adAccountId | string | Yes | |
| videoUrl | string | No | |
| videoBase64 | string | No | |
| filename | string | No | |
| profileId | string | No | |