@adcp/client 4.21.0 → 4.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +278 -0
- package/README.md +96 -61
- package/bin/adcp.js +342 -4
- package/dist/lib/agents/index.generated.d.ts +9 -1
- package/dist/lib/agents/index.generated.d.ts.map +1 -1
- package/dist/lib/agents/index.generated.js +12 -0
- package/dist/lib/agents/index.generated.js.map +1 -1
- package/dist/lib/core/AgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.d.ts +2 -1
- package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
- package/dist/lib/core/SingleAgentClient.js +10 -1
- package/dist/lib/core/SingleAgentClient.js.map +1 -1
- package/dist/lib/discovery/property-crawler.d.ts +4 -0
- package/dist/lib/discovery/property-crawler.d.ts.map +1 -1
- package/dist/lib/discovery/property-crawler.js +10 -2
- package/dist/lib/discovery/property-crawler.js.map +1 -1
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +6 -4
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/protocols/index.d.ts.map +1 -1
- package/dist/lib/protocols/index.js +8 -6
- package/dist/lib/protocols/index.js.map +1 -1
- package/dist/lib/protocols/mcp.d.ts.map +1 -1
- package/dist/lib/protocols/mcp.js +24 -11
- package/dist/lib/protocols/mcp.js.map +1 -1
- package/dist/lib/server/index.d.ts +2 -0
- package/dist/lib/server/index.d.ts.map +1 -1
- package/dist/lib/server/index.js +3 -1
- package/dist/lib/server/index.js.map +1 -1
- package/dist/lib/server/serve.d.ts +73 -0
- package/dist/lib/server/serve.d.ts.map +1 -0
- package/dist/lib/server/serve.js +94 -0
- package/dist/lib/server/serve.js.map +1 -0
- package/dist/lib/testing/client.d.ts.map +1 -1
- package/dist/lib/testing/client.js +1 -0
- package/dist/lib/testing/client.js.map +1 -1
- package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
- package/dist/lib/testing/compliance/comply.js +48 -63
- package/dist/lib/testing/compliance/comply.js.map +1 -1
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts +24 -0
- package/dist/lib/testing/compliance/storyboard-tracks.d.ts.map +1 -0
- package/dist/lib/testing/compliance/storyboard-tracks.js +157 -0
- package/dist/lib/testing/compliance/storyboard-tracks.js.map +1 -0
- package/dist/lib/testing/compliance/types.d.ts +1 -1
- package/dist/lib/testing/compliance/types.d.ts.map +1 -1
- package/dist/lib/testing/index.d.ts +1 -0
- package/dist/lib/testing/index.d.ts.map +1 -1
- package/dist/lib/testing/index.js +23 -1
- package/dist/lib/testing/index.js.map +1 -1
- package/dist/lib/testing/orchestrator.d.ts +8 -0
- package/dist/lib/testing/orchestrator.d.ts.map +1 -1
- package/dist/lib/testing/orchestrator.js +8 -0
- package/dist/lib/testing/orchestrator.js.map +1 -1
- package/dist/lib/testing/storyboard/context.d.ts +34 -0
- package/dist/lib/testing/storyboard/context.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/context.js +257 -0
- package/dist/lib/testing/storyboard/context.js.map +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +15 -0
- package/dist/lib/testing/storyboard/index.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/index.js +48 -0
- package/dist/lib/testing/storyboard/index.js.map +1 -0
- package/dist/lib/testing/storyboard/loader.d.ts +53 -0
- package/dist/lib/testing/storyboard/loader.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/loader.js +114 -0
- package/dist/lib/testing/storyboard/loader.js.map +1 -0
- package/dist/lib/testing/storyboard/path.d.ts +29 -0
- package/dist/lib/testing/storyboard/path.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/path.js +121 -0
- package/dist/lib/testing/storyboard/path.js.map +1 -0
- package/dist/lib/testing/storyboard/request-builder.d.ts +28 -0
- package/dist/lib/testing/storyboard/request-builder.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/request-builder.js +410 -0
- package/dist/lib/testing/storyboard/request-builder.js.map +1 -0
- package/dist/lib/testing/storyboard/runner.d.ts +24 -0
- package/dist/lib/testing/storyboard/runner.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/runner.js +280 -0
- package/dist/lib/testing/storyboard/runner.js.map +1 -0
- package/dist/lib/testing/storyboard/task-map.d.ts +21 -0
- package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/task-map.js +84 -0
- package/dist/lib/testing/storyboard/task-map.js.map +1 -0
- package/dist/lib/testing/storyboard/types.d.ts +156 -0
- package/dist/lib/testing/storyboard/types.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/types.js +10 -0
- package/dist/lib/testing/storyboard/types.js.map +1 -0
- package/dist/lib/testing/storyboard/validations.d.ts +17 -0
- package/dist/lib/testing/storyboard/validations.d.ts.map +1 -0
- package/dist/lib/testing/storyboard/validations.js +166 -0
- package/dist/lib/testing/storyboard/validations.js.map +1 -0
- package/dist/lib/testing/types.d.ts +2 -0
- package/dist/lib/testing/types.d.ts.map +1 -1
- package/dist/lib/types/core.generated.d.ts +2 -2
- package/dist/lib/types/core.generated.d.ts.map +1 -1
- package/dist/lib/types/core.generated.js +1 -1
- package/dist/lib/types/schemas.generated.d.ts +193 -34
- package/dist/lib/types/schemas.generated.d.ts.map +1 -1
- package/dist/lib/types/schemas.generated.js +87 -5
- package/dist/lib/types/schemas.generated.js.map +1 -1
- package/dist/lib/types/tools.generated.d.ts +280 -3
- package/dist/lib/types/tools.generated.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.d.ts.map +1 -1
- package/dist/lib/utils/response-schemas.js +34 -3
- package/dist/lib/utils/response-schemas.js.map +1 -1
- package/dist/lib/utils/validate-user-agent.d.ts +8 -0
- package/dist/lib/utils/validate-user-agent.d.ts.map +1 -0
- package/dist/lib/utils/validate-user-agent.js +15 -0
- package/dist/lib/utils/validate-user-agent.js.map +1 -0
- package/dist/lib/version.d.ts +6 -0
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +7 -1
- package/dist/lib/version.js.map +1 -1
- package/docs/README.md +42 -0
- package/docs/guides/BUILD-AN-AGENT.md +294 -0
- package/docs/llms.txt +634 -0
- package/examples/README.md +106 -0
- package/examples/adcp.config.json +30 -0
- package/examples/basic-a2a.ts +76 -0
- package/examples/basic-mcp.ts +50 -0
- package/examples/batch-preview-test.ts +266 -0
- package/examples/conversation-client.ts +291 -0
- package/examples/debug-preview-response.ts +73 -0
- package/examples/debug-preview-with-logging.ts +50 -0
- package/examples/easy-config-demo.ts +242 -0
- package/examples/env-config.ts +51 -0
- package/examples/error-compliant-server.ts +237 -0
- package/examples/generative-creative-demo.ts +205 -0
- package/examples/inspect-card-formats.ts +161 -0
- package/examples/logger-usage.ts +165 -0
- package/examples/oauth-cli-example.ts +154 -0
- package/examples/pr78-async-patterns-demo.ts +247 -0
- package/examples/signals-agent.ts +163 -0
- package/examples/simple-getting-started.ts +225 -0
- package/examples/simple-protocol-demo.ts +75 -0
- package/examples/test-helpers-demo.ts +239 -0
- package/examples/zod-validation-example.ts +126 -0
- package/package.json +12 -2
- package/skills/adcp/SKILL.md +13 -2
- package/storyboards/audience_sync.yaml +199 -0
- package/storyboards/behavioral_analysis.yaml +244 -0
- package/storyboards/brand_rights.yaml +131 -0
- package/storyboards/creative_ad_server.yaml +171 -0
- package/storyboards/creative_sales_agent.yaml +169 -0
- package/storyboards/creative_template.yaml +306 -0
- package/storyboards/deterministic_testing.yaml +925 -0
- package/storyboards/error_compliance.yaml +231 -0
- package/storyboards/governance_content_standards.yaml +213 -0
- package/storyboards/governance_property_lists.yaml +372 -0
- package/storyboards/media_buy_catalog_creative.yaml +457 -0
- package/storyboards/media_buy_governance_escalation.yaml +467 -0
- package/storyboards/media_buy_guaranteed_approval.yaml +396 -0
- package/storyboards/media_buy_non_guaranteed.yaml +288 -0
- package/storyboards/media_buy_proposal_mode.yaml +369 -0
- package/storyboards/media_buy_seller.yaml +560 -0
- package/storyboards/media_buy_state_machine.yaml +254 -0
- package/storyboards/schema.yaml +65 -0
- package/storyboards/schema_validation.yaml +166 -0
- package/storyboards/si_session.yaml +384 -0
- package/storyboards/signal_marketplace.yaml +283 -0
- package/storyboards/signal_owned.yaml +211 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
id: brand_rights
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Brand rights flow"
|
|
4
|
+
category: brand_rights
|
|
5
|
+
summary: "Agent that provides brand identity, queries rights, and supports rights acquisition."
|
|
6
|
+
track: core
|
|
7
|
+
required_tools:
|
|
8
|
+
- get_brand_identity
|
|
9
|
+
|
|
10
|
+
narrative: |
|
|
11
|
+
You run a brand rights platform — a system that manages brand identity information,
|
|
12
|
+
tracks rights associated with brands, and facilitates rights acquisition. A caller
|
|
13
|
+
connects to retrieve brand identity details, query existing rights, and initiate
|
|
14
|
+
new rights acquisitions.
|
|
15
|
+
|
|
16
|
+
The caller starts by fetching the brand identity for a given domain. Then they
|
|
17
|
+
query what rights are currently associated with that brand. Finally, they request
|
|
18
|
+
acquisition of additional rights, optionally in dry_run mode to preview without
|
|
19
|
+
committing.
|
|
20
|
+
|
|
21
|
+
This storyboard walks through the complete brand rights flow from discovery
|
|
22
|
+
through acquisition.
|
|
23
|
+
|
|
24
|
+
agent:
|
|
25
|
+
interaction_model: brand_rights
|
|
26
|
+
capabilities:
|
|
27
|
+
- brand_identity
|
|
28
|
+
- rights_management
|
|
29
|
+
examples:
|
|
30
|
+
- "Brand registry platforms"
|
|
31
|
+
- "Rights management systems"
|
|
32
|
+
- "Brand safety and compliance platforms"
|
|
33
|
+
|
|
34
|
+
caller:
|
|
35
|
+
role: buyer_agent
|
|
36
|
+
example: "Agency brand compliance tool"
|
|
37
|
+
|
|
38
|
+
prerequisites:
|
|
39
|
+
description: |
|
|
40
|
+
The caller needs a brand domain to query. The test uses example.com as a
|
|
41
|
+
default domain suitable for validating the brand rights protocol flow.
|
|
42
|
+
|
|
43
|
+
phases:
|
|
44
|
+
- id: brand_rights_flow
|
|
45
|
+
title: "Brand rights flow"
|
|
46
|
+
narrative: |
|
|
47
|
+
The caller retrieves brand identity, queries existing rights, and initiates
|
|
48
|
+
rights acquisition. Each step builds on the previous: the brand identity
|
|
49
|
+
confirms the brand exists, the rights query shows what is already held,
|
|
50
|
+
and the acquisition request adds new rights.
|
|
51
|
+
|
|
52
|
+
steps:
|
|
53
|
+
- id: get_brand_identity
|
|
54
|
+
title: "Retrieve brand identity"
|
|
55
|
+
narrative: |
|
|
56
|
+
The caller requests brand identity information for a specific domain.
|
|
57
|
+
The agent returns the brand name, domain, and any associated guidelines
|
|
58
|
+
or metadata. This confirms the brand is known to the platform.
|
|
59
|
+
task: get_brand_identity
|
|
60
|
+
stateful: false
|
|
61
|
+
expected: |
|
|
62
|
+
Return the brand identity:
|
|
63
|
+
- request_id: echoes the caller's request_id
|
|
64
|
+
- brand_name: human-readable brand name
|
|
65
|
+
- brand_domain: the queried domain
|
|
66
|
+
- guidelines: brand usage guidelines (optional)
|
|
67
|
+
|
|
68
|
+
sample_request:
|
|
69
|
+
type: "get_brand_identity_request"
|
|
70
|
+
request_id: "e2e-brand-id-001"
|
|
71
|
+
brand_domain: "example.com"
|
|
72
|
+
|
|
73
|
+
validations:
|
|
74
|
+
- check: field_present
|
|
75
|
+
path: "brand_name"
|
|
76
|
+
description: "Response includes the brand name"
|
|
77
|
+
- check: field_present
|
|
78
|
+
path: "brand_domain"
|
|
79
|
+
description: "Response includes the brand domain"
|
|
80
|
+
|
|
81
|
+
- id: get_rights
|
|
82
|
+
title: "Query current brand rights"
|
|
83
|
+
requires_tool: get_rights
|
|
84
|
+
narrative: |
|
|
85
|
+
The caller queries what rights are currently associated with the brand.
|
|
86
|
+
The agent returns a list of rights with their types, scopes, and
|
|
87
|
+
expiration dates.
|
|
88
|
+
task: get_rights
|
|
89
|
+
stateful: false
|
|
90
|
+
expected: |
|
|
91
|
+
Return the current rights:
|
|
92
|
+
- request_id: echoes the caller's request_id
|
|
93
|
+
- rights: array of right objects, each with type, scope, and optional expires_at
|
|
94
|
+
|
|
95
|
+
sample_request:
|
|
96
|
+
type: "get_rights_request"
|
|
97
|
+
request_id: "e2e-rights-001"
|
|
98
|
+
brand_domain: "example.com"
|
|
99
|
+
|
|
100
|
+
validations:
|
|
101
|
+
- check: field_present
|
|
102
|
+
path: "rights"
|
|
103
|
+
description: "Response includes a rights array"
|
|
104
|
+
|
|
105
|
+
- id: acquire_rights
|
|
106
|
+
title: "Acquire brand rights"
|
|
107
|
+
requires_tool: acquire_rights
|
|
108
|
+
narrative: |
|
|
109
|
+
The caller initiates acquisition of brand rights. The dry_run flag
|
|
110
|
+
allows previewing the acquisition without committing. The agent
|
|
111
|
+
returns the acquisition status and a rights_id for tracking.
|
|
112
|
+
task: acquire_rights
|
|
113
|
+
stateful: true
|
|
114
|
+
expected: |
|
|
115
|
+
Return the acquisition result:
|
|
116
|
+
- request_id: echoes the caller's request_id
|
|
117
|
+
- status: granted, pending, denied, or dry_run
|
|
118
|
+
- rights_id: identifier for the acquired or pending rights
|
|
119
|
+
- dry_run: true when the request was a preview
|
|
120
|
+
|
|
121
|
+
sample_request:
|
|
122
|
+
type: "acquire_rights_request"
|
|
123
|
+
request_id: "e2e-acquire-001"
|
|
124
|
+
brand_domain: "example.com"
|
|
125
|
+
rights_type: "usage"
|
|
126
|
+
dry_run: true
|
|
127
|
+
|
|
128
|
+
validations:
|
|
129
|
+
- check: field_present
|
|
130
|
+
path: "status"
|
|
131
|
+
description: "Response includes acquisition status"
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
id: creative_ad_server
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Creative ad server"
|
|
4
|
+
category: creative_ad_server
|
|
5
|
+
summary: "Stateful ad server with pre-loaded creatives. Generates serving tags per media buy."
|
|
6
|
+
platform_types:
|
|
7
|
+
- creative_ad_server
|
|
8
|
+
|
|
9
|
+
track: creative
|
|
10
|
+
required_tools:
|
|
11
|
+
- build_creative
|
|
12
|
+
- sync_creatives
|
|
13
|
+
narrative: |
|
|
14
|
+
You run a creative ad server — think Innovid, Flashtalking, or CM360. Your clients
|
|
15
|
+
have already uploaded their creatives through your UI. Buyers connect to browse your
|
|
16
|
+
creative library and request serving tags for their media buys.
|
|
17
|
+
|
|
18
|
+
Your agent is stateful: creatives already exist in your system. The buyer never pushes
|
|
19
|
+
assets to you. Instead, they browse your library, pick creatives, and ask you to generate
|
|
20
|
+
tags for specific placements. For a campaign with 25 media buys, you'll generate 25 tags.
|
|
21
|
+
|
|
22
|
+
This storyboard walks through that flow from the buyer's perspective.
|
|
23
|
+
|
|
24
|
+
agent:
|
|
25
|
+
interaction_model: stateful_preloaded
|
|
26
|
+
capabilities:
|
|
27
|
+
- has_creative_library
|
|
28
|
+
examples:
|
|
29
|
+
- "Innovid"
|
|
30
|
+
- "Flashtalking"
|
|
31
|
+
- "CM360"
|
|
32
|
+
|
|
33
|
+
caller:
|
|
34
|
+
role: buyer_agent
|
|
35
|
+
example: "Scope3 (DSP)"
|
|
36
|
+
|
|
37
|
+
prerequisites:
|
|
38
|
+
description: |
|
|
39
|
+
Creatives must already exist in the ad server's library, loaded through the
|
|
40
|
+
platform's own UI or API. The buyer does not push assets — they browse and
|
|
41
|
+
request tags for what's already there.
|
|
42
|
+
|
|
43
|
+
phases:
|
|
44
|
+
- id: browse_library
|
|
45
|
+
title: "Browse the creative library"
|
|
46
|
+
narrative: |
|
|
47
|
+
The buyer connects to your ad server and wants to see what creatives are
|
|
48
|
+
available for a campaign. They call list_creatives to browse concepts and
|
|
49
|
+
individual creatives in your library.
|
|
50
|
+
|
|
51
|
+
For an Innovid-like platform, this returns the advertiser's uploaded video
|
|
52
|
+
creatives, display ads, and any other assets managed in the platform.
|
|
53
|
+
|
|
54
|
+
steps:
|
|
55
|
+
- id: list_creatives
|
|
56
|
+
title: "Browse available creatives"
|
|
57
|
+
narrative: |
|
|
58
|
+
The buyer asks: "What creatives do you have for this advertiser?" This is
|
|
59
|
+
the primary entry point for ad server interactions — the buyer browses your
|
|
60
|
+
library to find creatives to use in their media buys.
|
|
61
|
+
task: list_creatives
|
|
62
|
+
schema_ref: "creative/list-creatives-request.json"
|
|
63
|
+
response_schema_ref: "creative/list-creatives-response.json"
|
|
64
|
+
doc_ref: "/creative/task-reference/list_creatives"
|
|
65
|
+
comply_scenario: creative_flow
|
|
66
|
+
stateful: true
|
|
67
|
+
expected: |
|
|
68
|
+
Return creatives from your library. Each creative should include:
|
|
69
|
+
- creative_id (your platform's identifier)
|
|
70
|
+
- format_id referencing the creative's format
|
|
71
|
+
- name and status (approved, pending_review, rejected)
|
|
72
|
+
- concept_id grouping related creatives across sizes
|
|
73
|
+
|
|
74
|
+
- id: list_output_formats
|
|
75
|
+
title: "Check available output formats"
|
|
76
|
+
narrative: |
|
|
77
|
+
The buyer checks what output formats your ad server supports. For an ad
|
|
78
|
+
server, this is typically the tag formats you can generate — HTML, JavaScript,
|
|
79
|
+
VAST, native. The input formats are less relevant because creatives are already
|
|
80
|
+
in your system.
|
|
81
|
+
task: list_creative_formats
|
|
82
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
83
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
84
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
85
|
+
comply_scenario: creative_sync
|
|
86
|
+
stateful: false
|
|
87
|
+
expected: |
|
|
88
|
+
Return the output formats you support. For an ad server, these are typically
|
|
89
|
+
tag formats (HTML, JavaScript, VAST) rather than visual ad formats.
|
|
90
|
+
|
|
91
|
+
- id: generate_tags
|
|
92
|
+
title: "Generate serving tags"
|
|
93
|
+
narrative: |
|
|
94
|
+
The buyer has selected creatives from your library and now needs serving tags
|
|
95
|
+
for their media buys. They call build_creative for each media buy/package
|
|
96
|
+
combination, passing the creative_id and the context needed to generate the
|
|
97
|
+
right tag.
|
|
98
|
+
|
|
99
|
+
This is the core of the ad server interaction: turning library creatives into
|
|
100
|
+
traffickable tags.
|
|
101
|
+
|
|
102
|
+
steps:
|
|
103
|
+
- id: build_tag
|
|
104
|
+
title: "Generate a tag for a media buy"
|
|
105
|
+
narrative: |
|
|
106
|
+
The buyer requests a serving tag for a specific creative, format, and media
|
|
107
|
+
buy. Your ad server generates a tag scoped to that placement.
|
|
108
|
+
|
|
109
|
+
For Innovid, this produces a VAST tag for a CTV placement. For Flashtalking,
|
|
110
|
+
this might produce an HTML tag for a display placement. The media_buy_id and
|
|
111
|
+
package_id provide the trafficking context.
|
|
112
|
+
task: build_creative
|
|
113
|
+
schema_ref: "media-buy/build-creative-request.json"
|
|
114
|
+
response_schema_ref: "media-buy/build-creative-response.json"
|
|
115
|
+
doc_ref: "/creative/task-reference/build_creative"
|
|
116
|
+
comply_scenario: creative_flow
|
|
117
|
+
stateful: true
|
|
118
|
+
expected: |
|
|
119
|
+
Return a creative manifest with the serving tag. The output should include:
|
|
120
|
+
- An HTML, JavaScript, or VAST asset containing the tag
|
|
121
|
+
- The format_id matching the target format
|
|
122
|
+
- Macro placeholders (CLICK_URL, CACHEBUSTER) if applicable
|
|
123
|
+
|
|
124
|
+
sample_request:
|
|
125
|
+
creative_id: "campaign_hero_video"
|
|
126
|
+
target_format_id:
|
|
127
|
+
agent_url: "https://your-ad-server.example.com"
|
|
128
|
+
id: "vast_30s"
|
|
129
|
+
media_buy_id: "mb_summer_campaign_001"
|
|
130
|
+
package_id: "pkg_ctv_premium"
|
|
131
|
+
|
|
132
|
+
validations:
|
|
133
|
+
- check: response_schema
|
|
134
|
+
description: "Response matches build-creative-response.json schema"
|
|
135
|
+
- check: field_present
|
|
136
|
+
path: "creative_manifest.assets"
|
|
137
|
+
description: "Output includes a serving tag asset"
|
|
138
|
+
|
|
139
|
+
- id: track_delivery
|
|
140
|
+
title: "Track creative delivery"
|
|
141
|
+
narrative: |
|
|
142
|
+
After the campaign runs, the buyer checks how each creative performed. They call
|
|
143
|
+
get_creative_delivery to get variant-level delivery data — impressions, spend, and
|
|
144
|
+
breakdowns by creative variant.
|
|
145
|
+
|
|
146
|
+
steps:
|
|
147
|
+
- id: get_delivery
|
|
148
|
+
title: "Get creative delivery metrics"
|
|
149
|
+
narrative: |
|
|
150
|
+
The buyer asks: "How did my creatives perform across the media buys?" Your ad
|
|
151
|
+
server returns delivery data per creative, including impressions, spend, and
|
|
152
|
+
variant-level breakdowns.
|
|
153
|
+
task: get_creative_delivery
|
|
154
|
+
schema_ref: "creative/get-creative-delivery-request.json"
|
|
155
|
+
response_schema_ref: "creative/get-creative-delivery-response.json"
|
|
156
|
+
doc_ref: "/creative/task-reference/get_creative_delivery"
|
|
157
|
+
comply_scenario: creative_flow
|
|
158
|
+
stateful: true
|
|
159
|
+
expected: |
|
|
160
|
+
Return per-creative delivery metrics including:
|
|
161
|
+
- Impressions and spend per creative
|
|
162
|
+
- Variant-level breakdowns (which version of each creative was served)
|
|
163
|
+
- Media buy context (which buys each creative was active on)
|
|
164
|
+
|
|
165
|
+
sample_request:
|
|
166
|
+
media_buy_ids:
|
|
167
|
+
- "mb_summer_campaign_001"
|
|
168
|
+
|
|
169
|
+
validations:
|
|
170
|
+
- check: response_schema
|
|
171
|
+
description: "Response matches get-creative-delivery-response.json schema"
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
id: creative_sales_agent
|
|
2
|
+
version: "1.0.0"
|
|
3
|
+
title: "Sales agent with creative capabilities"
|
|
4
|
+
category: creative_sales_agent
|
|
5
|
+
summary: "Stateful sales agent that accepts pushed creative assets and renders them in its environment."
|
|
6
|
+
platform_types:
|
|
7
|
+
- retail_media
|
|
8
|
+
- social_platform
|
|
9
|
+
|
|
10
|
+
track: creative
|
|
11
|
+
required_tools:
|
|
12
|
+
- sync_creatives
|
|
13
|
+
- list_creative_formats
|
|
14
|
+
narrative: |
|
|
15
|
+
You run a publisher platform, retail media network, or other sell-side system that
|
|
16
|
+
accepts creative assets from buyers. The buyer pushes assets or catalog items to your
|
|
17
|
+
platform, and you render them in your environment.
|
|
18
|
+
|
|
19
|
+
Your agent is stateful: buyers push creatives to you via sync_creatives, and you
|
|
20
|
+
persist them for rendering. This is where catalogs get interesting — the buyer might
|
|
21
|
+
push product feeds (flights, hotels, retail products) that your platform renders as
|
|
22
|
+
native ads.
|
|
23
|
+
|
|
24
|
+
This storyboard walks through the push-and-preview flow from the buyer's perspective.
|
|
25
|
+
|
|
26
|
+
agent:
|
|
27
|
+
interaction_model: stateful_push
|
|
28
|
+
capabilities:
|
|
29
|
+
- has_creative_library
|
|
30
|
+
examples:
|
|
31
|
+
- "Publisher platforms"
|
|
32
|
+
- "Retail media networks"
|
|
33
|
+
- "Native ad platforms"
|
|
34
|
+
|
|
35
|
+
caller:
|
|
36
|
+
role: buyer_agent
|
|
37
|
+
example: "Pinnacle Agency (buyer)"
|
|
38
|
+
|
|
39
|
+
prerequisites:
|
|
40
|
+
description: |
|
|
41
|
+
The buyer has creative assets (images, catalog feeds, or ad tags) ready to push.
|
|
42
|
+
The test kit provides sample assets compatible with common publisher formats.
|
|
43
|
+
test_kit: "test-kits/acme-outdoor.yaml"
|
|
44
|
+
|
|
45
|
+
phases:
|
|
46
|
+
- id: discover_accepted_formats
|
|
47
|
+
title: "Discover accepted formats"
|
|
48
|
+
narrative: |
|
|
49
|
+
The buyer first needs to know what creative formats your platform accepts.
|
|
50
|
+
For a publisher, this includes your native ad formats, display placements,
|
|
51
|
+
and any custom units. For retail media, this might include product listing
|
|
52
|
+
formats or sponsored product cards.
|
|
53
|
+
|
|
54
|
+
steps:
|
|
55
|
+
- id: list_formats
|
|
56
|
+
title: "Discover accepted creative formats"
|
|
57
|
+
narrative: |
|
|
58
|
+
The buyer asks: "What creative formats does your platform accept?" Your
|
|
59
|
+
platform returns the formats you support — native post formats, display
|
|
60
|
+
units, video slots, or product listing formats.
|
|
61
|
+
task: list_creative_formats
|
|
62
|
+
schema_ref: "creative/list-creative-formats-request.json"
|
|
63
|
+
response_schema_ref: "creative/list-creative-formats-response.json"
|
|
64
|
+
doc_ref: "/creative/task-reference/list_creative_formats"
|
|
65
|
+
comply_scenario: creative_sync
|
|
66
|
+
stateful: false
|
|
67
|
+
expected: |
|
|
68
|
+
Return the creative formats your platform accepts. Each format should define:
|
|
69
|
+
- Asset requirements (what the buyer needs to provide)
|
|
70
|
+
- Render dimensions
|
|
71
|
+
- Any catalog requirements (for product-feed formats)
|
|
72
|
+
|
|
73
|
+
- id: push_creatives
|
|
74
|
+
title: "Push creative assets"
|
|
75
|
+
narrative: |
|
|
76
|
+
The buyer pushes their creative assets to your platform. This could be:
|
|
77
|
+
- Standard display assets (images, HTML tags)
|
|
78
|
+
- Catalog items (product feeds, flight listings, hotel inventory)
|
|
79
|
+
- Native ad content (headlines, descriptions, images)
|
|
80
|
+
|
|
81
|
+
Your platform validates the assets against your format specs and stores them.
|
|
82
|
+
|
|
83
|
+
steps:
|
|
84
|
+
- id: sync_creatives
|
|
85
|
+
title: "Push creatives to the platform"
|
|
86
|
+
narrative: |
|
|
87
|
+
The buyer uploads creative assets to your platform. For standard ads, this
|
|
88
|
+
is images and copy. For catalog-driven formats, this is a product feed or
|
|
89
|
+
set of catalog items. Your platform validates each creative against the
|
|
90
|
+
format's asset requirements and returns a per-creative status.
|
|
91
|
+
task: sync_creatives
|
|
92
|
+
schema_ref: "creative/sync-creatives-request.json"
|
|
93
|
+
response_schema_ref: "creative/sync-creatives-response.json"
|
|
94
|
+
doc_ref: "/creative/task-reference/sync_creatives"
|
|
95
|
+
comply_scenario: creative_sync
|
|
96
|
+
stateful: true
|
|
97
|
+
expected: |
|
|
98
|
+
Accept the creatives, validate against format specifications, and return:
|
|
99
|
+
- Per-creative action (created or updated)
|
|
100
|
+
- Per-creative status (accepted, pending_review, rejected)
|
|
101
|
+
- Platform-assigned IDs if applicable
|
|
102
|
+
- Validation errors for rejected creatives
|
|
103
|
+
|
|
104
|
+
sample_request:
|
|
105
|
+
creatives:
|
|
106
|
+
- creative_id: "acme_summer_native_001"
|
|
107
|
+
format_id:
|
|
108
|
+
agent_url: "https://your-platform.example.com"
|
|
109
|
+
id: "native_post"
|
|
110
|
+
assets:
|
|
111
|
+
- asset_id: "headline"
|
|
112
|
+
asset_type: "text"
|
|
113
|
+
text: "Summer Sale — 40% Off All Gear"
|
|
114
|
+
- asset_id: "image"
|
|
115
|
+
asset_type: "image"
|
|
116
|
+
url: "https://test-assets.adcontextprotocol.org/acme-outdoor/hero-master.jpg"
|
|
117
|
+
- asset_id: "click_url"
|
|
118
|
+
asset_type: "url"
|
|
119
|
+
url: "https://acme-outdoor.example.com/summer-sale"
|
|
120
|
+
|
|
121
|
+
validations:
|
|
122
|
+
- check: response_schema
|
|
123
|
+
description: "Response matches sync-creatives-response.json schema"
|
|
124
|
+
- check: field_present
|
|
125
|
+
path: "creatives[0].action"
|
|
126
|
+
description: "Each creative has an action (created/updated)"
|
|
127
|
+
|
|
128
|
+
- id: preview
|
|
129
|
+
title: "Preview pushed creatives"
|
|
130
|
+
narrative: |
|
|
131
|
+
After pushing assets, the buyer wants to see how their creatives will render
|
|
132
|
+
in your platform's environment. For a publisher, this shows the ad in the
|
|
133
|
+
publication's native chrome — with engagement buttons, community badges, and
|
|
134
|
+
platform-specific styling that the buyer can't preview elsewhere.
|
|
135
|
+
|
|
136
|
+
steps:
|
|
137
|
+
- id: preview_synced
|
|
138
|
+
title: "Preview a pushed creative"
|
|
139
|
+
narrative: |
|
|
140
|
+
The buyer asks to see how a synced creative will look in your environment.
|
|
141
|
+
Your platform renders the creative with its native chrome — the surrounding
|
|
142
|
+
UI, engagement buttons, and platform-specific styling.
|
|
143
|
+
task: preview_creative
|
|
144
|
+
schema_ref: "creative/preview-creative-request.json"
|
|
145
|
+
response_schema_ref: "creative/preview-creative-response.json"
|
|
146
|
+
doc_ref: "/creative/task-reference/preview_creative"
|
|
147
|
+
comply_scenario: creative_flow
|
|
148
|
+
stateful: true
|
|
149
|
+
expected: |
|
|
150
|
+
Return a preview showing the creative in your platform's environment.
|
|
151
|
+
The preview should include your platform's native chrome — not just the
|
|
152
|
+
raw assets, but how they'll actually appear to users.
|
|
153
|
+
|
|
154
|
+
sample_request:
|
|
155
|
+
request_type: "single"
|
|
156
|
+
creative_manifest:
|
|
157
|
+
creative_id: "acme_summer_native_001"
|
|
158
|
+
format_id:
|
|
159
|
+
agent_url: "https://your-platform.example.com"
|
|
160
|
+
id: "native_post"
|
|
161
|
+
output_format: "url"
|
|
162
|
+
quality: "draft"
|
|
163
|
+
|
|
164
|
+
validations:
|
|
165
|
+
- check: response_schema
|
|
166
|
+
description: "Response matches preview-creative-response.json schema"
|
|
167
|
+
- check: field_present
|
|
168
|
+
path: "previews[0].renders[0].url"
|
|
169
|
+
description: "Preview includes a renderable URL"
|