@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.
Files changed (70) hide show
  1. package/dist/lib/adapters/version/index.d.mts +9 -0
  2. package/dist/lib/adapters/version/index.d.ts +9 -0
  3. package/dist/lib/adapters/version/index.js +20 -6
  4. package/dist/lib/adapters/version/index.mjs +15 -2
  5. package/dist/lib/identity-3.3/trust.js +9 -2
  6. package/dist/lib/identity-3.3/trust.mjs +9 -2
  7. package/dist/lib/server/a2a-adapter.js +2 -1
  8. package/dist/lib/server/a2a-adapter.mjs +2 -1
  9. package/dist/lib/server/account-response-identity.d.mts +4 -0
  10. package/dist/lib/server/account-response-identity.d.ts +4 -0
  11. package/dist/lib/server/account-response-identity.js +23 -0
  12. package/dist/lib/server/account-response-identity.mjs +22 -1
  13. package/dist/lib/server/auth-signature.d.mts +2 -2
  14. package/dist/lib/server/auth-signature.d.ts +2 -2
  15. package/dist/lib/server/auth-signature.js +3 -0
  16. package/dist/lib/server/auth-signature.mjs +3 -0
  17. package/dist/lib/server/create-adcp-server.d.mts +2 -2
  18. package/dist/lib/server/create-adcp-server.d.ts +2 -2
  19. package/dist/lib/server/create-adcp-server.js +25 -3
  20. package/dist/lib/server/create-adcp-server.mjs +25 -3
  21. package/dist/lib/server/decisioning/account.d.mts +2 -1
  22. package/dist/lib/server/decisioning/account.d.ts +2 -1
  23. package/dist/lib/server/decisioning/account.js +1 -0
  24. package/dist/lib/server/decisioning/account.mjs +5 -1
  25. package/dist/lib/server/responses.js +8 -4
  26. package/dist/lib/server/responses.mjs +13 -5
  27. package/dist/lib/server/serve.js +3 -1
  28. package/dist/lib/server/serve.mjs +3 -1
  29. package/dist/lib/server/signed-request-transport.d.mts +1 -0
  30. package/dist/lib/server/signed-request-transport.d.ts +1 -0
  31. package/dist/lib/server/signed-request-transport.js +46 -0
  32. package/dist/lib/server/signed-request-transport.mjs +20 -0
  33. package/dist/lib/server/test-controller.d.mts +1 -0
  34. package/dist/lib/server/test-controller.d.ts +1 -0
  35. package/dist/lib/server/test-controller.js +5 -1
  36. package/dist/lib/server/test-controller.mjs +5 -1
  37. package/dist/lib/testing/index.d.mts +1 -0
  38. package/dist/lib/testing/index.d.ts +1 -0
  39. package/dist/lib/testing/index.js +3 -0
  40. package/dist/lib/testing/index.mjs +2 -0
  41. package/dist/lib/testing/storyboard/canonical-format-satisfaction.js +1 -15
  42. package/dist/lib/testing/storyboard/canonical-format-satisfaction.mjs +1 -15
  43. package/dist/lib/testing/storyboard/index.d.mts +1 -0
  44. package/dist/lib/testing/storyboard/index.d.ts +1 -0
  45. package/dist/lib/testing/storyboard/index.js +3 -0
  46. package/dist/lib/testing/storyboard/index.mjs +2 -0
  47. package/dist/lib/testing/storyboard/loader.js +7 -0
  48. package/dist/lib/testing/storyboard/loader.mjs +7 -0
  49. package/dist/lib/testing/storyboard/request-builder.js +9 -6
  50. package/dist/lib/testing/storyboard/request-builder.mjs +9 -6
  51. package/dist/lib/testing/storyboard/runner.js +59 -6
  52. package/dist/lib/testing/storyboard/runner.mjs +59 -6
  53. package/dist/lib/testing/storyboard/types.d.mts +18 -0
  54. package/dist/lib/testing/storyboard/types.d.ts +18 -0
  55. package/dist/lib/testing/storyboard/validations.d.mts +1 -1
  56. package/dist/lib/testing/storyboard/validations.d.ts +1 -1
  57. package/dist/lib/testing/storyboard/web-bot-auth.d.mts +10 -0
  58. package/dist/lib/testing/storyboard/web-bot-auth.d.ts +10 -0
  59. package/dist/lib/testing/storyboard/web-bot-auth.js +80 -0
  60. package/dist/lib/testing/storyboard/web-bot-auth.mjs +56 -0
  61. package/dist/lib/version.d.mts +3 -3
  62. package/dist/lib/version.d.ts +3 -3
  63. package/dist/lib/version.js +3 -3
  64. package/dist/lib/version.mjs +3 -3
  65. package/docs/TYPE-SUMMARY.md +2 -2
  66. package/docs/llms.txt +2 -2
  67. package/docs/migration-14.x-rc-worksheet.md +4 -4
  68. package/docs/migration-16-to-17.md +27 -0
  69. package/docs/migration-agent-identity-3.3.md +106 -4
  70. 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-27
4
- > Library: @adcp/sdk v17.0.0-beta.2
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.2` |
20
- | npm integrity | registry-derived after publication; run `npm view @adcp/sdk@17.0.0-beta.2 dist.integrity` |
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.2'
30
- npm view '@adcp/sdk@17.0.0-beta.2' dist.integrity
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
- The SDK's default `ADCP_VERSION` remains **3.2.5**. Experimental client/server
7
- instances select the 3.3 carrier and apply the pinned draft overlays to the
8
- released bundle; they do not regenerate or replace the public 3.2 types.
9
- Upstream PRs remain open, so the experiment can change before graduation.
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.2",
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.0.0",
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",