supported_protocols: ["brand"] in get_adcp_capabilities. The specific tasks it implements define its role:
| Role | Tasks | Example |
|---|---|---|
| Identity provider | get_brand_identity | Acme DAM serving brand assets and guidelines |
| Rights manager | get_rights + acquire_rights | Pinnacle Agency licensing talent |
| Both | All three | Nova Talent managing identity and rights |
Server setup
Every brand agent starts with an MCP server that registers AdCP tasks as tools.get_adcp_capabilities so buyer agents can discover your supported protocols:
Transport and HTTP setup
Wire the MCP server to an HTTP endpoint so buyer agents can reach it over the network:/mcp. For production, add authentication middleware and CORS headers.
Tier 1: identity only
Implementget_brand_identity to serve brand data from your DAM or brand portal.
Public vs authorized data
Everyget_brand_identity response includes the public baseline: brand_id, house, names, description, industries, keller_type, basic logos, and tagline. No authentication required.
Authorized callers — linked via sync_accounts — get deeper data on top of that baseline: high-res assets, voice synthesis configs, tone guidelines, and rights availability.
fields: ["logos", "tone"], they get logos but not tone. The response includes available_fields: ["tone"] so the caller knows what linking their account would unlock.
Tier 2: rights only
Addget_rights and acquire_rights for rights discovery and licensing. This is the path for talent agencies and music sync platforms.
acquire_rights follows the same pattern — accept a rights_id and pricing_option_id from get_rights, clear against existing contracts, and return terms with generation credentials. The response includes an authenticated approval_webhook (using push-notification-config) so buyers can submit creatives for review. See the acquire_rights task reference for the full schema.
Confidential brand rules
Brands often have rules they cannot disclose — public figure policies, internal exclusion lists, legal restrictions. Your agent evaluates these internally and returns a sanitized reason without revealing the rule itself. The protocol supports this through a simple convention: if the rejection includessuggestions, the buyer can fix the problem. If it doesn’t, the rejection is final and the buyer should move on.
get_rights exclusions: include suggestions on excluded results when the buyer can adjust their query (different market, different dates), omit them when the exclusion is non-negotiable.
Defending against probing
A determined buyer agent could callget_rights with slight variations — different brands, industries, countries — to map out your confidential rules through the pattern of rejections. Mitigate this by:
- Using consistent generic language across similar confidential rejections. If three different rules all produce “This conflicts with our talent lifestyle guidelines,” the buyer learns nothing from repeated attempts.
- Returning the same reason regardless of which specific rule triggered it. Don’t vary the wording based on the rule — that creates a side channel.
- Rate limiting discovery calls per buyer. Track query volume per
buyer_brandand return progressively less specific reasons after a threshold.
exclusivity_status.existing_exclusives field in get_rights responses deserves special care. Populating it with specific deal terms (“exclusive with Acme Sports in NL through Q3”) reveals competitive intelligence. Use vague descriptions (“exclusive commitment in this category”) or omit the field entirely when confidentiality is a concern.
Field selection and use case
Thefields parameter lets callers request only the sections they need. Implement this efficiently — avoid loading expensive data (asset catalogs, voice configs) when not requested:
use_case parameter is advisory — it tailors content within returned sections but does not override fields. A "likeness" use case prioritizes action photos in the logos section; a "creative_production" use case prioritizes vector logos and brand marks.
Multi-tenancy
A single MCP endpoint can serve multiple brands. Thebrand_id parameter in every request disambiguates which brand the caller is asking about.
brand.json file’s brands array so buyer agents can discover them before making MCP calls.
Account linking
Buyers establish authorization by callingsync_accounts on your agent. After linking, their subsequent get_brand_identity requests are recognized as authorized.
Implement the accounts protocol to support this. The linked account is identified by the caller’s credentials in the MCP transport — you do not need to pass account IDs in brand protocol requests.
Extracting caller identity
Rights and creative integration
After a buyer acquires rights throughacquire_rights, they receive generation_credentials and a rights_constraint. These connect the rights grant to creative production.
From the brand agent’s perspective
When implementingacquire_rights, return both pieces in the response:
How buyers use these
The buyer’s orchestrator passesgeneration_credentials to their creative agent, which uses them with the AI provider. The rights_constraint is embedded in the creative manifest’s rights array — it travels with the creative through the supply chain so every system in the chain knows the usage terms.
generation_credentials to authenticate with the AI provider (Midjourney, ElevenLabs, etc.) and produces the asset. The rights array becomes part of the creative manifest metadata — downstream systems (ad servers, verification vendors) can inspect it to confirm the creative is properly licensed.
For the full creative manifest specification, see creative manifests.
Testing
Use thevalidate_brand_agent MCP tool to verify your agent is reachable and responding correctly. For automated testing during development, use the MCP SDK’s in-memory transport:
available_fields lists withheld sections, and brand_not_found errors for invalid IDs.
Deployment checklist
-
brand.jsonhosted at/.well-known/brand.jsonwithbrand_agent.urlpointing to your MCP endpoint -
get_adcp_capabilitiesreturnssupported_protocols: ["brand"] -
get_brand_identityreturns core fields for public callers -
get_brand_identityreturns deeper data for authorized callers -
available_fieldscorrectly lists withheld sections - Error responses use the
errorsarray format - If implementing rights:
get_rightsreturns pricing options andacquire_rightsreturns terms
Related
- Brand protocol overview — How brand discovery works
- brand.json spec — File format for brand declaration
- get_brand_identity — Identity task reference
- get_rights — Rights discovery task reference
- acquire_rights — Rights acquisition task reference
- Accounts overview — How account linking works