cancel_spark_run
ChatGPTCancel a Spark run that is idle, failed, awaiting subscription, or waiting for approval. Set confirm=true only after explicit user approval.
complete_media_upload
ChatGPTStep 2: after the PUT succeeded, saves the uploaded file to the brand media library and returns the asset (id, url, mediaType, durationSeconds for audio and video). Spark and search_media_library find files by their description (audio defaults to the file name), so give each a distinct, descriptive name or description: several uploads named track-1.mp3 cannot be told apart. Pass the asset id to start_spark_run or send_spark_message as mediaAssetIds to hand it to Spark.
create_angle
ChatGPTCreate a reusable communication angle for the selected brand. A matching title returns the existing angle instead of creating a duplicate.
create_audience
ChatGPTCreate a reusable audience for the selected brand. A matching title returns the existing audience instead of creating a duplicate.
create_automation
ChatGPTSave a Spark automation for the selected brand: a prompt Spark runs on a recurring schedule (daily, weekdays, or weekly at a local time). Creating it runs nothing; the automation is active and first runs at nextRunAt. Each scheduled run does exactly one thing: it starts a new Spark chat with the saved prompt and context refs, the same as start_spark_run, and that Spark turn is metered and may consume credits. Runs always use review mode: Spark never generates creatives, changes Meta ads, or takes any other approval-gated action on its own; it only proposes those steps for the user to approve in Adrio. Write the prompt as a standalone task. Ask the user for their timezone if unknown. Set confirm=true only after the user approves the schedule and prompt.
create_media_upload
ChatGPTStep 1 of uploading a local image, video, or audio file (for example a soundtrack) to the brand media library. Returns a presigned uploadUrl: PUT the raw file bytes to it yourself with exactly the returned headers (see example), then call complete_media_upload with the uploadId. Upload each file once; identical bytes are deduplicated. Supported: png, jpg, webp, gif, avif, svg, mp4, mov, webm, mp3, wav, m4a, aac, ogg, flac. Caps: images 20MB, audio 50MB, video 150MB.
create_spark_brief_pdf
ChatGPTCreate a concise, structured Meta static-ad brief with campaign strategy, exact copy, test hypotheses, layout wireframes, and optional creative reference images. Research and author the brief before calling. Only images explicitly supplied in brief.references are embedded: do not use product packshots, logos, or decorative images as references because Spark treats embedded PDF images as candidate creative references. Pass the PDF attachment to start_spark_run or send_spark_message. This only stages the brief and does not consume generation credits.
create_swipe_file_board
ChatGPTCreate a named swipe-file board for the selected brand. Use this before save_ad_to_board when the user requests a board that does not exist.
delete_angle
ChatGPTPermanently delete one reusable communication angle. Set confirm=true only after the user explicitly confirms deletion.
delete_audience
ChatGPTPermanently delete one reusable audience. Set confirm=true only after the user explicitly confirms deletion.
delete_automation
ChatGPTDelete one Spark automation of the selected brand so it never runs again. Past runs and their chats stay. Set confirm=true only after the user explicitly confirms deletion.
find_matching_ads
ChatGPTFind competitor ads that genuinely match a described format/style/angle. A curation sub-agent runs several searches, uses a vision model to LOOK at each candidate ad image and score how well it matches your description, then returns only the strong visual matches (each with fitScore, strategyFit, formatFit, styleFit, and fitReason). This is a slow, multi-round tool by design. Image URLs are plain link strings, not inlined images. Hosts that support MCP Apps show the returned ads to the user as a visual gallery, so refer to ads by advertiser and hook in your reply instead of listing image URLs. Prefer this over search_ads for open-ended 'find ads like this / in this format' requests where visual fit matters.
get_ad_details
ChatGPTFetch the full analysis for a single competitor ad by adId: angle, audience, hook, copy, controlled tags, evidence, and all image URLs. Image URLs are returned as plain link strings, not inlined images. Use after search_ads or when the user references a specific ad.
get_brand_context
ChatGPTGet the selected brand's positioning, voice, visual identity, colors, logos, and fonts.
get_product
ChatGPTGet one product by productId, including benefits, archetypes, and image assets.
get_spark_run
ChatGPTGet current Spark run state, recent messages, pending approval, generation progress, available controls, and the Adrio chat link. Poll this after starting or controlling a run. Phases: "working" (Spark is thinking), "input_required" (resolve the pending approval), "dispatching"/"generating" (approved creatives are rendering; generation.counts and generation.creatives show progress), "completed" (every creative settled), "ready" (Spark replied and waits for you). generation.counts always covers every creative. By default generation.creatives lists only creatives still rendering, waiting, or failed (omittedCreatives says how many are left out), which is all a poll needs; pass creatives: "all" to list everything the chat made (newest first) with status, url, and ids you can pass back as contextRefs of type "creative", for example to turn finished statics into videos. Control tools (start, send, resolve, retry, cancel) return the same compact listing.
get_watchlisted_company_ads
ChatGPTRead analyzed ads for one company already in the selected brand's watchlist (angle research and funnel analysis). Only advertisers on the selected brand's watchlist are allowed. Image URLs are plain link strings, not inlined images. Hosts that support MCP Apps show the returned ads to the user as a visual gallery, so refer to ads by advertiser and hook in your reply instead of listing image URLs. Use list_watchlist_companies first to get an allowed advertiserId.
list_active_jobs
ChatGPTList active creative generation, editing, analysis, and Spark session jobs for the selected brand.
list_angles
ChatGPTList reusable communication angles saved for the selected brand.
list_audiences
ChatGPTList reusable audiences saved for the selected brand.
list_automations
ChatGPTList the selected brand's Spark automations (scheduled Spark runs) with their schedule, mode, and next run time, plus the templates create_automation can start from.
list_favorited_creatives
ChatGPTList the calling user's favorited creatives for the selected brand, newest favorite first. Results are paginated with limit and offset.
list_organisations
ChatGPTList every organisation the calling user belongs to, including every brand name and slug. Use this to find which organisation contains a requested brand, then call select_organisation with the organisation and brand slugs.
list_products
ChatGPTList products for the selected brand with generation-relevant details and image assets.
list_saved_ads
ChatGPTList ads saved to the selected brand's swipe file, optionally filtered by boards, media type, platform, or active status.
list_swipe_file_boards
ChatGPTList the selected brand's swipe-file boards with saved-ad counts and preview images.
list_watchlist_companies
ChatGPTList or search companies in the selected brand's competitor watchlist. Use this before company-specific competitor research so you can pass an advertiserId to get_watchlisted_company_ads.
pause_automation
ChatGPTPause one Spark automation of the selected brand so no scheduled runs start until it is resumed. Its settings and past runs stay. Set confirm=true only after the user approves pausing it.
remove_saved_ad
ChatGPTRemove a saved ad from every swipe-file board. Set confirm=true only after the user explicitly confirms removal.
resolve_spark_approval
ChatGPTAccept once, save the displayed allow scope for this user and brand, or decline Spark's pending internal tool approval and continue the run. Continuing Spark is metered and may consume user credits; only set confirm=true after explicit user approval.
resume_automation
ChatGPTResume one paused Spark automation of the selected brand in review mode. Resuming runs nothing right away; the next scheduled run starts at nextRunAt. Each scheduled run does exactly one thing: it starts a new Spark chat with the saved prompt and context refs, the same as start_spark_run, and that Spark turn is metered and may consume credits. Runs always use review mode: Spark never generates creatives, changes Meta ads, or takes any other approval-gated action on its own; it only proposes those steps for the user to approve in Adrio. Set confirm=true only after the user approves resuming it.
retry_spark_run
ChatGPTRetry the most recent failed Spark turn. This is metered and may consume user credits; only set confirm=true after explicit user approval.
save_ad_to_board
ChatGPTSave a competitor ad to one swipe-file board by adArchiveId. Omit boardId to use the default board, or call create_swipe_file_board first when the user requests a new named board. This operation is idempotent.
search_ads
ChatGPTSearch the analyzed competitor ad library by semantic angle query, company, tag filters (adStyle, hookTactic, offerType, awarenessStage, etc.), and/or similarity to a known ad (similarToAdId). Returns ad intelligence (angle, audience, hook, copy, tags, similarity) plus image URLs. Image URLs are plain link strings, not inlined images. Hosts that support MCP Apps show the returned ads to the user as a visual gallery, so refer to ads by advertiser and hook in your reply instead of listing image URLs. For open-ended 'find ads in this format/style' requests where visual fit matters, prefer find_matching_ads; use search_ads for precise lookups (a specific company, or ads similar to a known adId).
search_media_library
ChatGPTFind brand media library assets (images, videos, audio) by text and type, for example to reuse an already uploaded soundtrack instead of uploading it again. Returns up to 24 assets with ids usable as mediaAssetIds.
select_organisation
ChatGPTSelect which organisation and brand subsequent MCP requests operate on. Use list_organisations to find both slugs. brandSlug is required when the organisation has multiple brands and optional when it has exactly one.
send_spark_message
ChatGPTSend another instruction or brief to a Spark run that is ready, completed, generating, or failed. When a PDF brief is attached, the message should contain only useful new direction not already present in the PDF; do not repeat or summarize it. If there is nothing to add, use a simple message such as "Generate ads from the brief." This starts a new metered Spark turn and may consume user credits; only set confirm=true after explicit user approval.
start_spark_run
ChatGPTStart a durable Spark creative-agent run. When a PDF brief is attached, the prompt should contain only useful instructions not already present in the PDF. If there is nothing to add, use a simple prompt such as "Generate ads from the brief." Do not repeat or summarize the PDF. Spark executes asynchronously and may pause for approval. This is metered and may consume user credits; only set confirm=true after explicit user approval.
update_angle
ChatGPTUpdate one reusable communication angle. Only supplied fields are changed.
update_audience
ChatGPTUpdate one reusable audience. Only supplied fields are changed.
update_automation
ChatGPTEdit the settings of one Spark automation of the selected brand: name, description, prompt, context refs, schedule, or email notifications. Only supplied fields change, and saving also puts the automation in review mode. Editing runs nothing and does not pause or resume it; use pause_automation or resume_automation for that. Each scheduled run does exactly one thing: it starts a new Spark chat with the saved prompt and context refs, the same as start_spark_run, and that Spark turn is metered and may consume credits. Runs always use review mode: Spark never generates creatives, changes Meta ads, or takes any other approval-gated action on its own; it only proposes those steps for the user to approve in Adrio. Set confirm=true only after the user approves the change.