Who has actually
shipped an agent.
The public agenticadvertising.org registry, tracked as a dated record rather than a snapshot in a slide. Observed automatically by the signals adaptor's watcher, which polls the registry daily at 13:00 UTC; this page is refreshed from its state snapshots when something changes. Last observed July 28, 2026.
- 16 sales
- 3 signals
- 1 creative
- 1 buying
The registry, agent by agent
| Agent | Type | Discovery | Endpoint | |
|---|---|---|---|---|
| AdCP Test Agent | Sales | Key-gated | test-agent.adcontextprotocol.org | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://test-agent.adcontextprotocol.org/mcp Tools — probed 2026-07-22 · Discovery itself requires credentials — the agent exists, but you need a key even to list its tools. HTTP 401 — bring a key. Probe it yourself (standard MCP discovery) | ||||
| Advertible Inc. | Sales | Open · 2 | adcp.4dvertible.com | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://adcp.4dvertible.com/mcp Tools — probed 2026-07-22 · tools/list answered publicly — the catalog below is the live capture.
Probe it yourself (standard MCP discovery) | ||||
| Adzymic (Mediacorp) | Sales | Error | mediacorp.sales-agent.adzymic.ai | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://mediacorp.sales-agent.adzymic.ai/mcp Tools — probed 2026-07-22 · The endpoint answered, but not with a valid MCP tools/list response. Bad Request: Missing session ID (HTTP 400) Probe it yourself (standard MCP discovery) | ||||
| Adzymic (SPH) | Sales | Error | sph.sales-agent.adzymic.ai | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://sph.sales-agent.adzymic.ai/mcp Tools — probed 2026-07-22 · The endpoint answered, but not with a valid MCP tools/list response. Bad Request: Missing session ID (HTTP 400) Probe it yourself (standard MCP discovery) | ||||
| Affinity Answers MCP Agent | Signals | Open · 2 | mcp.affinityanswers.com | |
| A signals provider: audience and contextual signals as agent-callable tools — capability discovery, natural-language signal search, and activation to a destination platform, with data access key-gated. MCP endpoint https://mcp.affinityanswers.com/mcp Tools — probed 2026-07-22 · tools/list answered publicly — the catalog below is the live capture.
Probe it yourself (standard MCP discovery) | ||||
| BidMachine Seller Agent | Sales | Key-gated | adcp.bidmachine.io | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://adcp.bidmachine.io/adcp/mcp Tools — probed 2026-07-22 · Discovery itself requires credentials — the agent exists, but you need a key even to list its tools. HTTP 401 — bring a key. Probe it yourself (standard MCP discovery) | ||||
| Celtra | Creative | Error | adcp-mcp.celtra.com | |
| A creative agent: creative assets and generation/validation workflows exposed as tools, so a buying agent can source or adapt creative inside the same protocol it transacts in. MCP endpoint https://adcp-mcp.celtra.com/mcp Tools — probed 2026-07-22 · The endpoint answered, but not with a valid MCP tools/list response. Bad Request: No valid session ID provided (HTTP 400) Probe it yourself (standard MCP discovery) | ||||
| Content Ignite | Sales | Error | sales-agent.contentignite.com | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://sales-agent.contentignite.com Tools — probed 2026-07-22 · The endpoint answered, but not with a valid MCP tools/list response. non-MCP or unexpected response (HTTP 500) Probe it yourself (standard MCP discovery) | ||||
| Cora AI Sales Agent | Sales | Open · 24 | sales-agent.coraai.org | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://sales-agent.coraai.org/mcp Tools — probed 2026-07-22 · tools/list answered publicly — the catalog below is the live capture.
Probe it yourself (standard MCP discovery) | ||||
| Dstillery | Sales | Error | adcp-signals-agent.dstillery.com | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://adcp-signals-agent.dstillery.com/mcp Tools — probed 2026-07-22 · The endpoint answered, but not with a valid MCP tools/list response. Bad Request: Missing session ID (HTTP 400) Probe it yourself (standard MCP discovery) | ||||
| Equativ | Sales | Open · 1 | adcp.equativ.com | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://adcp.equativ.com/v1/discover Tools — probed 2026-07-22 · tools/list answered publicly — the catalog below is the live capture.
Probe it yourself (standard MCP discovery) | ||||
| InMobi Exchange ADCP NonProd | Sales | Key-gated | adcp-nonprod.exchange.inmobi.com | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://adcp-nonprod.exchange.inmobi.com/mcp Tools — probed 2026-07-22 · Discovery itself requires credentials — the agent exists, but you need a key even to list its tools. HTTP 401 — bring a key. Probe it yourself (standard MCP discovery) | ||||
| InMobi Sales Agent | Sales | Key-gated | adcp-prod.exchange.inmobi.com | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://adcp-prod.exchange.inmobi.com/mcp Tools — probed 2026-07-22 · Discovery itself requires credentials — the agent exists, but you need a key even to list its tools. HTTP 401 — bring a key. Probe it yourself (standard MCP discovery) | ||||
| LoopMe Sales Agent | Sales | Key-gated | platform.loopme.ai | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://platform.loopme.ai/mcp/seller Tools — probed 2026-07-22 · Discovery itself requires credentials — the agent exists, but you need a key even to list its tools. HTTP 401 — bring a key. Probe it yourself (standard MCP discovery) | ||||
| No Fluff Advisory — Evgeny (Ev) Popovthis site | Signals | Open · 8 | adcp.signal-stack.io | |
| A signals provider: audience and contextual signals as agent-callable tools — capability discovery, natural-language signal search, and activation to a destination platform, with data access key-gated. MCP endpoint https://adcp.signal-stack.io/mcp Tools — probed 2026-07-22 · tools/list answered publicly — the catalog below is the live capture.
Probe it yourself (standard MCP discovery) | ||||
| Pubx Sales Agent | Sales | Error | selleragent.pubx.ai | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://selleragent.pubx.ai/mcp Tools — probed 2026-07-22 · The endpoint answered, but not with a valid MCP tools/list response. No catalog available. Probe it yourself (standard MCP discovery) | ||||
| Purrsonality Seller | Sales | Key-gated | seller.purrsonality.rocketscience.pl | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://seller.purrsonality.rocketscience.pl/mcp Tools — probed 2026-07-22 · Discovery itself requires credentials — the agent exists, but you need a key even to list its tools. HTTP 401 — bring a key. Probe it yourself (standard MCP discovery) | ||||
| Purrsonality Signals | Signals | Key-gated | signals.purrsonality.rocketscience.pl | |
| A signals provider: audience and contextual signals as agent-callable tools — capability discovery, natural-language signal search, and activation to a destination platform, with data access key-gated. MCP endpoint https://signals.purrsonality.rocketscience.pl/mcp Tools — probed 2026-07-22 · Discovery itself requires credentials — the agent exists, but you need a key even to list its tools. HTTP 401 — bring a key. Probe it yourself (standard MCP discovery) | ||||
| Rediads Private Limited | Sales | Down | adcp.rediads.com | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://adcp.rediads.com/mcp Tools — probed 2026-07-22 · The endpoint did not respond within the probe window. This operation was aborted (HTTP —) Probe it yourself (standard MCP discovery) | ||||
| Swivel | Open · 11 | adcp.swivel.ai | ||
| A buyer-side agent: represents an advertiser or platform in discovery and transaction — the counterpart that calls sales, signals, and creative agents to assemble a buy. MCP endpoint https://adcp.swivel.ai/mcp Tools — probed 2026-07-22 · tools/list answered publicly — the catalog below is the live capture.
Probe it yourself (standard MCP discovery) | ||||
| vastlint | Sales | Open · 14 | vastlint.org | |
| A seller-side agent: exposes a publisher or SSP’s inventory to buying agents — discovery, availability, and deal construction over MCP instead of a UI or a bespoke API integration. MCP endpoint https://vastlint.org/mcp Tools — probed 2026-07-22 · tools/list answered publicly — the catalog below is the live capture.
Probe it yourself (standard MCP discovery) | ||||
| No agents match — clear the search or filter. | ||||
Registration means a live MCP endpoint speaking AdCP — not an announcement, an integration deck,
or a waitlist. Click any row for its tool catalog and a ready-to-run discovery call. The Discovery
column is a finding in itself (probed 2026-07-22): of 21 registered
agents, only 7 answer tools/list publicly — 7 key-gate discovery
itself, and 7 error or don't respond. Registered and discoverable are not yet the same thing.
- Opentools/list answered publicly — the catalog below is the live capture.
- Key-gatedDiscovery itself requires credentials — the agent exists, but you need a key even to list its tools.
- ErrorThe endpoint answered, but not with a valid MCP tools/list response.
- DownThe endpoint did not respond within the probe window.
What an agent actually returns
Not mockups — real exchanges, captured 2026-07-22: three against this site's own registered signals agent (discovery is public, capabilities are self-reported and versioned, data is key-gated), and a fourth against an open third-party sales agent, because the seller side of the protocol answers with different vocabulary — products, formats, media buys. New to the protocol itself? Start with the vendor-neutral AdCP guide.
1 tools/list — what can this agent do? public
The standard MCP discovery call. This agent exposes 8 tools — capability lookup, natural-language signal search, activation, status polling, and the UCP concept registry.
{
"tools": [
{
"name": "get_adcp_capabilities",
"description": "Returns the capabilities of this AdCP Signals Provider: supported operations, signal categories, available destinations, activation mode, and limits. Call this first to understand what the provider supports before searching or activating signals. Optionally pass `protocols` to filter the response to specific protocol blocks."
},
{
"name": "get_signals",
"description": "Discover and propose audience signals from this AdCP provider. Pass a natural language signal_spec to get AI-generated custom segment proposals alongside catalog signals. Proposals have signal_type='custom' and is_live=false — activate them to create and deploy. deliver_to is required: specifies target deployments and countries."
},
{
"name": "activate_signal",
"description": "Activate an audience signal to a destination platform. Returns task_id immediately with status 'pending' — this is an async operation. Poll get_operation_status with task_id to check progress. Optionally provide webhook_url to receive a POST callback on completion. If activating a custom proposal from get_signals (is_live=false), the segment is created on activation."
},
{
"name": "get_operation_status",
"description": "Poll the status of an async activation task. Returns current status: pending → working → completed (or failed). On completion, includes the activated deployments with activation keys. Use the task_id returned by activate_signal."
},
{
"name": "get_similar_signals",
"description": "Find audience signals semantically similar to a reference signal using UCP embedding cosine similarity. Returns ranked signals with similarity scores. Demonstrates UCP vector search vs keyword search — related signals cluster by taxonomy, category, and data source quality."
},
{
"name": "query_signals_nl",
"description": "Find audience signals matching a natural language description. Decomposes the query into a boolean AST (AND/OR/NOT), resolves each dimension against the signal catalog using hybrid rule+embedding+lexical matching, and returns ranked matches with a compositional audience size estimate. Use when the user describes a target audience in free-form language."
},
{
"name": "get_concept",
"description": "Look up a specific concept from the UCP Concept-Level VAC registry by concept_id. Returns the concept definition including label, description, constituent dimensions, and cross-taxonomy member nodes showing how it maps to IAB, LiveRamp, TradeDesk, etc."
},
{
"name": "search_concepts",
"description": "Semantic search over the UCP Concept Registry. Find concepts matching a natural language description. Use this to discover concept_ids for use in audience queries, or to explore what cross-taxonomy mappings exist for a given audience type. Optionally filter by category: demographic, interest, behavioral, geo, archetype, content, purchase_intent."
}
]
} 2 get_adcp_capabilities — versions, protocols, features public
This is where version compliance lives in practice: the agent self-reports supported_versions (here 3.0 and 3.1), its protocol blocks, signing posture, and experimental features. A buying agent calls this first and adapts.
{
"status": "completed",
"adcp_version": "3.1",
"adcp": {
"major_versions": [
3
],
"supported_versions": [
"3.0",
"3.1"
],
"idempotency": {
"supported": true,
"replay_ttl_seconds": 86400
}
},
"supported_protocols": [
"signals"
],
"specialisms": [
"signal-owned"
],
"request_signing": {
"supported": false,
"covers_content_digest": "either",
"required_for": [],
"warn_for": [],
"supported_for": []
},
"webhook_signing": {
"supported": false,
"legacy_hmac_fallback": true
},
"identity": {
"per_principal_key_isolation": false
},
"experimental_features": [
"ucp.embedding_bridge",
"ucp.concept_registry",
"ucp.gts_anchors",
"ucp.projector_simulation",
"dts.label_v1_2",
"cross_taxonomy.nine_systems",
"analytics.query_vector",
"analytics.semantic_arithmetic",
"analytics.analogy",
"analytics.neighborhood",
"analytics.coverage_gaps",
"analytics.knn_graph",
"analytics.lorenz",
"portfolio.pareto_frontier",
"portfolio.greedy_marginal_reach",
"portfolio.info_overlap",
"portfolio.from_brief",
"federation.a2a_dstillery",
"federation.cross_similarity",
"federation.multi_agent_orchestrator",
"governance.data_hygiene",
"governance.audit_log",
"measurement.reach_forecaster",
"measurement.lift_forecaster_mock",
"id_resolution.nine_id_types",
"temporal.seasonality_profiles",
"temporal.decay_half_life",
"temporal.volatility_index"
],
"wholesale_feed_versioning": {
"supported": true
},
"signals": {
"discovery_modes": [
"brief",
"wholesale"
],
"in_flight_max_seconds": 30,
"data_provider_domains": [
"evgeny.dev"
],
"features": {
"catalog_signals": true
},
"signal_categories": [
"demographic",
"interest",
"purchase_intent",
"geo",
"composite"
],
"dynamic_segment_generation": true,
"activation_mode": "async",
"provider": "AdCP Signals Adaptor - Demo Provider (Evgeny)",
"destinations": [
{
"id": "mock_dsp",
"name": "Mock DSP",
"type": "dsp",
"activation_supported": true,
"stage": "live",
"vendor": "Internal mock",
"activation_pattern": "push_async",
"auth_mechanism": "bearer_token (DEMO_API_KEY)",
"id_types_accepted": [
"segment_id",
"hashed_email",
"maid_ios",
"maid_android",
"uid2",
"ctv_device"
],
"data_format": "segment_id + platform_segment_id pair",
"segment_refresh_sla": "< 60 seconds (synchronous in demo)",
"latency_p50_ms": 120,
"latency_p99_ms": 450,
"use_cases": [
"Prospecting",
"Retargeting",
"CTV reach",
"Measurement passback"
],
"activation_flow": "activate_signal -> ephemeral platform_segment_id -> POST segment membership -> get_operation_status polling",
"docs_url": "https://github.com/EvgenyAndroid/adcp-signals-adaptor#mock-dsp",
"onboarding": "No onboarding — always live in demo.",
"notes": "Reference DSP that always returns completed within ~5 seconds. Safe target for any storyboard run."
},
{
"id": "mock_cleanroom",
"name": "Mock Clean Room",
"type": "cleanroom",
"activation_supported": true,
"stage": "live",
"vendor": "Internal mock (simulating Snowflake / Habu / InfoSum / AWS CR shape)",
"activation_pattern": "share_async",
"auth_mechanism": "cleanroom_agreement_id + bearer",
"id_types_accepted": [
"hashed_email",
"ramp_id",
"uid2",
"graph_id"
],
"data_format": "cleanroom table share (SIGNAL_MEMBERS)",
"segment_refresh_sla": "< 15 minutes",
"latency_p50_ms": 800,
"latency_p99_ms": 3500,
"use_cases": [
"1P x 2P match-rate analysis",
"Campaign overlap",
"Incrementality lift",
"No-PII joins"
],
"activation_flow": "activate_signal -> grant table share -> cleanroom provider ingests -> membership available on next scheduled compute",
"docs_url": "https://github.com/EvgenyAndroid/adcp-signals-adaptor#mock-cleanroom",
"onboarding": "Mock — grants auto-accepted.",
"notes": "Models the governance boundary: buyer's 1P data never leaves their clean-room tenant. Returns a stub JOIN matrix."
},
{
"id": "mock_cdp",
"name": "Mock CDP",
"type": "cdp",
"activation_supported": true,
"stage": "live",
"vendor": "Internal mock (simulating Segment / mParticle / Tealium / Treasure Data shape)",
"activation_pattern": "push_sync",
"auth_mechanism": "write_key",
"id_types_accepted": [
"user_id",
"anonymous_id",
"hashed_email"
],
"data_format": "Audience membership events (audience_entered / audience_exited)",
"segment_refresh_sla": "real-time (stream)",
"latency_p50_ms": 60,
"latency_p99_ms": 220,
"use_cases": [
"Personalization",
"Owned-channel orchestration",
"Email / push audience sync"
],
"activation_flow": "activate_signal -> stream audience_entered events keyed by user_id -> CDP fans out to downstream tools",
"docs_url": "https://github.com/EvgenyAndroid/adcp-signals-adaptor#mock-cdp",
"onboarding": "Mock — write-key auto-provisioned.",
"notes": "Best fit when the audience drives owned-channel surfaces (email, push, on-site) vs paid media."
},
{
"id": "mock_measurement",
"name": "Mock Measurement Platform",
"type": "measurement",
"activation_supported": false,
"stage": "live",
"vendor": "Internal mock (simulating Nielsen DAR / Kantar / IAS / DV shape)",
"activation_pattern": "read_only",
"auth_mechanism": "api_key",
"id_types_accepted": [
"segment_id"
],
"data_format": "Lift / reach / frequency report rows",
"segment_refresh_sla": "T+1 day (batch)",
"latency_p50_ms": null,
"latency_p99_ms": null,
"use_cases": [
"Brand-lift studies",
"Campaign reach validation",
"Third-party verification"
],
"activation_flow": "Not an activation target. Read-only: fetches lift/reach reports tagged to a signal's activations.",
"docs_url": "https://github.com/EvgenyAndroid/adcp-signals-adaptor#mock-measurement",
"onboarding": "Mock — reports synthesized per signal.",
"notes": "activation_supported=false by design. Surfaced so planners see measurement coverage alongside activation."
},
{
"id": "ttd_sandbox",
"name": "The Trade Desk (sandbox)",
"type": "dsp",
"activation_supported": false,
"stage": "sandbox",
"vendor": "The Trade Desk",
"activation_pattern": "push_async",
"auth_mechanism": "oauth2 (TTD Partner Console)",
"id_types_accepted": [
"ttd_id",
"uid2",
"hashed_email",
"maid_ios",
"maid_android"
],
"data_format": "Third-party data segment CSV upload (TTD DMP format)",
"segment_refresh_sla": "< 24 hours",
"latency_p50_ms": null,
"latency_p99_ms": null,
"use_cases": [
"Open-web DSP activation",
"CTV across TTD's OpenPath inventory",
"UID2 cookieless targeting"
],
"activation_flow": "activate_signal -> request OAuth consent -> upload segment CSV via TTD Partner API -> segment available in TTD UI once ingested",
"docs_url": "https://partner.thetradedesk.com/v3/portal/api/doc/ThirdPartyData",
"onboarding": "Requires TTD Partner account + OAuth app registration. Target Q2 2026.",
"notes": "Roadmap. When live, will be the default DSP for UID2-centric cookieless plans."
},
{
"id": "dv360_sandbox",
"name": "DV360 (sandbox)",
"type": "dsp",
"activation_supported": false,
"stage": "sandbox",
"vendor": "Google Display & Video 360",
"activation_pattern": "push_async",
"auth_mechanism": "oauth2 (Google Cloud / DV360 API)",
"id_types_accepted": [
"hashed_email",
"maid_ios",
"maid_android",
"publisher_provided_id"
],
"data_format": "Customer Match list upload (Google Ads API)",
"segment_refresh_sla": "< 12 hours",
"latency_p50_ms": null,
"latency_p99_ms": null,
"use_cases": [
"YouTube reach",
"Programmatic display",
"Customer Match seed audiences"
],
"activation_flow": "activate_signal -> OAuth consent -> hash + upload via Customer Match API -> list available in DV360 after match-rate check",
"docs_url": "https://developers.google.com/display-video/api/reference/rest",
"onboarding": "Requires Google Ads account + MCC access + OAuth app. Target Q3 2026.",
"notes": "Roadmap. When live, will be the default DSP for Google-ecosystem plans."
}
],
"limits": {
"max_signals_per_request": 100,
"max_rules_per_segment": 6,
"default_max_results": 5
}
},
"ext": {
"compliance": {
"spec_version": "adcp_3.0",
"client_runner": "@adcp/sdk@12.0.0",
"last_run": "2026-07-16",
"results": {
"applicable": 7,
"passed": 7,
"failed": 0,
"skipped": 32,
"scenarios_run": [
"capability_discovery",
"discovery",
"error_handling",
"health_check",
"schema_compliance",
"signals_flow",
"validation"
]
},
"non_applicable_scenarios": [
{
"scenario": "media-buy / creative / governance / brand-rights tracks",
"reason": "Require get_products, create_media_buy, sync_creatives, build_creative, si_*, check_governance, check_brand_rights tools that a signals-only agent does not expose. 32 scenarios skip cleanly per the runner's tool-gated applicability logic.",
"upstream_issue": "https://github.com/adcontextprotocol/adcp/issues/2916",
"upstream_status": "resolved — 5.25 runner emits capability-aware skip_if; signals-only agents no longer lose the error/schema/validation tracks."
}
],
"report": "docs/SEC42_ADCP_30_GA_COMPLIANCE.md",
"reproduce": "API_KEY=$DEMO_API_KEY AGENT_URL=https://adcp.signal-stack.io/mcp npm run compliance"
},
"ucp": {
"supported_spaces": [
"openai-te3-small-d512-v1"
],
"supported_encodings": [
"float32"
],
"dimensions": [
512
],
"embedding_endpoint_template": "/signals/{signal_id}/embedding",
"similarity_search": true,
"phase": "llm-v1",
"gts_version": "adcp-gts-v1.0"
},
"dts": {
"supported": true,
"version": "1.2",
"iab_techlab_compliant": true,
"label_field": "x_dts",
"privacy_compliance_mechanisms": [
"TCF (Europe)",
"GPP",
"MSPA",
"USPrivacy",
"GPC"
],
"supported_precision_levels": [
"Individual",
"Household",
"Device",
"Browser",
"Geography"
],
"offline_sources_supported": true,
"provider_privacy_policy_url": "https://adcp-signals-adaptor.evgeny-193.workers.dev/privacy"
},
"id_resolution": {
"supported": true,
"cookieless_ready": true,
"id_types_supported": [
"cookie_3p",
"maid_ios",
"maid_android",
"ctv_device",
"uid2",
"ramp_id",
"id5",
"hashed_email",
"ip_only"
],
"graph_partners": [
{
"name": "UID 2.0",
"stage": "sandbox",
"endpoint": null
},
{
"name": "ID5",
"stage": "sandbox",
"endpoint": null
},
{
"name": "LiveRamp RampID",
"stage": "roadmap",
"endpoint": null
},
{
"name": "Yahoo ConnectID",
"stage": "roadmap",
"endpoint": null
}
],
"resolution_method": "derived_from_dts",
"resolution_surface": "/signals/{signal_agent_segment_id} x_dts.data_sources + audience_precision_levels"
},
"measurement": {
"supported": true,
"reach_forecasting": {
"supported": true,
"endpoint": "/signals/{id} (detail panel)",
"methodology": "logistic saturation against declared CPM + budget"
},
"overlap_analysis": {
"supported": true,
"endpoint": "/signals/overlap",
"methodology": "category_affinity × min/max Jaccard heuristic"
},
"lift_measurement": {
"supported": "mock",
"partners_roadmap": [
"Nielsen",
"IAS",
"DV",
"Kantar",
"Circana"
]
},
"delivery_simulation": {
"supported": "mock",
"surface": "/signals/{id} detail panel (post-activation)"
}
},
"governance": {
"audit_log": {
"supported": true,
"endpoint": "/mcp/recent",
"retention_days": 7,
"export_format": "csv_download"
},
"sensitive_category_flagging": {
"supported": true,
"categories_flagged": [
"health",
"financial",
"political"
],
"surface": "x_governance.sensitive block on signal + UI pill in signal detail"
},
"opt_out_url": "https://adcp-signals-adaptor.evgeny-193.workers.dev/privacy#opt-out",
"audience_bias_governance_schema": {
"supported": true,
"version": "adcp_3.0"
},
"data_hygiene": {
"supported": true,
"schedule": {
"cron": "0 6 * * SUN",
"cadence": "weekly",
"timezone": "UTC"
},
"retention": {
"dynamic_signals_days": 7,
"activation_jobs_days": 30,
"tool_call_log_days": 7,
"oauth_state_minutes": 10
},
"preserved": [
"seeded signals (canonical catalog)",
"derived signals (shipped with code)",
"taxonomy nodes",
"source records"
],
"manual_trigger": {
"method": "POST",
"endpoint": "/admin/purge",
"auth": "DEMO_API_KEY bearer"
}
}
},
"analytics": {
"supported": true,
"endpoints": {
"query_vector": {
"method": "POST",
"path": "/ucp/query-vector"
},
"semantic_arithmetic": {
"method": "POST",
"path": "/ucp/arithmetic"
},
"analogy": {
"method": "POST",
"path": "/ucp/analogy"
},
"neighborhood": {
"method": "POST",
"path": "/ucp/neighborhood"
},
"coverage_gaps": {
"method": "GET",
"path": "/analytics/coverage-gaps"
},
"lorenz": {
"method": "GET",
"path": "/analytics/lorenz"
},
"summary": {
"method": "GET",
"path": "/analytics/summary"
},
"knn_graph": {
"method": "GET",
"path": "/analytics/knn-graph"
},
"seasonality": {
"method": "GET",
"path": "/analytics/seasonality"
},
"best_for_window": {
"method": "GET",
"path": "/analytics/best-for"
},
"portfolio_optimize": {
"method": "POST",
"path": "/portfolio/optimize"
},
"portfolio_pareto": {
"method": "GET",
"path": "/portfolio/pareto"
},
"portfolio_info_overlap": {
"method": "POST",
"path": "/portfolio/info-overlap"
},
"portfolio_from_brief": {
"method": "POST",
"path": "/portfolio/from-brief"
},
"portfolio_what_if": {
"method": "POST",
"path": "/portfolio/what-if"
},
"portfolio_hit_target": {
"method": "POST",
"path": "/portfolio/hit-target"
},
"audience_compose": {
"method": "POST",
"path": "/audience/compose"
},
"audience_saturation": {
"method": "POST",
"path": "/audience/saturation"
},
"audience_affinity_audit": {
"method": "POST",
"path": "/audience/affinity-audit"
},
"audience_journey": {
"method": "POST",
"path": "/audience/journey"
},
"audience_privacy_check": {
"method": "POST",
"path": "/audience/privacy-check"
},
"audience_holdout": {
"method": "POST",
"path": "/audience/holdout"
},
"audience_compose_ast": {
"method": "POST",
"path": "/audience/compose-ast"
},
"agents_directory": {
"method": "GET",
"path": "/agents/directory"
},
"agents_probe_all": {
"method": "GET",
"path": "/agents/probe-all"
},
"agents_orchestrate": {
"method": "POST",
"path": "/agents/orchestrate"
},
"agents_capability_matrix": {
"method": "GET",
"path": "/agents/capability-matrix"
},
"snapshot_save": {
"method": "POST",
"path": "/snapshots"
},
"snapshot_list": {
"method": "GET",
"path": "/snapshots"
},
"snapshot_get": {
"method": "GET",
"path": "/snapshots/:id"
},
"snapshot_delete": {
"method": "DELETE",
"path": "/snapshots/:id"
},
"snapshot_diff": {
"method": "POST",
"path": "/snapshots/diff"
}
},
"methods": {
"similarity_metric": "cosine",
"arithmetic_model": "vector_l2_normalized",
"analogy_algorithms": [
"3cos_add",
"3cos_mul"
],
"portfolio_solver": "greedy_marginal_reach",
"overlap_metrics": [
"jaccard",
"kl_divergence",
"mutual_information"
],
"projection_algorithms": [
"jl_random",
"umap_local_refine"
],
"set_op_overlap_model": "category_affinity_jaccard_pairwise_inclusion_exclusion",
"saturation_model": "poisson_1_minus_exp_neg_frequency",
"affinity_index_basis": "reach_weighted_share_vs_catalog_baseline",
"journey_model": "per_stage_compose_then_monotone_funnel",
"privacy_model": "k_anonymity_floor_plus_sensitive_category_keywords",
"holdout_model": "two_proportion_z_test_balanced_arms"
},
"limits": {
"max_arithmetic_terms": 6,
"max_portfolio_signals": 20,
"max_neighborhood_k": 50,
"max_query_vector_dim": 512,
"min_signals_for_info_overlap": 2,
"max_compose_signals": 20,
"max_saturation_signals": 15,
"max_affinity_audit_signals": 20
},
"signal_facets": {
"x_analytics_fields": [
"seasonality.monthly[12]",
"seasonality.peakMonth",
"decayHalfLifeDays",
"volatilityIndex",
"authorityScore",
"idStabilityClass"
],
"derivation": "deterministic_from_signal_metadata",
"note": "Facets computed at mapper time; no DB migration required."
}
},
"federation": {
"supported": true,
"protocol": "adcp_a2a_v0.1",
"endpoints": {
"registry": {
"method": "GET",
"path": "/agents/registry"
},
"federated_search": {
"method": "POST",
"path": "/agents/federated-search"
},
"cross_similarity": {
"method": "POST",
"path": "/agents/cross-similarity"
},
"reverse_taxonomy": {
"method": "POST",
"path": "/taxonomy/reverse"
}
},
"partners": [
{
"id": "dstillery",
"url": "https://adcp-signals-agent.dstillery.com/mcp",
"stage": "live",
"specialties": [
"behavioral_audiences",
"ttd_deployment"
]
},
{
"id": "peer39",
"stage": "roadmap",
"specialties": [
"contextual",
"brand_safety"
]
},
{
"id": "scope3",
"stage": "roadmap",
"specialties": [
"sustainability"
]
},
{
"id": "nextdata",
"stage": "roadmap",
"specialties": [
"b2b_intent"
]
}
],
"alignment_method": "procrustes_svd_shared_anchors",
"cache_ttl_seconds": 600
}
}
} 3 get_signals — the auth boundary key-gated
Sent without a key on purpose. Discovery and capabilities are open; the moment you ask for signal data, governance kicks in. The request shape:
{
"jsonrpc": "2.0", "id": 3, "method": "tools/call",
"params": {
"name": "get_signals",
"arguments": {
"signal_spec": "in-market for premium CTV, US households, privacy-safe",
"max_results": 2
}
}
} And the honest answer without authorization:
{
"jsonrpc": "2.0",
"id": 3,
"error": {
"code": -32001,
"message": "Authentication required for this method. Supply Authorization: Bearer <key>."
}
} 4 get_products — the seller side (Cora AI Sales Agent) public
The same protocol, different vocabulary: a third-party sales agent with open discovery, asked for products against a brief ("premium CTV inventory, US", two results). This is what a buying agent receives to construct a media buy from — products, publishers, channels, format IDs with durations, delivery detail.
{
"status": "completed",
"message": "Found 2 CORA AI products.",
"buying_mode": "brief",
"products": [
{
"product_id": "prod-arcastation-ssp",
"name": "Arcastation Korean FAST CTV",
"description": "Guaranteed CTV inventory across Korean FAST channels with premium lean-back viewing.",
"publisher": {
"name": "Arcastation",
"domain": "arcastation.com"
},
"domain": "arcastation.com",
"channel": "ctv",
"formats": [
"video"
],
"format_ids": [
{
"id": "video_16x9_30s",
"source": "iab",
"agent_url": "https://sales-agent.coraai.org/mcp/",
"duration_ms": 30000
},
{
"id": "ctv_video_30s",
"source": "coraai",
"agent_url": "https://sales-agent.coraai.org/mcp/",
"duration_ms": 30000
}
],
"delivery_type": "guaranteed",
"countries": [
"KR",
"US"
],
"inventory_ids": [
"inv-arcastation-ctv",
"arcastation-ssp"
],
"publisher_properties": [
{
"publisher_domain": "arcastation.com",
"selection_type": "by_id",
"property_ids": [
"arcastation_ssp"
]
}
],
"pricing_options": [
{
"pricing_option_id": "po-arcastation-cpm-usd",
"pricing_model": "cpm",
"currency": "USD",
"fixed_price": 15,
"billing_event": "impression"
}
],
"pricing": [
{
"type": "cpm",
"currency": "USD",
"cpm": 15
}
],
"forecast": {
"points": [
{
"label": "30 day availability",
"metrics": {
"impressions": {
"mid": 6500000
},
"spend": {
"mid": 97500
}
}
}
],
"forecast_range_unit": "availability",
"method": "estimate",
"currency": "USD",
"measurement_source": "seller_ad_server",
"generated_at": "2026-06-24T00:00:00Z"
},
"delivery_forecast": {
"guaranteed_impressions": 6500000,
"measurement_source": "seller_ad_server",
"forecast_range_unit": "impressions",
"confidence": "medium"
},
"reporting_capabilities": {
"available_reporting_frequencies": [
"daily"
],
"expected_delay_minutes": 1440,
"timezone": "UTC",
"supports_webhooks": false,
"available_metrics": [
"impressions",
"spend",
"reach",
"completed_views",
"completion_rate",
"viewability"
],
"date_range_support": "date_range",
"supports_geo_breakdown": {
"country": true,
"region": false
},
"supports_device_type_breakdown": true,
"supports_placement_breakdown": true,
"vendor_metrics": [
{
"vendor": {
"domain": "scope3.com"
},
"metric_id": "emissions_gco2pm"
}
]
},
"measurement_terms": {
"billing_measurement": {
"vendor": {
"domain": "coraai.org"
},
"max_variance_percent": 10,
"measurement_window": "standard"
},
"makegood_policy": {
"available_remedies": [
"additional_delivery",
"credit"
]
}
},
"targeting": {
"devices": [
"ctv"
],
"environments": [
"app"
],
"languages": [
"ko",
"en"
]
},
"channels": [
"ctv"
],
"format_options": [
{
"format_option_id": "fo-prod-arcastation-ssp-video-30s",
"display_name": "30 second hosted video",
"format_kind": "video_hosted",
"seller_preference": "preferred",
"params": {
"orientation": "horizontal",
"aspect_ratio": "16:9",
"min_width": 1280,
"min_height": 720,
"duration_ms_exact": 30000,
"video_codecs": [
"h264"
],
"audio_codecs": [
"aac"
],
"containers": [
"mp4"
],
"max_file_size_mb": 500,
"captions": "not_required",
"asset_source": "buyer_uploaded",
"buyer_asset_acceptance": "accepted"
}
}
],
"brief_relevance": "Matched against buyer brief: premium CTV inventory, US"
},
{
"product_id": "prod-kbs-fast",
"name": "KBS FAST Channel CTV",
"description": "Korean broadcast FAST supply for awareness campaigns targeting Korean-speaking audiences.",
"publisher": {
"name": "KBS",
"domain": "kbs.co.kr"
},
"domain": "kbs.co.kr",
"channel": "ctv",
"formats": [
"video"
],
"format_ids": [
{
"id": "video_16x9_30s",
"source": "iab",
"agent_url": "https://sales-agent.coraai.org/mcp/",
"duration_ms": 30000
},
{
"id": "ctv_video_15s",
"source": "coraai",
"agent_url": "https://sales-agent.coraai.org/mcp/",
"duration_ms": 15000
}
],
"delivery_type": "guaranteed",
"countries": [
"KR",
"US"
],
"inventory_ids": [
"inv-kbs-fast-ctv",
"kbs-fast"
],
"publisher_properties": [
{
"publisher_domain": "kbs.co.kr",
"selection_type": "by_id",
"property_ids": [
"kbs_fast"
]
}
],
"pricing_options": [
{
"pricing_option_id": "po-kbs-cpm-usd",
"pricing_model": "cpm",
"currency": "USD",
"fixed_price": 18,
"billing_event": "impression"
}
],
"pricing": [
{
"type": "cpm",
"currency": "USD",
"cpm": 18
}
],
"forecast": {
"points": [
{
"label": "30 day availability",
"metrics": {
"impressions": {
"mid": 4200000
},
"spend": {
"mid": 75600
}
}
}
],
"forecast_range_unit": "availability",
"method": "estimate",
"currency": "USD",
"measurement_source": "seller_ad_server",
"generated_at": "2026-06-24T00:00:00Z"
},
"delivery_forecast": {
"guaranteed_impressions": 4200000,
"measurement_source": "seller_ad_server",
"forecast_range_unit": "impressions",
"confidence": "medium"
},
"reporting_capabilities": {
"available_reporting_frequencies": [
"daily"
],
"expected_delay_minutes": 1440,
"timezone": "UTC",
"supports_webhooks": false,
"available_metrics": [
"impressions",
"spend",
"reach",
"completed_views",
"completion_rate",
"viewability"
],
"date_range_support": "date_range",
"supports_geo_breakdown": {
"country": true,
"region": false
},
"supports_device_type_breakdown": true,
"supports_placement_breakdown": true,
"vendor_metrics": [
{
"vendor": {
"domain": "scope3.com"
},
"metric_id": "emissions_gco2pm"
}
]
},
"measurement_terms": {
"billing_measurement": {
"vendor": {
"domain": "coraai.org"
},
"max_variance_percent": 10,
"measurement_window": "standard"
},
"makegood_policy": {
"available_remedies": [
"additional_delivery",
"credit"
]
}
},
"targeting": {
"devices": [
"ctv"
],
"environments": [
"app"
],
"languages": [
"ko"
]
},
"channels": [
"ctv"
],
"format_options": [
{
"format_option_id": "fo-prod-kbs-fast-video-30s",
"display_name": "30 second hosted video",
"format_kind": "video_hosted",
"seller_preference": "preferred",
"params": {
"orientation": "horizontal",
"aspect_ratio": "16:9",
"min_width": 1280,
"min_height": 720,
"duration_ms_exact": 30000,
"video_codecs": [
"h264"
],
"audio_codecs": [
"aac"
],
"containers": [
"mp4"
],
"max_file_size_mb": 500,
"captions": "not_required",
"asset_source": "buyer_uploaded",
"buyer_asset_acceptance": "accepted"
}
}
],
"brief_relevance": "Matched against buyer brief: premium CTV inventory, US"
}
],
"count": 2,
"total": 22,
"currency": "USD",
"cache_scope": "public",
"wholesale_feed_version": "coraai-products-2026-06-24",
"pricing_version": "coraai-usd-pricing-2026-06-24",
"pagination": {
"has_more": true
},
"property_list_applied": false,
"brief": "premium CTV inventory, US",
"filter_diagnostics": {
"total_candidates": 4,
"matched_candidates": 22,
"no_match_targeting": false,
"semantics": "approximate"
},
"adcp_version": "3.1",
"adcp_major_version": 3
} The protocol vocabulary, as observed
Not the spec's aspiration — the tool names actually exposed by the 7 open-discovery
agents, aggregated from the 2026-07-22 sweep and grouped by agent type. ×N marks a name seen
at N different agents: the ×2s are where the shared protocol surface is already forming —
get_products, create_media_buy, sync_creatives,
list_creative_formats on the transaction side, get_signals and
get_adcp_capabilities everywhere. Full context in the
AdCP guide.
adagents.json — who is allowed to sell
The registry answers "which agents exist." The AdCP spec's /.well-known/adagents.json
answers the other half: a domain declares which agents are authorized
to represent it — the agentic-era analogue of ads.txt, so a buying agent can verify the
counterparty before transacting. Not a mock: this is the manifest
served live
by this site's own agent domain (captured 2026-07-22):
{
"$schema": "https://adcontextprotocol.org/schemas/v3/adagents.json",
"contact": {
"name": "AdCP Signals Adaptor — Demo Provider (Evgeny)",
"email": "Evgeny@gmail.com",
"domain": "adcp.signal-stack.io",
"privacy_policy_url": "https://adcp.signal-stack.io/privacy"
},
"authorized_agents": [
{
"url": "https://adcp.signal-stack.io/mcp",
"authorized_for": "AdCP signals data provider for the Demo Provider catalog (audience + outcome signals across 14 verticals)",
"authorization_type": "signal_tags",
"signal_tags": [
"all"
]
}
],
"signal_tags": {
"all": {
"name": "All catalog signals",
"description": "Every signal in the Demo Provider catalog, spanning Demographic / Interest / Purchase intent / Geo / Composite category types across 14 verticals. Includes both deterministic (rule-based) and dynamic (proposal-derived) signals."
}
},
"last_updated": "2026-07-22T16:22:29.525Z"
} For a publisher declaring third-party sales agents, the spec's shape looks like this (illustrative, per the AdCP standards guide):
{
"publisher": "example-publisher.com",
"authorized_agents": [
{
"url": "https://sales-agent.example-ssp.com",
"role": "seller",
"properties": ["news", "sports"]
}
],
"signing_keys": [
{ "kid": "2026-key-1", "alg": "Ed25519" }
]
} Opens https://<domain>/.well-known/adagents.json in a new tab. A 404 is a finding too: the domain hasn't declared its authorized agents yet. The sibling manifest for brands — brand.json — is live on this site.
Spec & conformance state
supported_versions for yourself.
Count over time
- 2026-07-2221 agents
The series starts at first observation and appends on every change — a dated, append-only record of the ecosystem actually growing, kept honest the same way the Living Maps are.