MCP App Store
by KeenEthics

Overview

Adrio is an AI media buyer for Meta ads. Connect your Adrio account and run your Facebook and Instagram advertising from ChatGPT. Create ads: brief Spark, Adrio's creative agent, to make static and video ad creatives from your products, brand voice and winning angles. Launch ads: send finished creatives to Meta through Adrio's ad launcher, with campaigns, ad sets and copy planned from what has worked for your account before. Manage media buying: Spark watches performance and proposes what to scale, pause or test next. Research competitors: search a library of analyzed competitor ads by angle, hook, format or company, and save the best ones to swipe-file boards. Results open as interactive cards in the conversation. Nothing changes in your workspace or your Meta account, and no credits are spent, until you approve it.

Tools

cancel_spark_run

ChatGPT
Cancel a Spark run that is idle, failed, awaiting subscription, or waiting for approval. Set confirm=true only after explicit user approval.

complete_media_upload

ChatGPT
Step 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

ChatGPT
Create a reusable communication angle for the selected brand. A matching title returns the existing angle instead of creating a duplicate.

create_audience

ChatGPT
Create a reusable audience for the selected brand. A matching title returns the existing audience instead of creating a duplicate.

create_automation

ChatGPT
Save 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

ChatGPT
Step 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

ChatGPT
Create 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

ChatGPT
Create 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

ChatGPT
Permanently delete one reusable communication angle. Set confirm=true only after the user explicitly confirms deletion.

delete_audience

ChatGPT
Permanently delete one reusable audience. Set confirm=true only after the user explicitly confirms deletion.

delete_automation

ChatGPT
Delete 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

ChatGPT
Find 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

ChatGPT
Fetch 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

ChatGPT
Get the selected brand's positioning, voice, visual identity, colors, logos, and fonts.

get_product

ChatGPT
Get one product by productId, including benefits, archetypes, and image assets.

get_spark_run

ChatGPT
Get 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

ChatGPT
Read 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

ChatGPT
List active creative generation, editing, analysis, and Spark session jobs for the selected brand.

list_angles

ChatGPT
List reusable communication angles saved for the selected brand.

list_audiences

ChatGPT
List reusable audiences saved for the selected brand.

list_automations

ChatGPT
List 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

ChatGPT
List the calling user's favorited creatives for the selected brand, newest favorite first. Results are paginated with limit and offset.

list_organisations

ChatGPT
List 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

ChatGPT
List products for the selected brand with generation-relevant details and image assets.

list_saved_ads

ChatGPT
List ads saved to the selected brand's swipe file, optionally filtered by boards, media type, platform, or active status.

list_swipe_file_boards

ChatGPT
List the selected brand's swipe-file boards with saved-ad counts and preview images.

list_watchlist_companies

ChatGPT
List 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

ChatGPT
Pause 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

ChatGPT
Remove a saved ad from every swipe-file board. Set confirm=true only after the user explicitly confirms removal.

resolve_spark_approval

ChatGPT
Accept 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

ChatGPT
Resume 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

ChatGPT
Retry 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

ChatGPT
Save 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

ChatGPT
Search 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

ChatGPT
Find 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

ChatGPT
Select 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

ChatGPT
Send 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

ChatGPT
Start 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

ChatGPT
Update one reusable communication angle. Only supplied fields are changed.

update_audience

ChatGPT
Update one reusable audience. Only supplied fields are changed.

update_automation

ChatGPT
Edit 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.

Capabilities

InteractiveWrites

Example Prompts

Click any prompt to copy it.

App Stats

41

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily