From adcp-client
Executes AdCP Governance Protocol tasks to manage property and collection lists, content standards for brand safety, and campaign governance including plans, checks, outcomes, and audit trails.
npx claudepluginhub adcontextprotocol/adcp-client --plugin adcp-clientThis skill uses the workspace's default tool permissions.
This skill enables you to execute the AdCP Governance Protocol with governance agents. Covers four areas: property lists (site-level targeting), collection lists (program-level targeting), content standards (brand safety rules), and campaign governance (plans, checks, outcomes, audit trail).
Executes AdCP Media Buy Protocol tasks with sales agents: discover ad products via natural language, create/update campaigns, sync creatives/catalogs, track delivery. Use for media buys, ad sales interactions, or ad API testing.
Manage ad campaigns across Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads via Adspirer MCP server. Analyze performance, research keywords, create campaigns, optimize budgets.
Automates Klaviyo email/SMS marketing via Rube MCP: list/filter campaigns, get details, inspect messages, track tags, monitor send jobs. For marketing ops workflows.
Share bugs, ideas, or general feedback.
This skill enables you to execute the AdCP Governance Protocol with governance agents. Covers four areas: property lists (site-level targeting), collection lists (program-level targeting), content standards (brand safety rules), and campaign governance (plans, checks, outcomes, audit trail).
Buyer-side basics — idempotency replay,
oneOfvariants, asyncstatus:'submitted'polling, error recovery fromadcp_error.issues[]— live inskills/call-adcp-agent/SKILL.md. This skill covers per-task semantics only.
The Governance Protocol provides 21 standardized tasks across four areas:
| Task | Purpose | Response Time |
|---|---|---|
create_property_list | Create include/exclude list | ~1s |
update_property_list | Modify list filters/properties | ~1s |
get_property_list | Retrieve list with optional resolution | ~1-5s |
list_property_lists | List all accessible lists | ~1s |
delete_property_list | Delete a list | ~1s |
| Task | Purpose | Response Time |
|---|---|---|
create_collection_list | Create program-level list | ~1s |
update_collection_list | Modify list | ~1s |
get_collection_list | Retrieve with optional resolution | ~1-5s |
list_collection_lists | List all accessible lists | ~1s |
delete_collection_list | Delete a list | ~1s |
| Task | Purpose | Response Time |
|---|---|---|
create_content_standards | Create brand safety rules | ~1s |
get_content_standards | Retrieve standards by ID | ~1s |
update_content_standards | Modify rules | ~1s |
list_content_standards | List all accessible standards | ~1s |
calibrate_content | Test content against standards | ~5-30s |
get_media_buy_artifacts | Get creatives for compliance review | ~5s |
validate_content_delivery | Audit delivery compliance | ~10-60s |
| Task | Purpose | Response Time |
|---|---|---|
sync_plans | Push or update a campaign plan with budget authority and policies | ~1s |
check_governance | Validate an action (intent or execution) against the plan | ~1-5s |
report_plan_outcome | Report a completed action so plan budget state advances | ~1s |
get_plan_audit_logs | Retrieve governance state, budget tracking, and audit trail | ~1-5s |
Experimental in 3.0. Campaign governance may change between 3.x releases with at least 6 weeks' notice. Sellers MUST declare
governance.campaigninexperimental_featuresto participate. See experimental status.
create_property_list with base properties and filtersget_property_list with resolve: true to see matched propertiesupdate_property_list to adjust filterslist_id in create_media_buy targetingcreate_collection_list with distribution IDs or genre filtersget_collection_list with resolve: true to see matched programscreate_content_standards with rulescalibrate_content with test samples to validate configurationget_media_buy_artifacts + validate_content_delivery for ongoing compliancesync_governance (lives in the Accounts protocol)sync_plans with budget authority, channel allocation, and resolved policy IDscheck_governance on intent (pre-discovery) and execution (pre-buy). Returns an opaque governance_context token the seller echoes on subsequent checks.report_plan_outcome so committed/remaining budget advancesget_plan_audit_logs filtered by governance_contexts for the requesting party. See audit trail: internal vs shareable views.Create a property list for brand safety and inventory targeting.
Request:
{
"name": "Premium News Properties",
"description": "Tier 1 news publishers for brand campaigns",
"base_properties": [
{
"selection_type": "publisher_tags",
"publisher_domain": "publisher.com",
"tags": ["premium", "news"]
}
],
"filters": {
"countries_all": ["US", "GB"],
"channels_any": ["display", "video"]
},
"brand": {
"domain": "acmecorp.com"
}
}
Key fields:
name (string, required): Human-readable namedescription (string, optional): Purpose of the listbase_properties (array, optional): Property sources — publisher_tags, publisher_ids, or identifiersfilters (object, optional): Resolution filters — countries_all, channels_any, property_types, feature_requirements, exclude_identifiersbrand (object, optional): Brand reference for automatic rule inferenceModify an existing property list.
Request:
{
"list_id": "pl_abc123",
"filters": {
"countries_all": ["US", "GB", "DE"],
"channels_any": ["display", "video", "ctv"]
}
}
Key fields:
list_id (string, required): Property list identifiername, description (string, optional): Update metadatabase_properties (array, optional): Replace property sourcesfilters (object, optional): Replace filter configurationRetrieve a property list with optional resolution.
Request:
{
"list_id": "pl_abc123",
"resolve": true,
"max_results": 50
}
Key fields:
list_id (string, required): Property list identifierresolve (boolean, optional): Resolve filters and return property identifiers (default: false)max_results (number, optional): Max properties when resolvedList all property lists accessible to the authenticated principal.
Request:
{
"name_contains": "premium"
}
Key fields:
name_contains (string, optional): Filter by name substringmax_results (number, optional): Max resultsDelete a property list.
Request:
{
"list_id": "pl_abc123"
}
Key fields:
list_id (string, required): Property list identifier to deleteCreate a collection list for program-level brand safety (CTV, podcast, streaming).
Request:
{
"name": "Family-Safe CTV Programs",
"description": "Programs suitable for family brand campaigns",
"base_collections": [
{
"selection_type": "publisher_genres",
"publisher_domain": "ctv-publisher.com",
"genres": ["family", "comedy"],
"genre_taxonomy": "iab_content_taxonomy_3.0"
}
],
"filters": {
"content_ratings_exclude": [
{ "system": "us_tv", "rating": "TV-MA" }
],
"kinds": ["series"]
},
"brand": {
"domain": "familybrand.com"
}
}
Key fields:
name (string, required): Human-readable namebase_collections (array, optional): Collection sources — distribution_ids, publisher_collections, or publisher_genresfilters (object, optional): content_ratings_exclude, content_ratings_include, genres_exclude, genres_include, kinds, production_qualitybrand (object, optional): Brand referenceDistribution identifier types: imdb_id, gracenote_id, eidr_id
Modify an existing collection list.
Request:
{
"list_id": "cl_abc123",
"filters": {
"content_ratings_exclude": [
{ "system": "us_tv", "rating": "TV-MA" },
{ "system": "us_tv", "rating": "TV-14" }
]
}
}
Key fields:
list_id (string, required): Collection list identifierbase_collections, filters (optional): Replace configurationRetrieve a collection list with optional resolution.
Request:
{
"list_id": "cl_abc123",
"resolve": true
}
Key fields:
list_id (string, required): Collection list identifierresolve (boolean, optional): Resolve and return collection entriesmax_results (number, optional): Max collections when resolvedList all collection lists accessible to the authenticated principal.
Request:
{
"name_contains": "family"
}
Delete a collection list.
Request:
{
"list_id": "cl_abc123"
}
Create content standards (brand safety rules) for campaign compliance.
Request:
{
"name": "Automotive Brand Safety",
"description": "Content rules for automotive brand campaigns",
"rules": [
{ "rule_type": "category", "action": "block", "value": "violence", "severity": "critical" },
{ "rule_type": "category", "action": "block", "value": "adult", "severity": "critical" },
{ "rule_type": "keyword", "action": "flag", "value": "accident", "severity": "medium" }
],
"brand": {
"domain": "automaker.com"
}
}
Key fields:
name (string, required): Human-readable namerules (array, optional): Content rules — rule_type, action (allow/block/flag), value, severitybrand (object, optional): Brand reference for automatic rule inferenceRetrieve content standards by ID.
Request:
{
"standards_id": "cs_abc123"
}
Modify existing content standards.
Request:
{
"standards_id": "cs_abc123",
"rules": [
{ "rule_type": "category", "action": "block", "value": "violence", "severity": "critical" }
]
}
List all content standards accessible to the authenticated principal.
Request:
{
"name_contains": "automotive"
}
Test content samples against content standards to validate configuration.
Request:
{
"standards_id": "cs_abc123",
"samples": [
{ "url": "https://example.com/article1", "expected_result": "allow" },
{ "url": "https://example.com/article2", "expected_result": "block" },
{ "text": "Car crash injures three people", "expected_result": "block" }
]
}
Key fields:
standards_id (string, required): Content standards to calibrate againstsamples (array, required): Content samples with url and/or text, and optional expected_resultGet creative artifacts from a media buy for compliance review.
Request:
{
"media_buy_id": "mb_abc123",
"sales_agent_url": "https://sales.publisher.com"
}
Key fields:
media_buy_id (string, required): Media buy identifiersales_agent_url (string, required): Sales agent that owns the media buyValidate delivered content against content standards.
Request:
{
"standards_id": "cs_abc123",
"media_buy_id": "mb_abc123",
"sales_agent_url": "https://sales.publisher.com",
"date_range": {
"start": "2025-01-01",
"end": "2025-01-31"
}
}
Key fields:
standards_id (string, required): Content standards to validate againstmedia_buy_id (string, required): Media buy identifiersales_agent_url (string, required): Sales agent URLdate_range (object, optional): Filter by delivery date rangeRegister or update a campaign plan that defines authorized parameters (budget, channels, policies) for an orchestrator's autonomous action.
Request:
{
"plan_id": "plan_q1_2026_launch",
"plan_version": 1,
"budget": { "authorized": 500000, "currency": "USD" },
"channel_allocation": { "olv": 0.55, "display": 0.30, "audio": 0.15 },
"policies": ["us_coppa", "alcohol_advertising"],
"human_review_required": false
}
Key fields:
plan_id (string, required): Stable plan identifierplan_version (integer, required): Increment on every modification — checks bind to a versionbudget.authorized (number, required): Total spend authority across all governed actions on this planpolicies (array, optional): Registry policy IDs that govern this plan. Inline custom_policies may add restrictions but cannot relax registry policies.human_review_required (boolean, optional): Force human review on all actions. Auto-set true when any resolved policy has requires_human_review: true.Validate an action against the plan. Called twice in the lifecycle: once on intent (pre-discovery), once on execution (pre-buy). Sellers MUST call execution checks independently using credentials synced via sync_governance.
Request (execution check):
{
"plan_id": "plan_q1_2026_launch",
"plan_version": 1,
"purchase_type": "media_buy",
"tool": "create_media_buy",
"payload": { "...": "the create_media_buy request body" },
"governance_context": "gc_mb_seller_456"
}
Key fields:
purchase_type (enum, required): media_buy, rights_license, signal_activation, or creative_servicesgovernance_context (string, optional): Echoed on subsequent checks for the same governed action. The agent issues this on the first check and the buyer attaches it to the action envelope.tool (string, required): Which AdCP tool is being authorizedpayload (object, required): The full request body the orchestrator/seller would otherwise sendResponse status: approved, denied, or conditions. On denied, read governance_context.findings[] to locate the failed rule and correct the payload.
Report the result of a governed action so plan budget and state advance.
Request:
{
"plan_id": "plan_q1_2026_launch",
"governance_context": "gc_mb_seller_456",
"outcome": "completed",
"committed_budget": 150000
}
Key fields:
governance_context (string, required): The token issued on the original checkoutcome (enum, required): completed, cancelled, failed, or delivery (for ongoing pacing reports)committed_budget (number, required for completed): Net budget committed by this actionRetrieve governance state, budget tracking, and audit trail for one or more plans.
Request:
{
"plan_ids": ["plan_q1_2026_launch"],
"governance_contexts": ["gc_mb_seller_456"],
"include_entries": true
}
Key fields:
plan_ids / portfolio_plan_ids / governance_contexts (at least one required): Scope the queryinclude_entries (boolean, optional): Return the full audit trail. Default false returns summary only.Producing a shareable view: filter governance_contexts to the requesting party's actions and strip plan-level aggregates (budget.*, channel_allocation.*, summary.drift_metrics) before forwarding. See audit trail: internal vs shareable views.
Property and collection lists combine static selections with dynamic filters. Use resolve: true on get operations to see the final resolved set of properties or collections.
These three properties of campaign governance shape what an orchestrator can disclose, can rely on a counterparty having, and cannot work around. Surface them when audit-trail design or counterparty disclosure decisions come up.
custom_policies (or inline policy entries on a plan) may add restrictions on top of registry-sourced policies. They MUST NOT relax, override, or disable registry policies. Counterparties who see policies_evaluated: ["us_coppa"] can trust the registry version of us_coppa was applied at its declared enforcement level.governance_context is the seller-visible correlation token; full plan/budget data is buyer-side. The seller sees the opaque token they were issued and the entries scoped to it. Plan-level totals (budget.authorized, channel_allocation, drift_metrics) belong to the buyer's internal view and are never shared by default.plan_hash is the cryptographic attestation surface. base64url_no_pad(SHA-256(JCS(plan_payload))) over the plan revision the check evaluated. Any party with the plan revision can recompute and byte-compare. This is what makes a four-field shareable attestation (governance_context, status, plan_hash, policies_evaluated) cryptographically meaningful — counterparties don't have to trust the buyer's summary.A related working-group adoption pattern —
effective_dateenabling informational-before-enforcement of new policies — lives in Policy Registry; it shapes registry rollout rather than per-check disclosure decisions.
Common error codes:
LIST_NOT_FOUND: Invalid list_idSTANDARDS_NOT_FOUND: Invalid standards_idUNAUTHORIZED: Not authorized to access this resourceVALIDATION_ERROR: Invalid filter or rule configurationPLAN_NOT_FOUND: No plan with this ID, or the principal is not authorized for it. Returned indistinguishably from the unauthorized case to prevent plan-ID enumeration.GOVERNANCE_DENIED: check_governance rejected the action. Read governance_context.findings[] to identify the failed rule, correct the payload, and retry.