AdCP · Ecosystem Tracker

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.

21 registered agents
  • 16 sales
  • 3 signals
  • 1 creative
  • 1 buying

Only 7 of 21 answer tools/list publicly →

The registry, agent by agent

21 of 21
AgentTypeDiscoveryEndpoint
AdCP Test Agent Sales Key-gated test-agent.adcontextprotocol.org
Advertible Inc. Sales Open · 2 adcp.4dvertible.com
Adzymic (Mediacorp) Sales Error mediacorp.sales-agent.adzymic.ai
Adzymic (SPH) Sales Error sph.sales-agent.adzymic.ai
Affinity Answers MCP Agent Signals Open · 2 mcp.affinityanswers.com
BidMachine Seller Agent Sales Key-gated adcp.bidmachine.io
Celtra Creative Error adcp-mcp.celtra.com
Content Ignite Sales Error sales-agent.contentignite.com
Cora AI Sales Agent Sales Open · 24 sales-agent.coraai.org
Dstillery Sales Error adcp-signals-agent.dstillery.com
Equativ Sales Open · 1 adcp.equativ.com
InMobi Exchange ADCP NonProd Sales Key-gated adcp-nonprod.exchange.inmobi.com
InMobi Sales Agent Sales Key-gated adcp-prod.exchange.inmobi.com
LoopMe Sales Agent Sales Key-gated platform.loopme.ai
No Fluff Advisory — Evgeny (Ev) Popovthis site Signals Open · 8 adcp.signal-stack.io
Pubx Sales Agent Sales Error selleragent.pubx.ai
Purrsonality Seller Sales Key-gated seller.purrsonality.rocketscience.pl
Purrsonality Signals Signals Key-gated signals.purrsonality.rocketscience.pl
Rediads Private Limited Sales Down adcp.rediads.com
Swivel Buying Open · 11 adcp.swivel.ai
vastlint Sales Open · 14 vastlint.org

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.

Sales 4 open agents · 37 distinct tools
get_adcp_capabilities ×2get_products ×2list_creative_formats ×2list_creatives ×2activate_signalcalibrate_contentcomply_test_controllercreate_collection_listcreate_content_standardscreate_media_buycreate_property_listdelete_content_standardsdelete_property_listexplain_rulefix_vastget_content_standardsget_media_buy_deliveryget_media_buysget_property_listget_signalslist_accountslist_collection_listslist_content_standardslist_property_listslist_rulespreview_creativesync_accountssync_creativessync_governanceupdate_content_standardsupdate_media_buyupdate_property_listvalidate_content_deliveryvalidate_inputvalidate_property_deliveryvalidate_vastvalidate_vast_url
Signals 2 open agents · 8 distinct tools
get_adcp_capabilities ×2get_signals ×2activate_signalget_conceptget_operation_statusget_similar_signalsquery_signals_nlsearch_concepts
Buying 1 open agent · 11 distinct tools
create_media_buyget_media_buy_deliveryget_media_buysget_productslist_authorized_propertieslist_creative_formatslist_creativessync_creativestasks_gettasks_listupdate_media_buy

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" }
  ]
}
Check any publisher domain

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

Latest spec releasev3.1.8published 2026-07-28
Latest prereleasev3.1.0-rc.15release-candidate line
Conformance SDK · 3.07.11.7stable line
Conformance SDK · 3.112.1.1current line
7/7 compliance scenarios passing This site's own registered signals agent, run against the conformance suite on every watcher cycle: capability_discovery · discovery · error_handling · health_check · schema_compliance · signals_flow · validation. Per-agent conformance isn't published by the registry — the honest way to check any agent is exchange 2 above: call its capabilities and read 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.