@reclaimprotocol/agent 0.1.27 → 0.1.28

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 (92) hide show
  1. package/README.md +5 -5
  2. package/lib/authoring/tools.js +2 -1
  3. package/lib/consts.d.ts +1 -1
  4. package/lib/consts.js +1 -1
  5. package/lib/live/tunnel.d.ts +4 -0
  6. package/lib/live/tunnel.js +21 -12
  7. package/lib/mcp/api/operations.gen.d.ts +8 -8
  8. package/lib/mcp/api/operations.gen.js +339 -581
  9. package/lib/mcp/api/tools.d.ts +1 -1
  10. package/lib/mcp/instructions.js +5 -3
  11. package/lib/mcp/remap_errors.js +9 -5
  12. package/lib/mcp/start.js +1 -1
  13. package/lib/mcp/tools/agent/attach.d.ts +2 -2
  14. package/lib/mcp/tools/agent/attach.js +4 -0
  15. package/lib/mcp/tools/agent/build.d.ts +1 -1
  16. package/lib/mcp/tools/agent/live-view-url.d.ts +2 -0
  17. package/lib/mcp/tools/agent/live-view-url.js +11 -0
  18. package/lib/mcp/tools/agent/live-view.d.ts +4 -2
  19. package/lib/mcp/tools/agent/live-view.js +42 -39
  20. package/lib/mcp/tools/agent/propose.js +10 -4
  21. package/lib/mcp/tools/agent/publish.d.ts +1 -1
  22. package/lib/mcp/tools/agent/publish.js +49 -26
  23. package/lib/mcp/tools/agent/shared.js +0 -9
  24. package/lib/mcp/tools/authenticate/authenticate.d.ts +1 -1
  25. package/lib/mcp/tools/authenticate/build.d.ts +1 -1
  26. package/lib/mcp/tools/authenticate/builder-access.d.ts +1 -1
  27. package/lib/mcp/tools/verification/result.js +12 -13
  28. package/lib/old/login-cdp.d.ts +17 -6
  29. package/lib/old/login-cdp.js +28 -11
  30. package/lib/old/to-register.d.ts +6 -0
  31. package/lib/old/to-register.js +35 -5
  32. package/lib/old/tools/authenticate.d.ts +5 -4
  33. package/lib/old/tools/authenticate.js +9 -5
  34. package/lib/old/tools/publish.d.ts +2 -2
  35. package/lib/old/tools/publish.js +47 -21
  36. package/lib/proof/attestor-auth.d.ts +13 -0
  37. package/lib/proof/attestor-auth.js +16 -0
  38. package/lib/proof/attestor.d.ts +7 -4
  39. package/lib/proof/attestor.js +7 -4
  40. package/lib/proof/index.d.ts +1 -0
  41. package/lib/proof/index.js +1 -0
  42. package/lib/proof/pod-prover.d.ts +2 -0
  43. package/lib/proof/pod-prover.js +5 -5
  44. package/lib/provider/injection-doc.d.ts +2 -0
  45. package/lib/provider/injection-doc.js +7 -1
  46. package/lib/provider/post-publish-browser.d.ts +12 -0
  47. package/lib/provider/post-publish-browser.js +40 -0
  48. package/lib/provider/to-version.d.ts +19 -7
  49. package/lib/provider/to-version.js +67 -25
  50. package/lib/tools/registry.d.ts +1 -1
  51. package/lib/tools/registry.js +7 -4
  52. package/package.json +2 -2
  53. package/skill/SKILL.builder.md +118 -13
  54. package/skill/SKILL.common.md +30 -19
  55. package/skill/SKILL.old.md +22 -12
  56. package/skill/builder-mode.md +19 -9
  57. package/skill/community-contributions.md +108 -0
  58. package/skill/hash-validation.md +8 -5
  59. package/skill/interception.md +35 -22
  60. package/skill/old-mode.md +11 -5
  61. package/skill/user-script.md +41 -10
  62. package/src/authoring/tools.ts +2 -1
  63. package/src/consts.ts +1 -2
  64. package/src/live/tunnel.ts +28 -14
  65. package/src/mcp/api/operations.gen.ts +341 -585
  66. package/src/mcp/api/tools.ts +1 -1
  67. package/src/mcp/instructions.ts +5 -3
  68. package/src/mcp/remap_errors.ts +9 -7
  69. package/src/mcp/start.ts +1 -1
  70. package/src/mcp/tools/agent/attach.ts +6 -2
  71. package/src/mcp/tools/agent/build.ts +1 -1
  72. package/src/mcp/tools/agent/live-view-url.ts +13 -0
  73. package/src/mcp/tools/agent/live-view.ts +44 -39
  74. package/src/mcp/tools/agent/propose.ts +10 -4
  75. package/src/mcp/tools/agent/publish.ts +63 -28
  76. package/src/mcp/tools/agent/shared.ts +5 -0
  77. package/src/mcp/tools/authenticate/authenticate.ts +1 -1
  78. package/src/mcp/tools/authenticate/build.ts +1 -1
  79. package/src/mcp/tools/authenticate/builder-access.ts +1 -1
  80. package/src/mcp/tools/verification/result.ts +11 -13
  81. package/src/old/login-cdp.ts +38 -11
  82. package/src/old/to-register.ts +56 -7
  83. package/src/old/tools/authenticate.ts +9 -5
  84. package/src/old/tools/publish.ts +64 -22
  85. package/src/proof/attestor-auth.ts +33 -0
  86. package/src/proof/attestor.ts +14 -8
  87. package/src/proof/index.ts +4 -0
  88. package/src/proof/pod-prover.ts +7 -5
  89. package/src/provider/injection-doc.ts +9 -1
  90. package/src/provider/post-publish-browser.ts +56 -0
  91. package/src/provider/to-version.ts +104 -27
  92. package/src/tools/registry.ts +12 -9
@@ -1,6 +1,6 @@
1
1
  // AUTO-GENERATED by packages/app/scripts/mcp-tools-gen.ts
2
2
  // from packages/app/openapi.yaml.
3
- // Run `npm run openapi:typegen --workspace=packages/agent`
3
+ // Run `npm run openapi:gen --workspace=packages/app`
4
4
  // to regenerate. Do not edit by hand.
5
5
  // @ts-nocheck
6
6
  import { toZod } from "./to-zod.js";
@@ -190,12 +190,13 @@ export const MCP_TOOLS = {
190
190
  },
191
191
  "status": {
192
192
  "type": "string",
193
- "description": "Status of a verification session, derived from its events. New values\nmay be added over time; clients MUST tolerate unknown values in\nresponses.\n\n- `pending`: Created, not yet finished; completable until `expiresAt`.\n\n- `success`: Terminal — `verification_success` recorded.\n\n- `rejected`: Terminal — `verification_rejected` recorded.\n\n- `error`: Terminal — `verification_error` recorded.\n\n- `expired`: `expiresAt` passed before a terminal event; the end-user\n can no longer complete it.",
193
+ "description": "Status of a verification session, derived from its events. New values\nmay be added over time; clients MUST tolerate unknown values in\nresponses.\n\n- `pending`: Created, not yet finished; completable until `expiresAt`.\n\n- `success`: Terminal — `verification_success` recorded.\n\n- `rejected`: Terminal — `verification_rejected` recorded.\n\n- `error`: Terminal — `verification_error` recorded.\n\n- `cancelled`: Terminal — `verification_cancelled` recorded.\n\n- `expired`: `expiresAt` passed before a terminal event; the end-user\n can no longer complete it.",
194
194
  "enum": [
195
195
  "pending",
196
196
  "success",
197
197
  "rejected",
198
198
  "error",
199
+ "cancelled",
199
200
  "expired"
200
201
  ]
201
202
  },
@@ -220,6 +221,113 @@ export const MCP_TOOLS = {
220
221
  "additionalProperties": false
221
222
  }),
222
223
  },
