From adcp-client
Use when building an AdCP signals agent — a marketplace data provider, identity provider, CDP, or any system that serves audience or contextual signals to buyers.
npx claudepluginhub adcontextprotocol/adcp-client --plugin adcp-clientThis skill uses the workspace's default tool permissions.
A signals agent serves audience and contextual targeting segments to buyer agents. The fastest path to a passing agent is to **fork the worked adapter** and replace its `// SWAP:` markers with calls to your backend.
Build an AdCP v6.0 (preview) signal-marketplace OR signal-owned decisioning platform — a data provider serving audience signals to buyers. Use ONLY when the user explicitly wants the v6.0 DecisioningPlatform shape; for v5.x handler-style signals agents, use `build-signals-agent` instead.
Authors .agent files for deterministic Agentforce agents using FSM flows, topic routing, slot filling, and CLI workflows like sf agent generate/validate/publish/activate.
Engineers production-ready ADK agents and multi-agent systems in Python/Java/Go with clean structure, tests, safe tools, and deployment automation.
Share bugs, ideas, or general feedback.
A signals agent serves audience and contextual targeting segments to buyer agents. The fastest path to a passing agent is to fork the worked adapter and replace its // SWAP: markers with calls to your backend.
| Specialism | Archetype | Fork this | Mock upstream | Storyboard |
|---|---|---|---|---|
signal-marketplace | Multi-provider data marketplace (Oracle Data Cloud, LiveRamp, third-party data) | hello_signals_adapter_marketplace.ts | npx adcp mock-server signal-marketplace | signal_marketplace |
signal-owned | First-party / single-provider data (CDP, identity provider, contextual) | Fork the marketplace adapter; see deletion list below | — | signal_owned |
Both specialisms share the same tool surface (get_signals, activate_signal, list_accounts); the difference is whether you serve segments from multiple data_provider_domain values or one. A signal-owned adapter is the marketplace adapter with the multi-provider directory simplified to a single seed.
signal-ownedForking the marketplace adapter for a signal-owned agent? Delete or replace these seams — leaning on stable symbol names rather than line numbers (the adapter evolves; greppable identifiers don't):
UpstreamCohort array seeded with multiple data_provider_domain / data_provider_id / data_provider_name triples) with your single-provider catalog. Every cohort gets the same data_provider_domain (your domain) and data_provider_name (your brand).getSignals that filter signals[] by (data_provider_domain, data_provider_id) pairs — single-provider adopters either return everything or filter on signal id alone.signal_type: 'owned' (not 'marketplace') in the toAdcpSignal projection. See SHAPE-GOTCHAS §7 for the marketplace/owned/custom decision table.signal_owned storyboard is simpler.Keep: the accounts / createTenantStore block (single-tenant adapters pass one tenant entry), agentRegistry, the signals SignalsPlatform block (getSignals, activateSignal, listAccounts), platform vs agent activation polling logic, forceDeploymentStatus for compliance-test determinism.
For exact response shapes, error codes, and optional fields, docs/llms.txt is the canonical reference. The fork target stays in sync with the spec because PR #1394's three-gate contract fails CI when it drifts.
get_signals, activate_signal, or the AdCP signals protocolNot this skill:
skills/build-seller-agent/audience-sync track in skills/build-seller-agent/Every signals agent hits the cross-cutting rules in ../cross-cutting.md. The high-traffic ones for signals (deep-linked to the rule):
idempotency_key on activate_signalserve({ authenticate }) baselinesignal_agent_segment_id lookups across tenantssignal_activation.${signal_agent_segment_id}.${platform} as the stable operation_idTwo signals-specific notes on top of those:
Platform activations (type: 'platform') take minutes-to-hours to propagate to the DSP. Return is_live: false with estimated_activation_duration_minutes on first call; the buyer polls activate_signal again until is_live: true. Commit activation_key up front so the buyer can trust it across the poll window. Agent activations (type: 'agent') are instant — return is_live: true immediately.
forceDeploymentStatus in your TestControllerStore flips pending deployments to live for deterministic compliance tests.
data_provider_domain must resolveBuyers fetch https://{domain}/adagents.json out-of-band to verify the provider. Use real domains even in demos, not example.com. For marketplace adopters, seed ≥2 different data_provider_domain values so the multi-provider nature is visible to the storyboard.
signal-marketplace — multi-provider directory (signals[].data_provider_domain varies), platform-activation polling pattern, marketplace governance sub-scenario in the storyboard exercises consent flows.
signal-owned — single data_provider_domain across all signals. value_type drives targeting semantics: binary (in/out), categorical (with allowed_values: [...]), numeric (with min, max, optional units). For the signal_type value (marketplace/owned/custom) decision, see SHAPE-GOTCHAS §7.
# Run the fork-matrix gate
npm run compliance:fork-matrix -- --test-name-pattern="hello-signals-adapter-marketplace"
# Or validate your forked agent directly against its storyboard
adcp storyboard run http://127.0.0.1:3001/mcp signal_marketplace \
--bearer "$ADCP_AUTH_TOKEN" --include-bundles --json
The fork-matrix gate is the three-gate contract from docs/guides/EXAMPLE-TEST-CONTRACT.md: tsc strict / storyboard zero-failures / upstream façade.
For deeper validation: docs/guides/VALIDATE-YOUR-AGENT.md.
docs/migration-6.6-to-6.7.mddocs/migration-4.x-to-5.x.md