skills/adcp-media-buy/SKILL.md
Execute AdCP Media Buy Protocol operations with sales agents - discover advertising products, create and manage campaigns, sync creatives, and track delivery. Use when users want to buy advertising, create media buys, interact with ad sales agents, or test advertising APIs.
npx skillsauth add adcontextprotocol/adcp adcp-media-buyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill enables you to execute the AdCP Media Buy Protocol with sales agents. Use the standard MCP tools (get_products, create_media_buy, sync_creatives, etc.) exposed by the connected agent.
The Media Buy Protocol provides 8 standardized tasks for managing advertising campaigns:
| Task | Purpose | Response Time |
|------|---------|---------------|
| get_products | Discover inventory using natural language | ~60s |
| list_authorized_properties | See publisher properties | ~1s |
| list_creative_formats | View creative specifications | ~1s |
| create_media_buy | Create campaigns | Minutes-Days |
| update_media_buy | Modify campaigns | Minutes-Days |
| sync_creatives | Upload creative assets | Minutes-Days |
| list_creatives | Query creative library | ~1s |
| get_media_buy_delivery | Get performance data | ~60s |
get_products with a natural language brieflist_creative_formats to understand creative requirementscreate_media_buy with selected products and budgetsync_creatives to add creative assetsget_media_buy_delivery to track performanceDiscover advertising products using natural language briefs.
Request:
{
"buying_mode": "brief",
"brief": "Looking for premium video inventory for a tech brand targeting developers",
"brand": {
"domain": "example.com"
},
"filters": {
"channels": ["video", "ctv"],
"budget_range": { "min": 5000, "max": 50000 }
}
}
Key fields:
buying_mode (string): Required discriminator - "brief" or "wholesale"brief (string): Natural language description of campaign requirementsbrand (object): Brand identity - { "domain": "acmecorp.com" }filters (object, optional): Filter by channels, budget, delivery_typeResponse contains:
products: Array of matching products with product_id, name, description, pricing_optionsformat_ids (supported creative formats) and targeting (available targeting)Get the list of publisher properties this agent can sell.
Request:
{}
No parameters required.
Response contains:
publisher_domains: Array of domain strings the agent is authorized to sellView supported creative specifications.
Request:
{
"asset_types": ["video", "image"]
}
Key fields:
asset_types (array, optional): Filter by asset types (image, video, audio, text, html, vast, etc.)name_search (string, optional): Case-insensitive partial match on name or descriptionResponse contains:
formats: Array of format specifications with dimensions, requirements, and asset schemasCreate an advertising campaign from selected products.
Request:
{
"brand": {
"domain": "acme.com"
},
"packages": [
{
"product_id": "premium_video_30s",
"pricing_option_id": "cpm-standard",
"budget": 10000
}
],
"start_time": {
"type": "asap"
},
"end_time": "2024-03-31T23:59:59Z"
}
Key fields:
brand (object, required): Brand identity - { "domain": "acmecorp.com" }packages (array, required): Products to purchase, each with:
product_id: From get_products responsepricing_option_id: From product's pricing_optionsbudget: Amount in dollarsbid_price: Required for auction pricingtargeting_overlay: Additional targeting constraintscreative_ids or creatives: Creative assignmentsstart_time (object, required): { "type": "asap" } or { "type": "scheduled", "datetime": "..." }end_time (string, required): ISO 8601 datetimeResponse contains:
media_buy_id: The created campaign identifierstatus: Current lifecycle state — pending_creatives (no creatives assigned yet), pending_start (waiting for flight date), or active (serving immediately)packages: Created packages with their IDsModify an existing campaign.
Request:
{
"media_buy_id": "mb_abc123",
"updates": {
"budget_change": 5000,
"end_time": "2024-04-30T23:59:59Z",
"status": "paused"
}
}
Key fields:
media_buy_id (string, required): The campaign to updateupdates (object): Changes to apply - budget_change, end_time, status, targeting, etc.Upload and manage creative assets.
Request:
{
"creatives": [
{
"creative_id": "hero_video_30s",
"name": "Brand Hero Video",
"format_id": {
"agent_url": "https://creative.adcontextprotocol.org",
"id": "video_standard_30s"
},
"assets": {
"video": {
"url": "https://cdn.example.com/hero.mp4",
"width": 1920,
"height": 1080,
"duration_ms": 30000
}
}
}
],
"assignments": {
"hero_video_30s": ["pkg_001", "pkg_002"]
}
}
Key fields:
creatives (array, required): Creative assets to sync
creative_id: Your unique identifierformat_id: Object with agent_url and id from format specificationsassets: Asset content (video, image, html, etc.)assignments (object, optional): Map creative_id to package IDsdry_run (boolean): Preview changes without applyingdelete_missing (boolean): Archive creatives not in this syncQuery the creative library with filtering.
Request:
{
"filters": {
"status": ["active"]
},
"limit": 20
}
Retrieve performance metrics for a campaign.
Request:
{
"media_buy_id": "mb_abc123",
"granularity": "daily",
"date_range": {
"start": "2024-01-01",
"end": "2024-01-31"
}
}
Response contains:
delivery: Aggregated metrics (impressions, spend, clicks, etc.)by_package: Breakdown by packagetimeseries: Data points over time if granularity specifiedBrand context is provided by domain reference:
{
"brand": {
"domain": "acmecorp.com"
}
}
The agent resolves the domain to retrieve the brand's identity (name, colors, guidelines, etc.) from its brand.json file.
Creative format identifiers are structured objects:
{
"format_id": {
"agent_url": "https://creative.adcontextprotocol.org",
"id": "display_300x250"
}
}
The agent_url specifies which creative agent defines the format. Use https://creative.adcontextprotocol.org for standard IAB formats.
Products include pricing_options array. Each option has:
pricing_option_id: Use this in create_media_buypricing_model: "cpm", "cpm-auction", "flat-fee", etc.price: Base price (for fixed pricing)floor: Minimum bid (for auction)For auction pricing, include bid_price in your package.
Operations like create_media_buy and sync_creatives may require human approval. The response includes:
status: "pending" - Operation awaiting approvaltask_id - For tracking async progressPoll or use webhooks to check completion status.
Common error patterns:
Error responses include:
{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "budget must be greater than 0",
"field": "packages[0].budget"
}
]
}
For testing without real transactions, agents may support:
X-Dry-Run: true header - Preview without side effectstest: true flagAsk the agent about testing capabilities before creating real campaigns.
data-ai
Execute AdCP Signals Protocol operations with signal agents - discover audience signals using natural language and activate them on DSPs or sales agents. Use when users want to find targeting data, activate audience segments, or work with signal providers.
development
Execute AdCP Creative Protocol operations with creative agents - build creatives from briefs or existing assets, preview renderings, and discover format specifications. Use when users want to generate or transform ad creatives, preview how ads will look, or understand creative format requirements.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.