224
+ "BindVerificationSessionTeeNonce": {
225
+ description: "Bind a legacy-compatible TEE nonce to a verification session\n\nBinds one immutable legacy TEE nonce context to a pending session. Requires an OrgToken and an EIP-191 signature from the organization's registered verification key. Repeating the exact binding is idempotent; conflicting or terminal sessions return 409.",
226
+ inputSchema: toZod({
227
+ "type": "object",
228
+ "properties": {
229
+ "params": {
230
+ "type": "object",
231
+ "properties": {
232
+ "sessionId": {
233
+ "type": "string",
234
+ "format": "uuid",
235
+ "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`."
236
+ }
237
+ },
238
+ "required": [
239
+ "sessionId"
240
+ ],
241
+ "additionalProperties": false
242
+ },
243
+ "query": {
244
+ "type": "object",
245
+ "properties": {}
246
+ },
247
+ "body": {
248
+ "type": "object",
249
+ "additionalProperties": false,
250
+ "description": "One immutable legacy TEE context, signed by the organization verification key. The signature is EIP-191 `personal_sign` over `RECLAIM_BUILDER_TEE_BINDING_V1:{organizationId}:{sessionId}:{applicationId}:{timestamp}:{attestationVersion}:{attestationNonce}`.",
251
+ "required": [
252
+ "attestationNonce",
253
+ "attestationNonceData",
254
+ "signature"
255
+ ],
256
+ "properties": {
257
+ "attestationNonce": {
258
+ "description": "Either the current lowercase 64-hex hash nonce (without `0x`) or the older 65-byte EIP-191 signature nonce (`0x` plus 130 hex characters). Builder preserves either encoding unchanged.",
259
+ "oneOf": [
260
+ {
261
+ "type": "string",
262
+ "pattern": "^[0-9a-f]{64}$",
263
+ "minLength": 64,
264
+ "maxLength": 64
265
+ },
266
+ {
267
+ "type": "string",
268
+ "pattern": "^0x[0-9a-fA-F]{130}$",
269
+ "minLength": 132,
270
+ "maxLength": 132
271
+ }
272
+ ]
273
+ },
274
+ "attestationNonceData": {
275
+ "type": "object",
276
+ "additionalProperties": false,
277
+ "description": "Exact legacy TEE nonce inputs. Builder stores this unchanged in the session context after it verifies the signed binding request.",
278
+ "required": [
279
+ "applicationId",
280
+ "sessionId",
281
+ "timestamp",
282
+ "attestationVersion"
283
+ ],
284
+ "properties": {
285
+ "applicationId": {
286
+ "type": "string",
287
+ "description": "Ethereum application address derived from the organization private key. Its supplied casing is preserved for legacy nonce compatibility.",
288
+ "pattern": "^0x[0-9a-fA-F]{40}$",
289
+ "minLength": 42,
290
+ "maxLength": 42
291
+ },
292
+ "sessionId": {
293
+ "type": "string",
294
+ "format": "uuid",
295
+ "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`."
296
+ },
297
+ "timestamp": {
298
+ "type": "string",
299
+ "description": "Decimal Unix timestamp in milliseconds.",
300
+ "pattern": "^[0-9]{13}$",
301
+ "minLength": 13,
302
+ "maxLength": 13
303
+ },
304
+ "attestationVersion": {
305
+ "type": "string",
306
+ "description": "Legacy SDK TEE attestation protocol version.",
307
+ "enum": [
308
+ "v3"
309
+ ]
310
+ }
311
+ }
312
+ },
313
+ "signature": {
314
+ "type": "string",
315
+ "description": "EIP-191 65-byte secp256k1 signature, encoded as 0x-prefixed hex.",
316
+ "pattern": "^0x[0-9a-fA-F]{130}$",
317
+ "minLength": 132,
318
+ "maxLength": 132
319
+ }
320
+ }
321
+ }
322
+ },
323
+ "required": [
324
+ "params",
325
+ "query",
326
+ "body"
327
+ ],
328
+ "additionalProperties": false
329
+ }),
330
+ },
223
331
  "CancelPublicListingRequest": {
224
332
  description: "Cancel a pending public listing review request\n\nCancels a pending public listing request by moving the version from `in_review` back to `draft`. Only org members can cancel their own review requests. This allows users to withdraw a request before admin review if they change their mind.",
225
333
  inputSchema: toZod({
@@ -293,26 +401,65 @@ export const MCP_TOOLS = {
293
401
  "properties": {
294
402
  "callbackUrl": {
295
403
  "type": "string",
296
- "format": "uri",
404
+ "pattern": "^https?://",
405
+ "description": "Callback URL or template. Supported placeholders are `{{sessionId}}` and top-level scalar context keys.",
297
406
  "maxLength": 2000
298
407
  },
299
408
  "events": {
300
409
  "type": "array",
301
410
  "minItems": 1,
302
- "maxItems": 12,
411
+ "maxItems": 50,
303
412
  "items": {
304
413
  "type": "string",
305
- "description": "Lifecycle event reported for a verification session. A healthy run\nproceeds through these in order; reading the gaps locates where a\nsession stalled. Session-level terminal events trigger callback\ndelivery; provider-/request-level events are progress pings carrying a\n`provider_id` (and `request_id` for request-level ones) in their event\ndata. New values may be added over time; clients MUST tolerate unknown\nvalues in responses.\n\n- `session_pending`: Session created; awaiting the end-user.\n\n- `verification_client_opened`: The end-user opened the link. Absent ⇒\n the link was never opened.\n\n- `verification_client_ready`: The client initialized.\n\n- `verification_provider_started`: The client began verifying a provider\n (`provider_id`/`resolved_version`/`ordinal` in `eventData`). One per\n provider, in run order, for multi-provider sessions.\n\n- `request_matched`: The target request was captured on the provider\n site. Absent (after opened) ⇒ the user didn't complete the journey.\n\n- `request_claim_created`: A proof claim was started.\n\n- `request_claim_completed`: A proof claim finished.\n\n- `request_claim_rejected`: A claim was rejected (detail in `eventData`).\n\n- `request_claim_failed`: A claim errored (detail in `eventData`).\n\n- `verification_success`: Terminal — verified. Triggers callback delivery.\n\n- `verification_rejected`: Terminal — rejected (detail in `eventData`).\n\n- `verification_error`: Terminal — errored (detail in `eventData`).\n\n- `session_expired`: `expiresAt` passed before a terminal event.",
414
+ "description": "Canonical Builder lifecycle event. Names use lower snake case; metadata uses camel case. Provider events include providerId, resolvedVersion, and ordinal. Request events also include requestId. New values are additive, so clients must tolerate unknown response values. For field requirements and funnel semantics, see docs/verification-analytics-events.md.",
306
415
  "enum": [
416
+ "billing_required",
307
417
  "session_pending",
308
418
  "verification_client_opened",
309
419
  "verification_client_ready",
420
+ "verification_client_warning",
421
+ "verification_client_visibility_shown",
422
+ "verification_client_visibility_hidden",
423
+ "verification_diagnostics_mode_changed",
424
+ "verification_cancelled",
425
+ "consent_viewed",
426
+ "consent_scrolled",
427
+ "consent_agreed",
428
+ "verification_browser_started",
429
+ "verification_browser_ready",
430
+ "verification_browser_reconnect_started",
431
+ "verification_browser_reconnected",
432
+ "verification_browser_failed",
310
433
  "verification_provider_started",
434
+ "provider_config",
435
+ "provider_script_log",
436
+ "network_request_observed",
437
+ "verification_page_ready",
438
+ "verification_request_interceptor_ready",
439
+ "verification_provider_completed",
440
+ "auth_required",
441
+ "auth_submitted",
442
+ "auth_challenge_remains",
443
+ "auth_rejected",
444
+ "auth_submission_failed",
445
+ "auth_challenge_completed",
446
+ "auth_gate_not_detected",
447
+ "authenticated",
448
+ "user_interaction_started",
449
+ "user_input_started",
450
+ "user_interaction_summary",
451
+ "verification_inactivity_detected",
311
452
  "request_matched",
453
+ "request_match_failed",
454
+ "request_claim_parameters_captured",
312
455
  "request_claim_created",
456
+ "request_claim_retrying",
313
457
  "request_claim_completed",
314
458
  "request_claim_rejected",
315
459
  "request_claim_failed",
460
+ "verification_proofs_completed",
461
+ "verification_result_submitting",
462
+ "verification_result_submission_failed",
316
463
  "verification_success",
317
464
  "verification_rejected",
318
465
  "verification_error",
@@ -369,7 +516,7 @@ export const MCP_TOOLS = {
369
516
  }),
370
517
  },
371
518
  "CreateOrgCallbackSubscription": {
372
- description: "Register a callback subscription on an organization\n\nRegisters a destination for verification results on the organization. Caller must be an active member of the org. The body is just `callbackUrl` and `events`; delivery is scoped to the org and encrypted as a compact JWE to the org's encryption credential when set, else delivered as plaintext.",
519
+ description: "Register a callback subscription on an organization\n\nRegisters an organization callback subscription. Pass the callback URL and events to deliver. Builder encrypts signed results when the organization enables result encryption.",
373
520
  inputSchema: toZod({
374
521
  "type": "object",
375
522
  "properties": {
@@ -401,26 +548,65 @@ export const MCP_TOOLS = {
401
548
  "properties": {
402
549
  "callbackUrl": {
403
550
  "type": "string",
404
- "format": "uri",
551
+ "pattern": "^https?://",
552
+ "description": "Callback URL or template. Supported placeholders are `{{sessionId}}` and top-level scalar context keys.",
405
553
  "maxLength": 2000
406
554
  },
407
555
  "events": {
408
556
  "type": "array",
409
557
  "minItems": 1,
410
- "maxItems": 12,
558
+ "maxItems": 50,
411
559
  "items": {
412
560
  "type": "string",
413
- "description": "Lifecycle event reported for a verification session. A healthy run\nproceeds through these in order; reading the gaps locates where a\nsession stalled. Session-level terminal events trigger callback\ndelivery; provider-/request-level events are progress pings carrying a\n`provider_id` (and `request_id` for request-level ones) in their event\ndata. New values may be added over time; clients MUST tolerate unknown\nvalues in responses.\n\n- `session_pending`: Session created; awaiting the end-user.\n\n- `verification_client_opened`: The end-user opened the link. Absent ⇒\n the link was never opened.\n\n- `verification_client_ready`: The client initialized.\n\n- `verification_provider_started`: The client began verifying a provider\n (`provider_id`/`resolved_version`/`ordinal` in `eventData`). One per\n provider, in run order, for multi-provider sessions.\n\n- `request_matched`: The target request was captured on the provider\n site. Absent (after opened) ⇒ the user didn't complete the journey.\n\n- `request_claim_created`: A proof claim was started.\n\n- `request_claim_completed`: A proof claim finished.\n\n- `request_claim_rejected`: A claim was rejected (detail in `eventData`).\n\n- `request_claim_failed`: A claim errored (detail in `eventData`).\n\n- `verification_success`: Terminal — verified. Triggers callback delivery.\n\n- `verification_rejected`: Terminal — rejected (detail in `eventData`).\n\n- `verification_error`: Terminal — errored (detail in `eventData`).\n\n- `session_expired`: `expiresAt` passed before a terminal event.",
561
+ "description": "Canonical Builder lifecycle event. Names use lower snake case; metadata uses camel case. Provider events include providerId, resolvedVersion, and ordinal. Request events also include requestId. New values are additive, so clients must tolerate unknown response values. For field requirements and funnel semantics, see docs/verification-analytics-events.md.",
414
562
  "enum": [
563
+ "billing_required",
415
564
  "session_pending",
416
565
  "verification_client_opened",
417
566
  "verification_client_ready",
567
+ "verification_client_warning",
568
+ "verification_client_visibility_shown",
569
+ "verification_client_visibility_hidden",
570
+ "verification_diagnostics_mode_changed",
571
+ "verification_cancelled",
572
+ "consent_viewed",
573
+ "consent_scrolled",
574
+ "consent_agreed",
575
+ "verification_browser_started",
576
+ "verification_browser_ready",
577
+ "verification_browser_reconnect_started",
578
+ "verification_browser_reconnected",
579
+ "verification_browser_failed",
418
580
  "verification_provider_started",
581
+ "provider_config",
582
+ "provider_script_log",
583
+ "network_request_observed",
584
+ "verification_page_ready",
585
+ "verification_request_interceptor_ready",
586
+ "verification_provider_completed",
587
+ "auth_required",
588
+ "auth_submitted",
589
+ "auth_challenge_remains",
590
+ "auth_rejected",
591
+ "auth_submission_failed",
592
+ "auth_challenge_completed",
593
+ "auth_gate_not_detected",
594
+ "authenticated",
595
+ "user_interaction_started",
596
+ "user_input_started",
597
+ "user_interaction_summary",
598
+ "verification_inactivity_detected",
419
599
  "request_matched",
600
+ "request_match_failed",
601
+ "request_claim_parameters_captured",
420
602
  "request_claim_created",
603
+ "request_claim_retrying",
421
604
  "request_claim_completed",
422
605
  "request_claim_rejected",
423
606
  "request_claim_failed",
607
+ "verification_proofs_completed",
608
+ "verification_result_submitting",
609
+ "verification_result_submission_failed",
424
610
  "verification_success",
425
611
  "verification_rejected",
426
612
  "verification_error",
@@ -567,7 +753,7 @@ export const MCP_TOOLS = {
567
753
  }),
568
754
  },
569
755
  "CreateProviderVersion": {
570
- description: "Create a new provider version\n\nCreates a new version of the provider. The starting branch\ndepends on the provider's `visibility` and the caller's role:\n\n- `PRIVATE` provider (any caller): the live channel (no review).\n\n- `PUBLIC` provider, admin caller (Reclaim staff): the live channel\n (no review).\n\n- `PUBLIC` provider, non-admin caller: `draft` (or `ai` if\n authored by the AI assistant). Must pass review (see\n `POST /providers/{id}/versions/{version}/review`) before\n reaching the live channel.\n",
756
+ description: "Create a new provider version\n\nCreates a new immutable semantic version of the provider. Provider\nauthoring clients must create another version for every content change;\nthey must not edit a previously created version in place. Use a patch\nbump by default, or use a major/minor bump or exact higher version when\nthe user directs it. The starting branch\ndepends on the provider's `visibility` and the caller's role:\n\n- `PRIVATE` provider (any caller): the live channel (no review).\n\n- `PUBLIC` provider, admin caller (Reclaim staff): the live channel\n (no review).\n\n- `PUBLIC` provider, non-admin caller: `draft` (or `ai` if\n authored by the AI assistant). Must pass review (see\n `POST /providers/{id}/versions/{version}/review`) before\n reaching the live channel.\n",
571
757
  inputSchema: toZod({
572
758
  "type": "object",
573
759
  "properties": {
@@ -689,6 +875,15 @@ export const MCP_TOOLS = {
689
875
  "description": "Template used to match or capture an outgoing request body. Template can use regex templates as placeholders. For example, to match an outgoing request body that contains a request ID, you can use the following template: `(?<requestId>.*)`.",
690
876
  "maxLength": 100000
691
877
  },
878
+ "headers": {
879
+ "type": "object",
880
+ "additionalProperties": {
881
+ "type": "string",
882
+ "maxLength": 16000
883
+ },
884
+ "maxProperties": 100,
885
+ "description": "Static HTTP request headers passed to the attestor. Header values may use the same `{{param}}` and `{{context.key}}` templates as the URL and request body. Cookies captured by the Verification Client are attached separately and don't need to be declared."
886
+ },
692
887
  "credentials": {
693
888
  "type": "string",
694
889
  "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
@@ -772,7 +967,7 @@ export const MCP_TOOLS = {
772
967
  },
773
968
  "responseRedactions": {
774
969
  "type": "array",
775
- "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — NOT paired 1:1 with `responseMatches`. Mirrors attestor-core `responseRedactions`.",
970
+ "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — not generally paired 1:1 with `responseMatches`. For legacy proof-hash optional-subset compatibility only, the redaction at the same index is treated as the pair for an optional `ResponseMatch`; this does not pair all redactions with matches. Mirrors attestor-core `responseRedactions`.",
776
971
  "items": {
777
972
  "type": "object",
778
973
  "additionalProperties": false,
@@ -840,6 +1035,15 @@ export const MCP_TOOLS = {
840
1035
  "description": "Template used to match or capture an outgoing request body. Template can use regex templates as placeholders. For example, to match an outgoing request body that contains a request ID, you can use the following template: `(?<requestId>.*)`.",
841
1036
  "maxLength": 100000
842
1037
  },
1038
+ "headers": {
1039
+ "type": "object",
1040
+ "additionalProperties": {
1041
+ "type": "string",
1042
+ "maxLength": 16000
1043
+ },
1044
+ "maxProperties": 100,
1045
+ "description": "Static HTTP request headers passed to the attestor. Values may contain `{{param}}` and `{{context.key}}` templates."
1046
+ },
843
1047
  "credentials": {
844
1048
  "type": "string",
845
1049
  "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
@@ -923,7 +1127,7 @@ export const MCP_TOOLS = {
923
1127
  },
924
1128
  "responseRedactions": {
925
1129
  "type": "array",
926
- "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — NOT paired 1:1 with `responseMatches`. Mirrors attestor-core `responseRedactions`.",
1130
+ "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — not generally paired 1:1 with `responseMatches`. For legacy proof-hash optional-subset compatibility only, the redaction at the same index is treated as the pair for an optional `ResponseMatch`; this does not pair all redactions with matches. Mirrors attestor-core `responseRedactions`.",
927
1131
  "items": {
928
1132
  "type": "object",
929
1133
  "additionalProperties": false,
@@ -1087,7 +1291,7 @@ export const MCP_TOOLS = {
1087
1291
  },
1088
1292
  "requiredContext": {
1089
1293
  "type": "object",
1090
- "description": "Optional JSON Schema describing the `context` a Consumer must supply when creating a verification session for this provider version. Only needed when the recipe expects Consumer-supplied values: those are referenced as `{{context.<key>}}` in recipe requests. Bare `{{parameterName}}` placeholders are provider parameters (extracted / not Consumer-supplied) and need no declaration here. The Builder validates `CreateVerificationSessionRequest.context` against this schema and rejects the request (400) on mismatch. Extra context fields are always allowed regardless of the schema (a root-level `additionalProperties: false` is ignored). Empty/absent accepts any context.",
1294
+ "description": "Optional JSON Schema describing the `context` a Consumer must supply when creating a verification session for this provider version. Only needed when the recipe expects Consumer-supplied values: those are referenced as `{{context.<key>}}` in recipe requests. Bare `{{parameterName}}` placeholders are normally provider parameters extracted from claimant traffic. For old DevTools recipes, Builder-mode Verification Clients seed a missing bare `parameterName` from a same-named scalar session context field when the recipe doesn't use `{{context.parameterName}}`; an explicit parameter always wins. New recipes should use the explicit `{{context.<key>}}` form. Bare parameters need no declaration here. Builder-owned `reclaimSessionId` and `attestationNonce` remain context-only. The Builder validates `CreateVerificationSessionRequest.context` against this schema and rejects the request (400) on mismatch. Extra context fields are always allowed regardless of the schema (a root-level `additionalProperties: false` is ignored). Empty/absent accepts any context.",
1091
1295
  "additionalProperties": true
1092
1296
  },
1093
1297
  "notes": {
@@ -1107,7 +1311,7 @@ export const MCP_TOOLS = {
1107
1311
  }),
1108
1312
  },
1109
1313
  "CreateVerificationSession": {
1110
- description: "Create a verification session\n\nCreates a verification session for an end-user to complete.\nAuthenticated by the consumer's `OrgToken`; the session is scoped to\nthe resolved organization. The request carries no callback URLs —\nresults are delivered to the org's pre-registered callback\nsubscriptions.\n\n curl -X POST $BASE/verifications/sessions \\\n -H \"Authorization: Bearer $ORG_TOKEN\" \\\n -H 'Content-Type: application/json' \\\n -d '{\"providerId\":\"…\",\"context\":{},\n \"verificationClientUrl\":\"'$BASE'/v/{sessionId}\"}'\n\nFails with `409 Conflict` if the organization has no callback\nsubscription (there would be nowhere to deliver the result).\n",
1314
+ description: "Create a verification session\n\nCreates an end-user verification session. Requires an OrgToken and a callback subscription; pass providers, context, and an optional registered verificationClientUrl. Billing refusal returns 402 or 429 with event billing_required and a terminal sessionId.",
1111
1315
  inputSchema: toZod({
1112
1316
  "type": "object",
1113
1317
  "properties": {
@@ -1146,7 +1350,7 @@ export const MCP_TOOLS = {
1146
1350
  },
1147
1351
  "version": {
1148
1352
  "type": "string",
1149
- "description": "Semver constraint; empty resolves to the latest trunk version.",
1353
+ "description": "Empty selects the latest active trunk version. An exact semantic version pins that version. Any other valid npm semantic-version range selects the highest active matching version.",
1150
1354
  "maxLength": 64
1151
1355
  }
1152
1356
  }
@@ -1155,17 +1359,28 @@ export const MCP_TOOLS = {
1155
1359
  "context": {
1156
1360
  "type": "object",
1157
1361
  "additionalProperties": true,
1158
- "description": "Consumer context, shared by all providers. Validated against EACH resolved provider version's `requiredContext` JSON Schema (a 400 is returned on mismatch); extra fields are always allowed. Recipe requests reference these values as `{{context.<key>}}`. Echoed back (plus `reclaimSessionId`) in the result."
1362
+ "description": "Consumer context, shared by all providers. Validated against EACH resolved provider version's `requiredContext` JSON Schema (a 400 is returned on mismatch); extra fields are always allowed. Recipe requests reference these values as `{{context.<key>}}`. To support old DevTools recipes, Builder-mode Verification Clients also use a same-named scalar context value to seed a missing bare `{{key}}` when the recipe doesn't use `{{context.key}}`; an explicit parameter takes precedence. Echoed back (plus `reclaimSessionId`) in the result. Builder-owned `reclaimSessionId` and `attestationNonce` remain context-only."
1159
1363
  },
1160
1364
  "verificationClientUrl": {
1161
1365
  "type": "string",
1162
- "description": "Optional. Must exactly equal the base URL of a registered verification client (see the `verification_clients` registry / `/admin/verification-clients`). Omit to use the default (`builder`) client. The Builder attaches the session id — into a `{sessionId}` placeholder if the registered base has one, otherwise as a `?sessionId=…` query parameter — and returns the ready-to-share result as `verificationUrl`. A URL that is not a registered client's base is rejected with 400.",
1366
+ "description": "Optional. Must exactly equal the base URL of a registered verification client (see the `verification_clients` registry / `/admin/verification-clients`). Omit to use the default (`builder`) client. The Builder resolves and stores the registered client UUID, then returns the ready-to-share `verificationUrl` with the session id and `api=2`. A URL that is not a registered client's base is rejected with 400. Consumers append any client-owned redirect parameters after receiving the URL; Builder does not manage them.",
1163
1367
  "maxLength": 2000,
1164
1368
  "pattern": "^https?://"
1165
1369
  },
1370
+ "themeId": {
1371
+ "type": "string",
1372
+ "format": "uuid"
1373
+ },
1374
+ "preferredLocale": {
1375
+ "type": "string",
1376
+ "description": "Optional locale override for this verification session. It takes precedence over the organization theme's preferred locale.",
1377
+ "minLength": 2,
1378
+ "maxLength": 64,
1379
+ "pattern": "^[A-Za-z]{2,8}(?:[-_][A-Za-z0-9]{1,8})*$"
1380
+ },
1166
1381
  "preferAiAgent": {
1167
1382
  "type": "boolean",
1168
- "description": "Optional. Whether the Verification Client is preferred (allowed) to run this session's providers with an LLM/AI agent instead of the structured recipe. Omit to default per provider from its `verificationType` (`llm` → agent preferred, `structured` → not). The recipe endpoint exposes the effective per-provider value as `preferAiAgent`. A preference, not a hard gate — clients without agent support run the structured recipe regardless."
1383
+ "description": "Legacy-only preference. Builder mode runs the structured recipe and does not enable AI or manual verification. Omit this field for Builder-mode sessions; dual-mode clients may continue to interpret it only on their legacy path."
1169
1384
  }
1170
1385
  }
1171
1386
  }
@@ -1386,55 +1601,6 @@ export const MCP_TOOLS = {
1386
1601
  "additionalProperties": false
1387
1602
  }),
1388
1603
  },
1389
- "DeleteProviderVersion": {
1390
- description: "Delete a provider version\n\nSoft-archives a version on the `draft`, `ai`, or `rejected` branch — sets `status` to `ARCHIVED` so history is preserved. `fixed`, trunk (live), and `in_review` versions cannot be archived this way; archive the parent provider instead. Supports optimistic concurrency via `If-Match`.",
1391
- inputSchema: toZod({
1392
- "type": "object",
1393
- "properties": {
1394
- "params": {
1395
- "type": "object",
1396
- "properties": {
1397
- "providerId": {
1398
- "type": "string",
1399
- "format": "uuid"
1400
- },
1401
- "version": {
1402
- "type": "string",
1403
- "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$",
1404
- "maxLength": 32
1405
- }
1406
- },
1407
- "required": [
1408
- "providerId",
1409
- "version"
1410
- ],
1411
- "additionalProperties": false
1412
- },
1413
- "query": {
1414
- "type": "object",
1415
- "properties": {}
1416
- },
1417
- "headers": {
1418
- "type": "object",
1419
- "properties": {
1420
- "If-Match": {
1421
- "type": "string",
1422
- "maxLength": 128,
1423
- "description": "Opaque `ETag` from a prior GET on the same resource. When\nsupplied, the server applies optimistic concurrency: the\nmutation fails with `412 Precondition Failed` if the\nresource has been modified since. Omit for last-write-wins.\n"
1424
- }
1425
- }
1426
- },
1427
- "body": {
1428
- "type": "object"
1429
- }
1430
- },
1431
- "required": [
1432
- "params",
1433
- "query"
1434
- ],
1435
- "additionalProperties": false
1436
- }),
1437
- },
1438
1604
  "DiscoverDataPoints": {
1439
1605
  description: "List the verifiable data points on a website\n\nThe data points existing providers can prove on a website — the menu to pick from before `GET /discover/resolve`. Optionally filter by `q`.",
1440
1606
  inputSchema: toZod({
@@ -1778,8 +1944,81 @@ export const MCP_TOOLS = {
1778
1944
  "additionalProperties": false
1779
1945
  }),
1780
1946
  },
1947
+ "GetVerificationFunnel": {
1948
+ description: "Get the verification funnel\n\nCalculates an organization's lifecycle funnel for sessions created between required createdAfter (inclusive) and createdBefore (exclusive). Use providerIds/providerMatch and mode (SESSION or PROVIDER) to scope counts. Missing optional events can reflect telemetry loss.",
1949
+ inputSchema: toZod({
1950
+ "type": "object",
1951
+ "properties": {
1952
+ "params": {
1953
+ "type": "object",
1954
+ "properties": {
1955
+ "orgId": {
1956
+ "type": "string",
1957
+ "format": "uuid"
1958
+ }
1959
+ },
1960
+ "required": [
1961
+ "orgId"
1962
+ ],
1963
+ "additionalProperties": false
1964
+ },
1965
+ "query": {
1966
+ "type": "object",
1967
+ "properties": {
1968
+ "providerIds": {
1969
+ "type": "array",
1970
+ "minItems": 1,
1971
+ "maxItems": 50,
1972
+ "uniqueItems": true,
1973
+ "items": {
1974
+ "type": "string",
1975
+ "format": "uuid"
1976
+ }
1977
+ },
1978
+ "providerMatch": {
1979
+ "type": "string",
1980
+ "enum": [
1981
+ "ANY",
1982
+ "ALL"
1983
+ ],
1984
+ "default": "ANY"
1985
+ },
1986
+ "mode": {
1987
+ "type": "string",
1988
+ "enum": [
1989
+ "SESSION",
1990
+ "PROVIDER"
1991
+ ],
1992
+ "default": "SESSION"
1993
+ },
1994
+ "createdAfter": {
1995
+ "type": "string",
1996
+ "format": "date-time"
1997
+ },
1998
+ "createdBefore": {
1999
+ "type": "string",
2000
+ "format": "date-time"
2001
+ }
2002
+ },
2003
+ "required": [
2004
+ "createdAfter",
2005
+ "createdBefore"
2006
+ ],
2007
+ "additionalProperties": false
2008
+ },
2009
+ "body": {
2010
+ "type": "object"
2011
+ }
2012
+ },
2013
+ "required": [
2014
+ "params",
2015
+ "query"
2016
+ ],
2017
+ "additionalProperties": false
2018
+ }),
2019
+ },
1781
2020
  "GetVerificationSession": {
1782
- description: "Get a verification session\n\nReturns the session. Authenticated by the consumer's `OrgToken` (or the\nVC service token); the resolved org must match the session's.\n\nReading `status`:\n- `pending` — created, not yet finished; the end-user can still\n complete it until `expiresAt`.\n- `success` / `rejected` / `error` — terminal outcomes (the matching\n `verification_*` event was recorded). Only after a terminal status is\n a result delivered to callbacks.\n- `expired` — `expiresAt` passed before a terminal event. A `pending`\n session whose `expiresAt` is in the past has effectively expired and\n flips to `expired` on the next sweep; the end-user can no longer\n complete it — issue a fresh session/link.\n\n`callbackDeliveryStatus` aggregates the session's callback deliveries\nand is only meaningful once the session is terminal. To investigate a\nstuck or failed session, pair this with `list_verification_events` (the\nper-stage lifecycle log) and `list_verification_deliveries` (callback\nhealth).\n",
2021
+ description: "Get a verification session\n\nGets one verification session. Use it to inspect status, resolved providers, context, Verification Client identity, and expiry. Present the owning organization token or the session's x-reclaim-vc-id.",
1783
2022
  inputSchema: toZod({
1784
2023
  "type": "object",
1785
2024
  "properties": {
@@ -1801,6 +2040,15 @@ export const MCP_TOOLS = {
1801
2040
  "type": "object",
1802
2041
  "properties": {}
1803
2042
  },
2043
+ "headers": {
2044
+ "type": "object",
2045
+ "properties": {
2046
+ "x-reclaim-vc-id": {
2047
+ "type": "string",
2048
+ "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull."
2049
+ }
2050
+ }
2051
+ },
1804
2052
  "body": {
1805
2053
  "type": "object"
1806
2054
  }
@@ -1813,7 +2061,7 @@ export const MCP_TOOLS = {
1813
2061
  }),
1814
2062
  },
1815
2063
  "ImportDevtoolsProvider": {
1816
- description: "Import a provider from devtools\n\nImport the latest version of a public provider from the legacy devtools\nservice. Use this when moving an existing provider to Builder instead\nof recreating it.\n\nThe import preserves the legacy provider UUID. The server reads the\ncurrent configuration from\n`https://api.reclaimprotocol.org/api/providers/{providerId}` and\ntranslates it to the Builder schema.\n\nIf the provider already exists in the seeded anonymous catalog, the\nimport assigns that record to the target organization and adds the\nimported version idempotently. A provider owned by another Builder\norganization returns `409`.\n",
2064
+ description: "Import a provider from devtools\n\nImports a public legacy provider into Builder by UUID. Requires human BearerAuth and a target orgId; preserves the provider UUID and is idempotent for seeded providers. Returns 409 if another Builder org owns the UUID.",
1817
2065
  inputSchema: toZod({
1818
2066
  "type": "object",
1819
2067
  "properties": {
@@ -2059,12 +2307,13 @@ export const MCP_TOOLS = {
2059
2307
  },
2060
2308
  "status": {
2061
2309
  "type": "string",
2062
- "description": "Status of a verification session, derived from its events. New values\nmay be added over time; clients MUST tolerate unknown values in\nresponses.\n\n- `pending`: Created, not yet finished; completable until `expiresAt`.\n\n- `success`: Terminal — `verification_success` recorded.\n\n- `rejected`: Terminal — `verification_rejected` recorded.\n\n- `error`: Terminal — `verification_error` recorded.\n\n- `expired`: `expiresAt` passed before a terminal event; the end-user\n can no longer complete it.",
2310
+ "description": "Status of a verification session, derived from its events. New values\nmay be added over time; clients MUST tolerate unknown values in\nresponses.\n\n- `pending`: Created, not yet finished; completable until `expiresAt`.\n\n- `success`: Terminal — `verification_success` recorded.\n\n- `rejected`: Terminal — `verification_rejected` recorded.\n\n- `error`: Terminal — `verification_error` recorded.\n\n- `cancelled`: Terminal — `verification_cancelled` recorded.\n\n- `expired`: `expiresAt` passed before a terminal event; the end-user\n can no longer complete it.",
2063
2311
  "enum": [
2064
2312
  "pending",
2065
2313
  "success",
2066
2314
  "rejected",
2067
2315
  "error",
2316
+ "cancelled",
2068
2317
  "expired"
2069
2318
  ]
2070
2319
  },
@@ -2140,7 +2389,7 @@ export const MCP_TOOLS = {
2140
2389
  }),
2141
2390
  },
2142
2391
  "ListVerificationDeliveries": {
2143
- description: "Get the callback delivery status for a session\n\nDiagnostic view of the session's callback deliveries: one entry per\n(subscription, terminal event) with its delivery state, attempt\ncount, last error, and whether it was dead-lettered. Lets a consumer\n(or the agent) answer \"did my callback arrive, and if not, why?\"\nwithout org-dashboard access. Only meaningful after the session\nreaches a terminal status (no deliveries exist before then). Auth\nmirrors the events GET: the Verification Client service token, or the\nconsumer's `OrgToken` (the resolved org must match the session).\n\nReading `deliveryStatus` per entry:\n- `delivered` — the callback POST succeeded; nothing to do.\n- `pending` — queued, not yet attempted (or between retries).\n- `attempt_failed` — a delivery attempt failed but retries remain;\n `lastError` holds the reason and `attempts` the count so far.\n- `failed` — all retries exhausted. When `deadLettered` is also true\n the delivery sits in the DLQ.\n\nTo recover a failed/dead-lettered delivery: confirm the `callbackUrl`\nis reachable and answers 2xx, then call `retry_verification_callback`\nto re-enqueue it (an org admin can also retry from the Callback DLQ).\n",
2392
+ description: "Get the callback delivery status for a session\n\nLists callback delivery attempts for a session. Requires an OrgToken or the session-bound x-reclaim-vc-id. Use after terminal status to diagnose pending, failed, or dead-lettered callbacks; retry failures with retry_verification_callback.",
2144
2393
  inputSchema: toZod({
2145
2394
  "type": "object",
2146
2395
  "properties": {
@@ -2162,6 +2411,15 @@ export const MCP_TOOLS = {
2162
2411
  "type": "object",
2163
2412
  "properties": {}
2164
2413
  },
2414
+ "headers": {
2415
+ "type": "object",
2416
+ "properties": {
2417
+ "x-reclaim-vc-id": {
2418
+ "type": "string",
2419
+ "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull."
2420
+ }
2421
+ }
2422
+ },
2165
2423
  "body": {
2166
2424
  "type": "object"
2167
2425
  }
@@ -2174,7 +2432,7 @@ export const MCP_TOOLS = {
2174
2432
  }),
2175
2433
  },
2176
2434
  "ListVerificationEvents": {
2177
- description: "Get the event log for a session\n\nReturns the append-only event log. Readable by the Verification Client\n(`X-VC-Token`) or the session creator (authenticated by the consumer's\n`OrgToken`; the resolved org must match the session).\n\nThis log is the primary tool for diagnosing a stuck or failed session.\nA healthy run proceeds through this lifecycle (in order):\n\n`session_pending` → `verification_client_opened` →\n`verification_client_ready` → `request_matched` →\n`request_claim_created` → `request_claim_completed` → terminal\n(`verification_success` | `verification_rejected` | `verification_error`),\nor `session_expired` if `expiresAt` passes first.\n\nRead the gaps to locate where the flow stalled:\n- no `verification_client_opened` → the end-user never opened the link.\n- opened but no `request_matched` → the user opened the page but didn't\n complete the login/journey on the provider site, so the target\n request was never captured.\n- `request_matched` but no terminal event → the proof run is still in\n progress (or stalled mid-claim).\n\nFailure detail lives in `eventData` on `request_claim_failed`,\n`request_claim_rejected`, `verification_error`, and\n`verification_rejected` — inspect it for the reason. Request-level\nevents also carry a `request_id` in `eventData`. Pair with\n`get_verification_session` (status/expiry) and\n`list_verification_deliveries` (callback health) for the full picture.\n",
2435
+ description: "Get the event log for a session\n\nLists append-only lifecycle events for a session. Requires an OrgToken or the session-bound x-reclaim-vc-id. Use after get_verification_session to find the first missing or failed milestone; inspect eventData for failure details.",
2178
2436
  inputSchema: toZod({
2179
2437
  "type": "object",
2180
2438
  "properties": {
@@ -2196,6 +2454,15 @@ export const MCP_TOOLS = {
2196
2454
  "type": "object",
2197
2455
  "properties": {}
2198
2456
  },
2457
+ "headers": {
2458
+ "type": "object",
2459
+ "properties": {
2460
+ "x-reclaim-vc-id": {
2461
+ "type": "string",
2462
+ "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull."
2463
+ }
2464
+ }
2465
+ },
2199
2466
  "body": {
2200
2467
  "type": "object"
2201
2468
  }
@@ -2864,513 +3131,4 @@ export const MCP_TOOLS = {
2864
3131
  "additionalProperties": false
2865
3132
  }),
2866
3133
  },
2867
- "UpdateProviderVersion": {
2868
- description: "Update a provider version\n\nMutable only while the version is on the `draft` or `rejected` branch. Versions on `fixed`, `in_review`, or the live channel reject all writes here. Caller must be a member of the provider's owning organization. Supports optimistic concurrency via `If-Match`.",
2869
- inputSchema: toZod({
2870
- "type": "object",
2871
- "properties": {
2872
- "params": {
2873
- "type": "object",
2874
- "properties": {
2875
- "providerId": {
2876
- "type": "string",
2877
- "format": "uuid"
2878
- },
2879
- "version": {
2880
- "type": "string",
2881
- "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$",
2882
- "maxLength": 32
2883
- }
2884
- },
2885
- "required": [
2886
- "providerId",
2887
- "version"
2888
- ],
2889
- "additionalProperties": false
2890
- },
2891
- "query": {
2892
- "type": "object",
2893
- "properties": {}
2894
- },
2895
- "headers": {
2896
- "type": "object",
2897
- "properties": {
2898
- "If-Match": {
2899
- "type": "string",
2900
- "maxLength": 128,
2901
- "description": "Opaque `ETag` from a prior GET on the same resource. When\nsupplied, the server applies optimistic concurrency: the\nmutation fails with `412 Precondition Failed` if the\nresource has been modified since. Omit for last-write-wins.\n"
2902
- }
2903
- }
2904
- },
2905
- "body": {
2906
- "type": "object",
2907
- "additionalProperties": false,
2908
- "description": "Partial update of a provider version. Mutable only while the version is on the `draft` or `rejected` branch; versions on `fixed`, `in_review`, or the live channel reject all writes here. The semver does not change on update — `build_number` increments instead, giving callers a monotonic revision counter without touching the (major, minor, patch) PK. `verificationType` and `prompt` may be updated; omit either to carry the prior build's value forward.",
2909
- "properties": {
2910
- "initialUrl": {
2911
- "type": "string",
2912
- "format": "uri"
2913
- },
2914
- "verificationType": {
2915
- "type": "string",
2916
- "description": "How a provider version verifies a claim. `structured` uses the explicit match rules on this version (the `matches` / `allowedJsMatches` and related settings). `llm` defers the verification decision to a language model and requires `prompt` to be set.",
2917
- "enum": [
2918
- "llm",
2919
- "structured"
2920
- ]
2921
- },
2922
- "prompt": {
2923
- "type": "string",
2924
- "description": "Extraction prompt, used when `verificationType` is `llm`. Gated by the prompt guard before it is stored (docs/prompt-guard.md).",
2925
- "minLength": 0,
2926
- "maxLength": 4000
2927
- },
2928
- "requests": {
2929
- "type": "array",
2930
- "minItems": 0,
2931
- "items": {
2932
- "type": "object",
2933
- "additionalProperties": false,
2934
- "description": "A matcher for one HTTP request in observed traffic, together with the response constraints that must hold for a Reclaim proof over that request to be valid. Used by interceptors, in-page injections, and LLM agents.",
2935
- "required": [
2936
- "url",
2937
- "method"
2938
- ],
2939
- "properties": {
2940
- "url": {
2941
- "type": "string",
2942
- "description": "The URL or generic path of the HTTP request."
2943
- },
2944
- "method": {
2945
- "type": "string",
2946
- "description": "The HTTP method used for the request.",
2947
- "enum": [
2948
- "GET",
2949
- "POST",
2950
- "PUT",
2951
- "PATCH",
2952
- "DELETE"
2953
- ]
2954
- },
2955
- "requestBodyTemplate": {
2956
- "type": "string",
2957
- "description": "Template used to match or capture an outgoing request body. Template can use regex templates as placeholders. For example, to match an outgoing request body that contains a request ID, you can use the following template: `(?<requestId>.*)`.",
2958
- "maxLength": 100000
2959
- },
2960
- "credentials": {
2961
- "type": "string",
2962
- "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
2963
- "enum": [
2964
- "omit",
2965
- "same-origin",
2966
- "include"
2967
- ]
2968
- },
2969
- "writeRedactionMode": {
2970
- "type": "string",
2971
- "description": "How the matched portion of the response should be redacted before the transcript is handed to the attestor.\n- `zk`: redact using a zero-knowledge proof over the original\n bytes.\n\n- `key-update`: redact by performing a TLS key update so the\n attestor never observes the matched bytes in cleartext.",
2972
- "enum": [
2973
- "zk",
2974
- "key-update"
2975
- ]
2976
- },
2977
- "additionalClientOptions": {
2978
- "type": "object",
2979
- "additionalProperties": false,
2980
- "description": "Apply TLS configuration when creating the tunnel to the attestor.",
2981
- "properties": {
2982
- "supportedProtocolVersions": {
2983
- "type": "array",
2984
- "description": "TLS protocol versions the client is allowed to negotiate.",
2985
- "minItems": 1,
2986
- "uniqueItems": true,
2987
- "items": {
2988
- "type": "string",
2989
- "enum": [
2990
- "TLS1_2",
2991
- "TLS1_3"
2992
- ]
2993
- }
2994
- }
2995
- }
2996
- },
2997
- "responseMatches": {
2998
- "type": "array",
2999
- "description": "Conditions the (redacted) response must satisfy for the proof to be valid. Each runs against the union of the portions revealed by `responseRedactions` (or the whole response when there are none). Mirrors attestor-core `responseMatches`.",
3000
- "minItems": 1,
3001
- "items": {
3002
- "type": "object",
3003
- "additionalProperties": false,
3004
- "description": "Specifies a rule to match against a string in response to validate proof content.",
3005
- "required": [
3006
- "type",
3007
- "value"
3008
- ],
3009
- "properties": {
3010
- "isOptional": {
3011
- "type": "boolean",
3012
- "description": "If true, the match condition is optional and won't fail if absent",
3013
- "default": false
3014
- },
3015
- "description": {
3016
- "type": "string",
3017
- "description": "The description of the field that is extracted using this match rule",
3018
- "minLength": 1,
3019
- "maxLength": 1000
3020
- },
3021
- "order": {
3022
- "type": "integer",
3023
- "description": "The order in which the field should be displayed to user in UI",
3024
- "minimum": 0
3025
- },
3026
- "type": {
3027
- "type": "string",
3028
- "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
3029
- "enum": [
3030
- "regex",
3031
- "contains"
3032
- ]
3033
- },
3034
- "value": {
3035
- "type": "string",
3036
- "description": "The pattern or value to look for in the response. When `type` is 'contains', supports template variable declaration using `{{variable}}` syntax. When `type` is 'regex', can be used to extract variables using regex named groups."
3037
- }
3038
- }
3039
- }
3040
- },
3041
- "responseRedactions": {
3042
- "type": "array",
3043
- "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — NOT paired 1:1 with `responseMatches`. Mirrors attestor-core `responseRedactions`.",
3044
- "items": {
3045
- "type": "object",
3046
- "additionalProperties": false,
3047
- "description": "Which portions to select from a response. These are selected in order, xpath => jsonPath => regex * These redactions are done client side and only the selected portions are sent to the attestor. The attestor will only be able to see the selected portions alongside the first line of the HTTP response (that is, \"HTTP/1.1 200 OK\")",
3048
- "properties": {
3049
- "xPath": {
3050
- "type": "string",
3051
- "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
3052
- },
3053
- "jsonPath": {
3054
- "type": "string",
3055
- "description": "expect a JSON response, retrieve the item at this path using dot notation, for example 'email.addresses.0'."
3056
- },
3057
- "regex": {
3058
- "type": "string",
3059
- "description": "select a regex match from the response"
3060
- },
3061
- "hash": {
3062
- "type": "string",
3063
- "description": "If provided, the value inside will be hashed instead of being redacted. Useful for cases where the data inside is an identifiying piece of information that you don't want to reveal to the attestor, eg. an email address.\nIf the hash function produces more bytes than the original value, the hash will be truncated.\nEg. if hash is enabled, the original value is \"hello\", and hashed is \"a1b2c\", then the attestor will only see \"a1b2c\".\nNote: if a regex with named groups is provided, only the named groups will be hashed.",
3064
- "enum": [
3065
- "oprf",
3066
- "oprf-mpc",
3067
- "oprf-raw"
3068
- ]
3069
- }
3070
- }
3071
- }
3072
- }
3073
- }
3074
- }
3075
- },
3076
- "allowedJsRequests": {
3077
- "type": "array",
3078
- "minItems": 0,
3079
- "items": {
3080
- "type": "object",
3081
- "additionalProperties": false,
3082
- "description": "A template for selecting requests. Same matcher shape as `RequestSelection`, plus template flags (`multiple`/`required`) and optional `templateParams` expansion.",
3083
- "required": [
3084
- "url",
3085
- "method",
3086
- "multiple",
3087
- "required"
3088
- ],
3089
- "properties": {
3090
- "url": {
3091
- "type": "string",
3092
- "description": "The URL or generic path of the HTTP request."
3093
- },
3094
- "method": {
3095
- "type": "string",
3096
- "description": "The HTTP method used for the request.",
3097
- "enum": [
3098
- "GET",
3099
- "POST",
3100
- "PUT",
3101
- "PATCH",
3102
- "DELETE"
3103
- ]
3104
- },
3105
- "requestBodyTemplate": {
3106
- "type": "string",
3107
- "description": "Template used to match or capture an outgoing request body. Template can use regex templates as placeholders. For example, to match an outgoing request body that contains a request ID, you can use the following template: `(?<requestId>.*)`.",
3108
- "maxLength": 100000
3109
- },
3110
- "credentials": {
3111
- "type": "string",
3112
- "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
3113
- "enum": [
3114
- "omit",
3115
- "same-origin",
3116
- "include"
3117
- ]
3118
- },
3119
- "writeRedactionMode": {
3120
- "type": "string",
3121
- "description": "How the matched portion of the response should be redacted before the transcript is handed to the attestor.\n- `zk`: redact using a zero-knowledge proof over the original\n bytes.\n\n- `key-update`: redact by performing a TLS key update so the\n attestor never observes the matched bytes in cleartext.",
3122
- "enum": [
3123
- "zk",
3124
- "key-update"
3125
- ]
3126
- },
3127
- "additionalClientOptions": {
3128
- "type": "object",
3129
- "additionalProperties": false,
3130
- "description": "Apply TLS configuration when creating the tunnel to the attestor.",
3131
- "properties": {
3132
- "supportedProtocolVersions": {
3133
- "type": "array",
3134
- "description": "TLS protocol versions the client is allowed to negotiate.",
3135
- "minItems": 1,
3136
- "uniqueItems": true,
3137
- "items": {
3138
- "type": "string",
3139
- "enum": [
3140
- "TLS1_2",
3141
- "TLS1_3"
3142
- ]
3143
- }
3144
- }
3145
- }
3146
- },
3147
- "responseMatches": {
3148
- "type": "array",
3149
- "description": "Conditions the (redacted) response must satisfy for the proof to be valid. Each runs against the union of the portions revealed by `responseRedactions` (or the whole response when there are none). Mirrors attestor-core `responseMatches`.",
3150
- "minItems": 1,
3151
- "items": {
3152
- "type": "object",
3153
- "additionalProperties": false,
3154
- "description": "Specifies a rule to match against a string in response to validate proof content.",
3155
- "required": [
3156
- "type",
3157
- "value"
3158
- ],
3159
- "properties": {
3160
- "isOptional": {
3161
- "type": "boolean",
3162
- "description": "If true, the match condition is optional and won't fail if absent",
3163
- "default": false
3164
- },
3165
- "description": {
3166
- "type": "string",
3167
- "description": "The description of the field that is extracted using this match rule",
3168
- "minLength": 1,
3169
- "maxLength": 1000
3170
- },
3171
- "order": {
3172
- "type": "integer",
3173
- "description": "The order in which the field should be displayed to user in UI",
3174
- "minimum": 0
3175
- },
3176
- "type": {
3177
- "type": "string",
3178
- "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
3179
- "enum": [
3180
- "regex",
3181
- "contains"
3182
- ]
3183
- },
3184
- "value": {
3185
- "type": "string",
3186
- "description": "The pattern or value to look for in the response. When `type` is 'contains', supports template variable declaration using `{{variable}}` syntax. When `type` is 'regex', can be used to extract variables using regex named groups."
3187
- }
3188
- }
3189
- }
3190
- },
3191
- "responseRedactions": {
3192
- "type": "array",
3193
- "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — NOT paired 1:1 with `responseMatches`. Mirrors attestor-core `responseRedactions`.",
3194
- "items": {
3195
- "type": "object",
3196
- "additionalProperties": false,
3197
- "description": "Which portions to select from a response. These are selected in order, xpath => jsonPath => regex * These redactions are done client side and only the selected portions are sent to the attestor. The attestor will only be able to see the selected portions alongside the first line of the HTTP response (that is, \"HTTP/1.1 200 OK\")",
3198
- "properties": {
3199
- "xPath": {
3200
- "type": "string",
3201
- "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
3202
- },
3203
- "jsonPath": {
3204
- "type": "string",
3205
- "description": "expect a JSON response, retrieve the item at this path using dot notation, for example 'email.addresses.0'."
3206
- },
3207
- "regex": {
3208
- "type": "string",
3209
- "description": "select a regex match from the response"
3210
- },
3211
- "hash": {
3212
- "type": "string",
3213
- "description": "If provided, the value inside will be hashed instead of being redacted. Useful for cases where the data inside is an identifiying piece of information that you don't want to reveal to the attestor, eg. an email address.\nIf the hash function produces more bytes than the original value, the hash will be truncated.\nEg. if hash is enabled, the original value is \"hello\", and hashed is \"a1b2c\", then the attestor will only see \"a1b2c\".\nNote: if a regex with named groups is provided, only the named groups will be hashed.",
3214
- "enum": [
3215
- "oprf",
3216
- "oprf-mpc",
3217
- "oprf-raw"
3218
- ]
3219
- }
3220
- }
3221
- }
3222
- },
3223
- "multiple": {
3224
- "type": "boolean",
3225
- "description": "If true, the template is allowed for multiple requests. Useful for requests like paginated API calls.",
3226
- "default": true
3227
- },
3228
- "required": {
3229
- "type": "boolean",
3230
- "description": "If true, a request is required to match with this template. If not requests matches this template in proof, then validation fails.",
3231
- "default": true
3232
- },
3233
- "templateParams": {
3234
- "type": "array",
3235
- "description": "Names of `${param}` placeholders used in this template's `responseMatches` / `responseRedactions`, substituted at verification time from array-valued extracted parameters (each name must resolve to an array of values; all named arrays must have the same length). Absent or empty means the template is used as-is with no expansion.",
3236
- "maxItems": 50,
3237
- "items": {
3238
- "type": "string",
3239
- "minLength": 1,
3240
- "maxLength": 100
3241
- }
3242
- },
3243
- "templateParamsMode": {
3244
- "type": "string",
3245
- "description": "How array values of `templateParams` expand the template: `separate` (default) emits one expanded request — its own claim — per value; `merge` emits a single request whose `responseMatches`/`responseRedactions` contain all substituted entries, proven by one claim.",
3246
- "enum": [
3247
- "separate",
3248
- "merge"
3249
- ],
3250
- "default": "separate"
3251
- }
3252
- }
3253
- }
3254
- },
3255
- "webSettings": {
3256
- "type": "object",
3257
- "additionalProperties": false,
3258
- "description": "Settings used by the web-based verification client.",
3259
- "properties": {
3260
- "geoLocation": {
3261
- "type": "string",
3262
- "description": "Geographic location the verification should appear to originate from: a 2-letter ISO country code, or a parameter the attestor resolves at proof time. `{{DYNAMIC_GEO}}` and `{{DYNAMIC_GEO_SECRET}}` are the Verification Client's standard names for the end-user's own country — the `_SECRET` one is delivered as a secret param, so the attestor never learns which country the proof egressed from.",
3263
- "maxLength": 64,
3264
- "default": "{{DYNAMIC_GEO}}"
3265
- },
3266
- "clientOptions": {
3267
- "type": "object",
3268
- "additionalProperties": false,
3269
- "description": "Options that influence how the web verification client behaves.",
3270
- "properties": {
3271
- "portal": {
3272
- "type": "object",
3273
- "additionalProperties": false,
3274
- "description": "Options that influence how the portal verification client behaves.",
3275
- "properties": {
3276
- "useProxy": {
3277
- "type": "boolean",
3278
- "description": "When true, network traffic from the portal client and attestation is routed through a proxy.",
3279
- "default": true
3280
- },
3281
- "userAgent": {
3282
- "type": "string",
3283
- "description": "User-agent string used for platform verification.",
3284
- "maxLength": 500
3285
- }
3286
- }
3287
- },
3288
- "inapp": {
3289
- "type": "object",
3290
- "additionalProperties": false,
3291
- "description": "Options that influence how the in-app verification client behaves.",
3292
- "properties": {
3293
- "interceptorOptions": {
3294
- "type": "object",
3295
- "additionalProperties": false,
3296
- "required": [
3297
- "interceptorType"
3298
- ],
3299
- "properties": {
3300
- "interceptorType": {
3301
- "type": "string",
3302
- "description": "How traffic interception is implemented.",
3303
- "enum": [
3304
- "HAWKEYE",
3305
- "MSWJS",
3306
- "CDP"
3307
- ]
3308
- },
3309
- "isDocumentRequestReplayEnabled": {
3310
- "type": "boolean",
3311
- "description": "Whether the main document request is replayed via the attestor",
3312
- "default": false
3313
- },
3314
- "interceptorSettings": {
3315
- "type": "string",
3316
- "description": "Free-form configuration passed through to the interceptor implementation selected by `interceptorType`. Keys and value shapes are defined by the chosen interceptor.",
3317
- "contentMediaType": "application/json"
3318
- }
3319
- }
3320
- },
3321
- "userAgents": {
3322
- "type": "object",
3323
- "additionalProperties": false,
3324
- "description": "User-agent strings keyed by platform.",
3325
- "properties": {
3326
- "android": {
3327
- "type": "string",
3328
- "description": "User-agent string used for platform verification.",
3329
- "maxLength": 500
3330
- },
3331
- "ios": {
3332
- "type": "string",
3333
- "description": "User-agent string used for platform verification.",
3334
- "maxLength": 500
3335
- }
3336
- }
3337
- }
3338
- }
3339
- },
3340
- "extension": {
3341
- "type": "object",
3342
- "description": "Free-form key-value configuration for the browser-extension verification client. Keys and value shapes are defined by the extension client; values may be any JSON. Absent by default.",
3343
- "maxProperties": 100,
3344
- "additionalProperties": true
3345
- }
3346
- }
3347
- },
3348
- "jsUserScripts": {
3349
- "type": "string",
3350
- "description": "JavaScript snippets injected into the page which runs before every page load. `window.Reclaim.` APIs are available to these scripts to request actions to the client like claim creation.",
3351
- "maxLength": 1000000
3352
- }
3353
- }
3354
- },
3355
- "requiredContext": {
3356
- "type": "object",
3357
- "description": "Optional JSON Schema describing the `context` a Consumer must supply when creating a verification session for this provider version. Only needed when the recipe expects Consumer-supplied values: those are referenced as `{{context.<key>}}` in recipe requests. Bare `{{parameterName}}` placeholders are provider parameters (extracted / not Consumer-supplied) and need no declaration here. The Builder validates `CreateVerificationSessionRequest.context` against this schema and rejects the request (400) on mismatch. Extra context fields are always allowed regardless of the schema (a root-level `additionalProperties: false` is ignored). Empty/absent accepts any context.",
3358
- "additionalProperties": true
3359
- },
3360
- "notes": {
3361
- "type": "string",
3362
- "description": "Free-form change note recorded on `updateMetadata`.",
3363
- "maxLength": 10000
3364
- }
3365
- }
3366
- }
3367
- },
3368
- "required": [
3369
- "params",
3370
- "query",
3371
- "body"
3372
- ],
3373
- "additionalProperties": false
3374
- }),
3375
- },
3376
3134
  };