@adcp/sdk 17.0.0-beta.2 → 17.0.0-beta.4
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/dist/lib/adapters/version/index.d.mts +9 -0
- package/dist/lib/adapters/version/index.d.ts +9 -0
- package/dist/lib/adapters/version/index.js +20 -6
- package/dist/lib/adapters/version/index.mjs +15 -2
- package/dist/lib/identity-3.3/trust.js +9 -2
- package/dist/lib/identity-3.3/trust.mjs +9 -2
- package/dist/lib/server/a2a-adapter.js +2 -1
- package/dist/lib/server/a2a-adapter.mjs +2 -1
- package/dist/lib/server/account-response-identity.d.mts +4 -0
- package/dist/lib/server/account-response-identity.d.ts +4 -0
- package/dist/lib/server/account-response-identity.js +23 -0
- package/dist/lib/server/account-response-identity.mjs +22 -1
- package/dist/lib/server/auth-signature.d.mts +2 -2
- package/dist/lib/server/auth-signature.d.ts +2 -2
- package/dist/lib/server/auth-signature.js +3 -0
- package/dist/lib/server/auth-signature.mjs +3 -0
- package/dist/lib/server/create-adcp-server.d.mts +2 -2
- package/dist/lib/server/create-adcp-server.d.ts +2 -2
- package/dist/lib/server/create-adcp-server.js +25 -3
- package/dist/lib/server/create-adcp-server.mjs +25 -3
- package/dist/lib/server/decisioning/account.d.mts +2 -1
- package/dist/lib/server/decisioning/account.d.ts +2 -1
- package/dist/lib/server/decisioning/account.js +1 -0
- package/dist/lib/server/decisioning/account.mjs +5 -1
- package/dist/lib/server/responses.js +8 -4
- package/dist/lib/server/responses.mjs +13 -5
- package/dist/lib/server/serve.js +3 -1
- package/dist/lib/server/serve.mjs +3 -1
- package/dist/lib/server/signed-request-transport.d.mts +1 -0
- package/dist/lib/server/signed-request-transport.d.ts +1 -0
- package/dist/lib/server/signed-request-transport.js +46 -0
- package/dist/lib/server/signed-request-transport.mjs +20 -0
- package/dist/lib/server/test-controller.d.mts +1 -0
- package/dist/lib/server/test-controller.d.ts +1 -0
- package/dist/lib/server/test-controller.js +5 -1
- package/dist/lib/server/test-controller.mjs +5 -1
- package/dist/lib/testing/index.d.mts +1 -0
- package/dist/lib/testing/index.d.ts +1 -0
- package/dist/lib/testing/index.js +3 -0
- package/dist/lib/testing/index.mjs +2 -0
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +1 -15
- package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +1 -15
- package/dist/lib/testing/storyboard/index.d.mts +1 -0
- package/dist/lib/testing/storyboard/index.d.ts +1 -0
- package/dist/lib/testing/storyboard/index.js +3 -0
- package/dist/lib/testing/storyboard/index.mjs +2 -0
- package/dist/lib/testing/storyboard/loader.js +7 -0
- package/dist/lib/testing/storyboard/loader.mjs +7 -0
- package/dist/lib/testing/storyboard/request-builder.js +9 -6
- package/dist/lib/testing/storyboard/request-builder.mjs +9 -6
- package/dist/lib/testing/storyboard/runner.js +59 -6
- package/dist/lib/testing/storyboard/runner.mjs +59 -6
- package/dist/lib/testing/storyboard/types.d.mts +18 -0
- package/dist/lib/testing/storyboard/types.d.ts +18 -0
- package/dist/lib/testing/storyboard/validations.d.mts +1 -1
- package/dist/lib/testing/storyboard/validations.d.ts +1 -1
- package/dist/lib/testing/storyboard/web-bot-auth.d.mts +10 -0
- package/dist/lib/testing/storyboard/web-bot-auth.d.ts +10 -0
- package/dist/lib/testing/storyboard/web-bot-auth.js +80 -0
- package/dist/lib/testing/storyboard/web-bot-auth.mjs +56 -0
- package/dist/lib/version.d.mts +3 -3
- package/dist/lib/version.d.ts +3 -3
- package/dist/lib/version.js +3 -3
- package/dist/lib/version.mjs +3 -3
- package/docs/TYPE-SUMMARY.md +2 -2
- package/docs/llms.txt +2 -2
- package/docs/migration-14.x-rc-worksheet.md +4 -4
- package/docs/migration-16-to-17.md +27 -0
- package/docs/migration-agent-identity-3.3.md +106 -4
- package/package.json +15 -2
package/docs/llms.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Ad Context Protocol (AdCP)
|
|
2
2
|
|
|
3
|
-
> Generated at: 2026-10-
|
|
4
|
-
> Library: @adcp/sdk v17.0.0-beta.
|
|
3
|
+
> Generated at: 2026-10-28
|
|
4
|
+
> Library: @adcp/sdk v17.0.0-beta.4
|
|
5
5
|
> AdCP major version: 3
|
|
6
6
|
> Canonical URL: https://adcontextprotocol.github.io/adcp-client/llms.txt
|
|
7
7
|
> Note: the `Library` stamp reflects the package.json version at doc-generation time. The narrative below describes the surface that lands on the next-published minor — including any 6.7 helpers documented here ahead of the release tag.
|
|
@@ -16,8 +16,8 @@ pin using `ADCP_VERSION` inside that tarball.
|
|
|
16
16
|
|
|
17
17
|
| Fact | Value |
|
|
18
18
|
| --- | --- |
|
|
19
|
-
| Checkout `package.json` version | `@adcp/sdk@17.0.0-beta.
|
|
20
|
-
| npm integrity | registry-derived after publication; run `npm view @adcp/sdk@17.0.0-beta.
|
|
19
|
+
| Checkout `package.json` version | `@adcp/sdk@17.0.0-beta.4` |
|
|
20
|
+
| npm integrity | registry-derived after publication; run `npm view @adcp/sdk@17.0.0-beta.4 dist.integrity` |
|
|
21
21
|
| Node.js runtime | `^20.19.0 || >=22.12.0` |
|
|
22
22
|
| Default AdCP wire release | `3.3.0-beta.0` |
|
|
23
23
|
| Maintained wire releases | `v3`, `3.0.0`, `3.0`, `3.0.1`, `3.0.2`, `3.0.3`, `3.0.4`, `3.0.5`, `3.0.6`, `3.0.7`, `3.0.8`, `3.0.9`, `3.0.10`, `3.0.11`, `3.0.12`, `3.0.13`, `3.0.14`, `3.0.15`, `3.0.16`, `3.0.17`, `3.0.18`, `3.0.19`, `3.0.20`, `3.0.21`, `3.0.22`, `3.0.23`, `3.0.24`, `3.0.25`, `3.1.0`, `3.1`, `3.1.1`, `3.1.2`, `3.1.3`, `3.1.4`, `3.1.5`, `3.1.6`, `3.1.7`, `3.1.8`, `3.1.9`, `3.1.10`, `3.1.11`, `3.1.12`, `3.1.13`, `3.1.14`, `3.1.15`, `3.1.16`, `3.1.17`, `3.1.18`, `3.1.19`, `3.1.20`, `3.1.21`, `3.1.22`, `3.1.23`, `3.1.24`, `3.1.25`, `3.1.26`, `3.1.27`, `3.1.28`, `3.1.29`, `3.2.1`, `3.2`, `3.2.2`, `3.2.3`, `3.2.4`, `3.2.5`, `3.2.6`, `3.2.7`, `3.3.0-beta.0`, `3.3-beta.0` |
|
|
@@ -26,8 +26,8 @@ pin using `ADCP_VERSION` inside that tarball.
|
|
|
26
26
|
For a checkout at the published release commit, install the exact package version:
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
npm install --save-exact '@adcp/sdk@17.0.0-beta.
|
|
30
|
-
npm view '@adcp/sdk@17.0.0-beta.
|
|
29
|
+
npm install --save-exact '@adcp/sdk@17.0.0-beta.4'
|
|
30
|
+
npm view '@adcp/sdk@17.0.0-beta.4' dist.integrity
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
### Required and optional peers
|
|
@@ -151,6 +151,25 @@ server handlers are `mediaBuy.listCollections` and `mediaBuy.listProposals`,
|
|
|
151
151
|
or optional methods on `MediaBuyLifecyclePlatform`. Their synchronous results
|
|
152
152
|
use `outcome` and do not acquire a synthetic task `status` field.
|
|
153
153
|
|
|
154
|
+
## Postgres replay store
|
|
155
|
+
|
|
156
|
+
`PostgresReplayStore` inserts through a table-specific guarded function
|
|
157
|
+
(`<table>_insert_guarded`) that keeps the replay check, the per-key cap and the
|
|
158
|
+
insert on one backend. A database created by an earlier SDK has the table but
|
|
159
|
+
not the function. Every insert then fails with "PostgresReplayStore database
|
|
160
|
+
migration is outdated", and signed requests answer 503 (Web Bot Auth) or are
|
|
161
|
+
refused. Rerun the migration for each replay table before deploying SDK 17:
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
import { getReplayStoreMigration } from '@adcp/sdk/signing/server';
|
|
165
|
+
|
|
166
|
+
await pool.query(getReplayStoreMigration('adcp_replay_cache')); // your table name
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
The migration is idempotent. If you manage schema with numbered migration
|
|
170
|
+
files, add a new file with the current `getReplayStoreMigration()` output; a
|
|
171
|
+
file copied from an older SDK does not create the function.
|
|
172
|
+
|
|
154
173
|
## Account resolution and optional declarations
|
|
155
174
|
|
|
156
175
|
On a served AdCP 3.3 route, buyer-supplied account references require a
|
|
@@ -255,6 +274,14 @@ For AdCP 3.0 buyers, `create_media_buy` and `update_media_buy` responses move
|
|
|
255
274
|
waiting on creatives therefore returns `status: 'pending_creatives'`; 3.1+
|
|
256
275
|
responses keep task `status` separate from `media_buy_status`.
|
|
257
276
|
|
|
277
|
+
This projection applies to responses the framework emits. A webhook your
|
|
278
|
+
platform builds itself from a copy of the response, such as an inline completion
|
|
279
|
+
callback to a 3.0 buyer, does not pass through it. Apply the same mapping so the
|
|
280
|
+
webhook `result` matches the buyer-visible response: for a 3.0 buyer, carry the
|
|
281
|
+
media buy status as `status` and omit `media_buy_status`. A test comparing the
|
|
282
|
+
webhook `result` with the synchronous response catches drift. Exporting the
|
|
283
|
+
projection for seller-emitted webhooks is tracked in #3475.
|
|
284
|
+
|
|
258
285
|
## Receivers with their own delivery webhook verification
|
|
259
286
|
|
|
260
287
|
`parseMediaBuyDeliveryWebhook` from `@adcp/sdk/webhooks` validates an already
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
The experimental identity rollout is tracked in
|
|
4
4
|
[adcp-client#3233](https://github.com/adcontextprotocol/adcp-client/issues/3233).
|
|
5
5
|
This release implements the rollout behind explicit experimental configuration.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
SDK 17 beta pins `ADCP_VERSION` to **3.3.0-beta.0**; SDK 16 remains on 3.2.
|
|
7
|
+
The identity experiment can change before graduation. Setting `identity33`
|
|
8
|
+
selects the 3.3 schema scope for the entire server instance, including its
|
|
9
|
+
non-identity tools. To keep an existing 3.2 endpoint while evaluating identity,
|
|
10
|
+
create a separate server instance and mount it on another route.
|
|
10
11
|
|
|
11
12
|
The dedicated API is `@adcp/sdk/identity-3.3`. Existing RFC configuration remains
|
|
12
13
|
supported through 3.x and emits a one-time deprecation warning when used.
|
|
@@ -287,6 +288,99 @@ reassignment. Authorization runs before idempotency lookup and handler effects.
|
|
|
287
288
|
Keep the normal buyer registry's suspension, blocking, sandbox and billing
|
|
288
289
|
gates enabled; grants do not replace them.
|
|
289
290
|
|
|
291
|
+
### Custom MCP hosts
|
|
292
|
+
|
|
293
|
+
`signedRequests` installs HTTP middleware through `ADCP_PRE_TRANSPORT`. `serve()`
|
|
294
|
+
and `createA2AAdapter()` consume it automatically. A host that calls
|
|
295
|
+
`server.connect(transport)` directly must mount that middleware before handing
|
|
296
|
+
requests to the MCP transport; the server refuses the connection when the hook has not been
|
|
297
|
+
consumed. Connecting the transport alone cannot verify HTTP signatures.
|
|
298
|
+
Reading the symbol acknowledges that the custom host mounts the middleware;
|
|
299
|
+
the framework cannot verify external middleware installation. Socket Mode and
|
|
300
|
+
in-memory transports cannot run this HTTP verifier; use a separate server
|
|
301
|
+
instance without `signedRequests` for those transports.
|
|
302
|
+
Framework-managed MCP connections are permitted per transport after middleware
|
|
303
|
+
accepts the request. Creating an A2A adapter does not acknowledge MCP middleware.
|
|
304
|
+
|
|
305
|
+
For a host with its own authentication layer, compose
|
|
306
|
+
`verifySignatureAsAuthenticator({ webBotAuth, ... })` instead. A Web Bot Auth-only
|
|
307
|
+
authenticator can omit `jwks`; legacy signatures are then refused. For example:
|
|
308
|
+
|
|
309
|
+
```ts
|
|
310
|
+
import { createIdentity33PrincipalResolver } from '@adcp/sdk/identity-3.3';
|
|
311
|
+
import {
|
|
312
|
+
adcpOperationResolver,
|
|
313
|
+
requireSignatureWhenPresent,
|
|
314
|
+
verifySignatureAsAuthenticator,
|
|
315
|
+
} from '@adcp/sdk/server';
|
|
316
|
+
|
|
317
|
+
const signature = verifySignatureAsAuthenticator({
|
|
318
|
+
capability: {
|
|
319
|
+
supported: true,
|
|
320
|
+
profiles: ['web-bot-auth'],
|
|
321
|
+
covers_content_digest: 'required',
|
|
322
|
+
required_for: [],
|
|
323
|
+
},
|
|
324
|
+
replayStore, // Shared across requests and replicas.
|
|
325
|
+
resolveOperation: adcpOperationResolver,
|
|
326
|
+
// Trusted deployment config; never use caller-supplied forwarding headers.
|
|
327
|
+
getUrl: () => 'https://seller.example.com/mcp',
|
|
328
|
+
webBotAuth: {
|
|
329
|
+
directory,
|
|
330
|
+
resolvePrincipal: createIdentity33PrincipalResolver({ lifecycle, revocation: revocations }),
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
const authenticate = requireSignatureWhenPresent(signature, existingAuthenticator);
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Bind this authenticator to the configured `/mcp` route. The host must capture
|
|
337
|
+
the exact UTF-8 body in `req.rawBody` before JSON parsing,
|
|
338
|
+
run `authenticate` before `transport.handleRequest`, and propagate the returned
|
|
339
|
+
principal and authentication failures through its existing auth integration.
|
|
340
|
+
Hoist the authenticator and replay store outside request factories. If using
|
|
341
|
+
`serve()` with this authenticator, it captures the body automatically.
|
|
342
|
+
|
|
343
|
+
### Signed storyboard steps against a local agent
|
|
344
|
+
|
|
345
|
+
Storyboard steps can select a named runtime identity:
|
|
346
|
+
|
|
347
|
+
```yaml
|
|
348
|
+
auth: { type: web_bot_auth, identity: authorized_buyer }
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
Pass keys separately from the YAML:
|
|
352
|
+
|
|
353
|
+
```ts
|
|
354
|
+
import { runStoryboard } from '@adcp/sdk/testing';
|
|
355
|
+
|
|
356
|
+
await runStoryboard('http://127.0.0.1:3001/mcp', storyboard, {
|
|
357
|
+
protocol: 'mcp',
|
|
358
|
+
allow_http: true,
|
|
359
|
+
web_bot_auth: {
|
|
360
|
+
publicUrl: 'https://seller.example.com/mcp',
|
|
361
|
+
identities: {
|
|
362
|
+
authorized_buyer: { origin: 'https://buyer.agency.com', key: { privateKey: buyerJwk } },
|
|
363
|
+
impersonator: { origin: 'https://other.agency.com', key: { privateKey: otherJwk } },
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
Loopback delivery supports MCP; A2A steps can sign directly to HTTPS. The
|
|
370
|
+
official MCP client signs the public HTTPS target and delivers to the exact
|
|
371
|
+
loopback endpoint. Configure the local verifier's trusted public URL to match,
|
|
372
|
+
and publish or inject the identities' directory, revocation and trust records.
|
|
373
|
+
Each overridden step uses a separate client and strips ambient bearer/API-key
|
|
374
|
+
credentials. An unknown identity fails the step before dispatch. These steps
|
|
375
|
+
support tool-response validations; HTTP probe assertions and session probes
|
|
376
|
+
require their existing authentication directives. The URL override accepts only
|
|
377
|
+
loopback delivery, keeps redirects disabled, and does not relax the production
|
|
378
|
+
signer's HTTPS requirement. Omit `publicUrl` for signing directly to HTTPS.
|
|
379
|
+
For custom official transport wiring, `createStoryboardWebBotAuthFetch` from
|
|
380
|
+
`@adcp/sdk/testing` exposes the same delivery helper.
|
|
381
|
+
For direct HTTPS use of the helper, pass `agentUrl` to pin the destination
|
|
382
|
+
origin. Redirects are refused before the transport can follow them.
|
|
383
|
+
|
|
290
384
|
`bindPrincipal` requires seller audit evidence. Existing RFC mappings require
|
|
291
385
|
explicit migration approval and an unambiguous origin. `sync_principal` may
|
|
292
386
|
create only a new principal under declared open tiers; legacy-ledger lookup is
|
|
@@ -310,6 +404,14 @@ provided notification ID as the emitter's delivery ID. Call
|
|
|
310
404
|
|
|
311
405
|
## Trust, grants, and revocation
|
|
312
406
|
|
|
407
|
+
Identity authorization requires registrable domains from the pinned PSL.
|
|
408
|
+
Special-use names such as `brand.example`, `localhost`, and IP addresses cannot
|
|
409
|
+
establish trust or grants; invalid brand, account-operator, and resolved-house
|
|
410
|
+
domains receive coded `PERMISSION_DENIED` refusals. For tests, use registrable
|
|
411
|
+
fixture domains and inject `TrustEvaluator({ fetchOptions: { trustedFetchFn } })`
|
|
412
|
+
to serve their test trust records without relying on live DNS. This hook changes
|
|
413
|
+
record delivery, not domain validation or grant authorization.
|
|
414
|
+
|
|
313
415
|
The operator is derived using the pinned ICANN+PRIVATE PSL, never a document
|
|
314
416
|
field or authoritative hop host. Trust reads allow one document hop, zero HTTP
|
|
315
417
|
redirects, 2 MiB, depth 32, and no duplicate JSON keys. Exactly one canonical
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adcp/sdk",
|
|
3
|
-
"version": "17.0.0-beta.
|
|
3
|
+
"version": "17.0.0-beta.4",
|
|
4
4
|
"description": "AdCP SDK — client, server, and compliance harnesses for the AdContext Protocol (MCP + A2A)",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
".",
|
|
@@ -51,6 +51,16 @@
|
|
|
51
51
|
"default": "./dist/lib/compliance/index.js"
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
|
+
"./adapters/version": {
|
|
55
|
+
"import": {
|
|
56
|
+
"types": "./dist/lib/adapters/version/index.d.mts",
|
|
57
|
+
"default": "./dist/lib/adapters/version/index.mjs"
|
|
58
|
+
},
|
|
59
|
+
"require": {
|
|
60
|
+
"types": "./dist/lib/adapters/version/index.d.ts",
|
|
61
|
+
"default": "./dist/lib/adapters/version/index.js"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
54
64
|
"./advanced": {
|
|
55
65
|
"import": {
|
|
56
66
|
"types": "./dist/lib/advanced.d.mts",
|
|
@@ -432,6 +442,9 @@
|
|
|
432
442
|
"compliance": [
|
|
433
443
|
"dist/lib/compliance/index.d.ts"
|
|
434
444
|
],
|
|
445
|
+
"adapters/version": [
|
|
446
|
+
"dist/lib/adapters/version/index.d.ts"
|
|
447
|
+
],
|
|
435
448
|
"advanced": [
|
|
436
449
|
"dist/lib/advanced.d.ts"
|
|
437
450
|
],
|
|
@@ -732,7 +745,7 @@
|
|
|
732
745
|
"dependencies": {
|
|
733
746
|
"@modelcontextprotocol/client": "2.3.1",
|
|
734
747
|
"@modelcontextprotocol/ext-apps": "2.0.0",
|
|
735
|
-
"@modelcontextprotocol/node": "2.
|
|
748
|
+
"@modelcontextprotocol/node": "2.1.1",
|
|
736
749
|
"@modelcontextprotocol/server": "2.3.1",
|
|
737
750
|
"@types/ws": "^8.18.1",
|
|
738
751
|
"ajv": "^8.20.0",
|