@reclaimprotocol/agent 0.1.1-dev.1 → 0.1.2

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 (232) hide show
  1. package/README.md +1 -1
  2. package/lib/cdp/capture-engine.d.ts +66 -0
  3. package/lib/cdp/capture-engine.js +153 -0
  4. package/lib/cdp/capture.d.ts +9 -20
  5. package/lib/cdp/capture.js +14 -138
  6. package/lib/cdp/index.d.ts +3 -0
  7. package/lib/cdp/index.js +6 -0
  8. package/lib/cdp/launcher.js +4 -3
  9. package/lib/config/store.d.ts +7 -6
  10. package/lib/config/store.js +2 -2
  11. package/lib/consts.d.ts +68 -0
  12. package/lib/consts.js +134 -0
  13. package/lib/index.d.ts +2 -2
  14. package/lib/index.js +1 -1
  15. package/lib/logger.js +2 -1
  16. package/lib/mcp/api/operations.gen.d.ts +100 -48
  17. package/lib/mcp/api/operations.gen.js +1129 -194
  18. package/lib/mcp/api/to-zod.d.ts +24 -0
  19. package/lib/mcp/api/to-zod.js +94 -0
  20. package/lib/mcp/api/tools.js +1 -1
  21. package/lib/mcp/credentials/authenticate.d.ts +3 -0
  22. package/lib/mcp/{tools/credentials → credentials}/authenticate.js +3 -3
  23. package/lib/mcp/credentials/build.d.ts +5 -0
  24. package/lib/mcp/credentials/build.js +18 -0
  25. package/lib/mcp/{tools/credentials → credentials}/cache.d.ts +9 -9
  26. package/lib/mcp/{tools/credentials → credentials}/cache.js +36 -19
  27. package/lib/mcp/credentials/import.d.ts +2 -0
  28. package/lib/mcp/{tools/credentials → credentials}/import.js +2 -2
  29. package/lib/mcp/credentials/issue.d.ts +2 -0
  30. package/lib/mcp/{tools/credentials → credentials}/issue.js +4 -4
  31. package/lib/mcp/credentials/keypair.d.ts +17 -0
  32. package/lib/mcp/credentials/keypair.js +48 -0
  33. package/lib/mcp/credentials/link.d.ts +3 -0
  34. package/lib/mcp/credentials/link.js +107 -0
  35. package/lib/mcp/{tools/credentials → credentials}/list-cached.d.ts +1 -1
  36. package/lib/mcp/{tools/credentials → credentials}/list-cached.js +5 -5
  37. package/lib/mcp/credentials/owner-key.d.ts +23 -0
  38. package/lib/mcp/credentials/owner-key.js +58 -0
  39. package/lib/mcp/credentials/paths.d.ts +12 -0
  40. package/lib/mcp/credentials/paths.js +35 -0
  41. package/lib/mcp/credentials/poll.d.ts +27 -0
  42. package/lib/mcp/credentials/poll.js +61 -0
  43. package/lib/mcp/{tools/credentials → credentials}/resolve-owner-key.d.ts +1 -1
  44. package/lib/mcp/{tools/credentials → credentials}/resolve-owner-key.js +2 -2
  45. package/lib/mcp/credentials/session-cache.d.ts +14 -0
  46. package/lib/mcp/credentials/session-cache.js +42 -0
  47. package/lib/mcp/{tools/credentials → credentials}/status.d.ts +1 -1
  48. package/lib/mcp/credentials/status.js +76 -0
  49. package/lib/mcp/instructions.d.ts +1 -0
  50. package/lib/mcp/instructions.js +11 -0
  51. package/lib/mcp/register.d.ts +38 -0
  52. package/lib/mcp/register.js +80 -0
  53. package/lib/mcp/server.d.ts +2 -8
  54. package/lib/mcp/server.js +3 -33
  55. package/lib/mcp/start.js +17 -11
  56. package/lib/mcp/tools/agent/build.d.ts +5 -9
  57. package/lib/mcp/tools/agent/build.js +7 -24
  58. package/lib/mcp/tools/agent/index.d.ts +2 -0
  59. package/lib/mcp/tools/agent/index.js +3 -0
  60. package/lib/mcp/tools/agent/proof.js +3 -7
  61. package/lib/mcp/tools/agent/propose.js +13 -2
  62. package/lib/mcp/tools/agent/publish.js +172 -75
  63. package/lib/mcp/tools/agent/replay.js +0 -5
  64. package/lib/mcp/tools/analyze.d.ts +3 -0
  65. package/lib/mcp/tools/analyze.js +26 -0
  66. package/lib/mcp/tools/attach.d.ts +11 -0
  67. package/lib/mcp/tools/attach.js +72 -0
  68. package/lib/mcp/tools/authenticate/authenticate.js +107 -0
  69. package/lib/mcp/tools/authenticate/build.d.ts +15 -0
  70. package/lib/mcp/tools/authenticate/build.js +28 -0
  71. package/lib/mcp/tools/authenticate/decrypt-key.d.ts +19 -0
  72. package/lib/mcp/tools/authenticate/decrypt-key.js +46 -0
  73. package/lib/mcp/tools/authenticate/eth-key.d.ts +31 -0
  74. package/lib/mcp/tools/authenticate/eth-key.js +116 -0
  75. package/lib/mcp/tools/authenticate/import.js +57 -0
  76. package/lib/mcp/tools/authenticate/index.d.ts +2 -0
  77. package/lib/mcp/tools/authenticate/index.js +4 -0
  78. package/lib/mcp/tools/authenticate/issue.js +42 -0
  79. package/lib/mcp/tools/authenticate/resolve-owner-key.d.ts +13 -0
  80. package/lib/mcp/tools/authenticate/resolve-owner-key.js +53 -0
  81. package/lib/mcp/tools/capture.d.ts +10 -0
  82. package/lib/mcp/tools/capture.js +142 -0
  83. package/lib/mcp/tools/eval.d.ts +5 -0
  84. package/lib/mcp/tools/eval.js +127 -0
  85. package/lib/mcp/tools/find.d.ts +3 -0
  86. package/lib/mcp/tools/find.js +60 -0
  87. package/lib/mcp/tools/index.d.ts +3 -0
  88. package/lib/mcp/tools/index.js +6 -0
  89. package/lib/mcp/tools/owner-key.d.ts +2 -0
  90. package/lib/mcp/tools/owner-key.js +63 -0
  91. package/lib/mcp/tools/proof.d.ts +3 -0
  92. package/lib/mcp/tools/proof.js +214 -0
  93. package/lib/mcp/tools/propose.d.ts +9 -0
  94. package/lib/mcp/tools/propose.js +75 -0
  95. package/lib/mcp/tools/publish.d.ts +3 -0
  96. package/lib/mcp/tools/publish.js +59 -0
  97. package/lib/mcp/tools/replay.d.ts +3 -0
  98. package/lib/mcp/tools/replay.js +46 -0
  99. package/lib/mcp/tools/session.d.ts +10 -0
  100. package/lib/mcp/tools/session.js +29 -0
  101. package/lib/mcp/tools/verification/build.d.ts +12 -0
  102. package/lib/mcp/tools/verification/build.js +14 -0
  103. package/lib/mcp/tools/verification/diagnose.d.ts +11 -0
  104. package/lib/mcp/tools/verification/diagnose.js +132 -0
  105. package/lib/mcp/tools/verification/index.d.ts +1 -0
  106. package/lib/mcp/tools/verification/index.js +2 -0
  107. package/lib/mcp/tools/verification/result.d.ts +11 -0
  108. package/lib/mcp/tools/verification/result.js +126 -0
  109. package/lib/mcp/verifications/build.d.ts +5 -0
  110. package/lib/mcp/verifications/build.js +14 -0
  111. package/lib/mcp/verifications/create.d.ts +3 -0
  112. package/lib/mcp/verifications/create.js +57 -0
  113. package/lib/mcp/verifications/find.d.ts +3 -0
  114. package/lib/mcp/verifications/find.js +37 -0
  115. package/lib/mcp/verifications/get.d.ts +3 -0
  116. package/lib/mcp/verifications/get.js +26 -0
  117. package/lib/mcp/verifications/update.d.ts +3 -0
  118. package/lib/mcp/verifications/update.js +78 -0
  119. package/lib/old/client.d.ts +3 -0
  120. package/lib/old/flag.d.ts +4 -1
  121. package/lib/old/flag.js +4 -3
  122. package/lib/old/identity.d.ts +0 -10
  123. package/lib/old/identity.js +8 -7
  124. package/lib/old/instructions.d.ts +0 -6
  125. package/lib/old/instructions.js +6 -24
  126. package/lib/old/login-cdp.d.ts +0 -3
  127. package/lib/old/login-cdp.js +2 -4
  128. package/lib/old/to-register.d.ts +3 -0
  129. package/lib/old/to-register.js +32 -7
  130. package/lib/old/tools/authenticate.js +2 -1
  131. package/lib/old/tools/publish.js +71 -10
  132. package/lib/paths.js +2 -2
  133. package/lib/proof/attestor.d.ts +33 -1
  134. package/lib/proof/attestor.js +67 -64
  135. package/lib/proof/index.d.ts +5 -0
  136. package/lib/proof/index.js +6 -0
  137. package/lib/proof/proof-core.d.ts +35 -0
  138. package/lib/proof/proof-core.js +84 -0
  139. package/lib/provider/index.d.ts +5 -0
  140. package/lib/provider/index.js +9 -0
  141. package/lib/provider/injection-doc.d.ts +1 -0
  142. package/lib/provider/injection-doc.js +17 -0
  143. package/lib/provider/match-redaction-warning.d.ts +25 -0
  144. package/lib/provider/match-redaction-warning.js +35 -0
  145. package/lib/provider/schema.d.ts +16 -0
  146. package/lib/provider/schema.js +11 -1
  147. package/lib/provider/to-version.d.ts +61 -12
  148. package/lib/provider/to-version.js +109 -24
  149. package/lib/provider/verification-checks.d.ts +12 -0
  150. package/lib/provider/verification-checks.js +30 -0
  151. package/lib/routes.gen.d.ts +271 -0
  152. package/lib/routes.gen.js +73 -0
  153. package/lib/types/openapi.gen.d.ts +3967 -0
  154. package/lib/types/openapi.gen.js +5 -0
  155. package/package.json +16 -7
  156. package/skill/SKILL.md +35 -14
  157. package/skill/builder-mode.md +13 -0
  158. package/skill/injection-api.md +42 -0
  159. package/skill/old-mode.md +15 -0
  160. package/src/cdp/capture-engine.ts +256 -0
  161. package/src/cdp/capture.ts +25 -185
  162. package/src/cdp/index.ts +6 -0
  163. package/src/cdp/launcher.ts +5 -4
  164. package/src/config/store.ts +7 -6
  165. package/src/consts.ts +164 -0
  166. package/src/index.ts +2 -4
  167. package/src/logger.ts +2 -1
  168. package/src/mcp/api/operations.gen.ts +1155 -194
  169. package/src/mcp/api/to-zod.ts +115 -0
  170. package/src/mcp/api/tools.ts +9 -3
  171. package/src/mcp/instructions.ts +15 -0
  172. package/src/mcp/server.ts +5 -50
  173. package/src/mcp/start.ts +27 -11
  174. package/src/mcp/tools/agent/build.ts +7 -27
  175. package/src/mcp/tools/agent/index.ts +4 -0
  176. package/src/mcp/tools/agent/proof.ts +3 -8
  177. package/src/mcp/tools/agent/propose.ts +13 -2
  178. package/src/mcp/tools/agent/publish.ts +218 -92
  179. package/src/mcp/tools/agent/replay.ts +0 -5
  180. package/src/mcp/tools/{credentials → authenticate}/authenticate.ts +9 -8
  181. package/src/mcp/tools/authenticate/build.ts +32 -0
  182. package/src/mcp/tools/authenticate/decrypt-key.ts +59 -0
  183. package/src/mcp/tools/authenticate/eth-key.ts +162 -0
  184. package/src/mcp/tools/authenticate/import.ts +73 -0
  185. package/src/mcp/tools/authenticate/index.ts +4 -0
  186. package/src/mcp/tools/authenticate/issue.ts +50 -0
  187. package/src/mcp/tools/authenticate/resolve-owner-key.ts +60 -0
  188. package/src/mcp/tools/index.ts +6 -0
  189. package/src/mcp/tools/verification/build.ts +16 -0
  190. package/src/mcp/tools/verification/index.ts +2 -0
  191. package/src/mcp/tools/verification/result.ts +154 -0
  192. package/src/old/client.ts +3 -0
  193. package/src/old/flag.ts +4 -3
  194. package/src/old/identity.ts +8 -7
  195. package/src/old/instructions.ts +10 -25
  196. package/src/old/login-cdp.ts +2 -5
  197. package/src/old/to-register.ts +58 -26
  198. package/src/old/tools/authenticate.ts +2 -1
  199. package/src/old/tools/publish.ts +92 -16
  200. package/src/paths.ts +2 -2
  201. package/src/proof/attestor.ts +114 -72
  202. package/src/proof/index.ts +21 -0
  203. package/src/proof/proof-core.ts +119 -0
  204. package/src/provider/index.ts +20 -0
  205. package/src/provider/injection-doc.ts +21 -0
  206. package/src/provider/match-redaction-warning.ts +53 -0
  207. package/src/provider/schema.ts +23 -0
  208. package/src/provider/to-version.ts +180 -33
  209. package/src/provider/verification-checks.ts +36 -0
  210. package/lib/mcp/tools/credentials/build.d.ts +0 -16
  211. package/lib/mcp/tools/credentials/build.js +0 -33
  212. package/lib/mcp/tools/credentials/status.js +0 -62
  213. package/src/mcp/tools/credentials/build.ts +0 -37
  214. package/src/mcp/tools/credentials/cache.ts +0 -161
  215. package/src/mcp/tools/credentials/env-file.ts +0 -101
  216. package/src/mcp/tools/credentials/import.ts +0 -72
  217. package/src/mcp/tools/credentials/issue.ts +0 -107
  218. package/src/mcp/tools/credentials/list-cached.ts +0 -66
  219. package/src/mcp/tools/credentials/register.ts +0 -49
  220. package/src/mcp/tools/credentials/resolve-owner-key.ts +0 -78
  221. package/src/mcp/tools/credentials/status.ts +0 -82
  222. package/src/types/openapi.ts +0 -7
  223. /package/lib/mcp/{tools/credentials → credentials}/env-file.d.ts +0 -0
  224. /package/lib/mcp/{tools/credentials → credentials}/env-file.js +0 -0
  225. /package/lib/mcp/{tools/credentials → credentials}/register.d.ts +0 -0
  226. /package/lib/mcp/{tools/credentials → credentials}/register.js +0 -0
  227. /package/lib/mcp/tools/{credentials → authenticate}/authenticate.d.ts +0 -0
  228. /package/lib/mcp/tools/{credentials → authenticate}/import.d.ts +0 -0
  229. /package/lib/mcp/tools/{credentials → authenticate}/issue.d.ts +0 -0
  230. /package/lib/mcp/tools/{credentials → authenticate}/session-cache.d.ts +0 -0
  231. /package/lib/mcp/tools/{credentials → authenticate}/session-cache.js +0 -0
  232. /package/src/mcp/tools/{credentials → authenticate}/session-cache.ts +0 -0
@@ -4,7 +4,7 @@
4
4
  // to regenerate. Do not edit by hand.
5
5
  // @ts-nocheck
6
6
 
7
- import { convertJsonSchemaToZod as toZod } from 'zod-from-json-schema'
7
+ import { toZod } from './to-zod.ts'
8
8
 
9
9
  export const MCP_TOOLS = {
10
10
  "AddOrgMember": {
@@ -172,6 +172,48 @@ export const MCP_TOOLS = {
172
172
  "additionalProperties": false
173
173
  }),
174
174
  },
175
+ "AdminSessions": {
176
+ description: "Explore verification sessions (admin-only)\n\nAdmin only. Search verification sessions across all organizations — paste a session id, provider id, or consumer ETH address into `q`, optionally filter by `status`. Rows link to the org-scoped session detail page (admins can open any org's pages). Capped at 100, newest first.",
177
+ inputSchema: toZod({
178
+ "type": "object",
179
+ "properties": {
180
+ "params": {
181
+ "type": "object",
182
+ "properties": {
183
+
184
+ }
185
+ },
186
+ "query": {
187
+ "type": "object",
188
+ "properties": {
189
+ "q": {
190
+ "type": "string",
191
+ "maxLength": 100
192
+ },
193
+ "status": {
194
+ "type": "string",
195
+ "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.",
196
+ "enum": [
197
+ "pending",
198
+ "success",
199
+ "rejected",
200
+ "error",
201
+ "expired"
202
+ ]
203
+ }
204
+ }
205
+ },
206
+ "body": {
207
+ "type": "object"
208
+ }
209
+ },
210
+ "required": [
211
+ "params",
212
+ "query"
213
+ ],
214
+ "additionalProperties": false
215
+ }),
216
+ },
175
217
  "CancelPublicListingRequest": {
176
218
  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.",
177
219
  inputSchema: toZod({
@@ -251,6 +293,72 @@ export const MCP_TOOLS = {
251
293
  "additionalProperties": false
252
294
  }),
253
295
  },
296
+ "CreateCallbackSubscription": {
297
+ description: "Register a callback subscription\n\nRegisters a destination for verification results on the organization\nthe presented `OrgToken` resolves to. The body is just `callbackUrl`\nand `events`. At least one subscription must exist for the org before a\nverification session can be created. Delivery is scoped by org: terminal\nresults are ECIES-encrypted to the org's eth public key when its\n`canEncryptResult` is enabled (see `PUT /orgs/{orgId}/keypair`), else\ndelivered as plaintext.\n",
298
+ inputSchema: toZod({
299
+ "type": "object",
300
+ "properties": {
301
+ "params": {
302
+ "type": "object",
303
+ "properties": {
304
+
305
+ }
306
+ },
307
+ "query": {
308
+ "type": "object",
309
+ "properties": {
310
+
311
+ }
312
+ },
313
+ "body": {
314
+ "type": "object",
315
+ "additionalProperties": false,
316
+ "description": "Body for `POST /verifications/callback-subscriptions`. The owning organization is resolved from the presented `OrgToken`; delivery is scoped to that org and encrypted to its credential when set.",
317
+ "required": [
318
+ "callbackUrl",
319
+ "events"
320
+ ],
321
+ "properties": {
322
+ "callbackUrl": {
323
+ "type": "string",
324
+ "format": "uri",
325
+ "maxLength": 2000
326
+ },
327
+ "events": {
328
+ "type": "array",
329
+ "minItems": 1,
330
+ "maxItems": 12,
331
+ "items": {
332
+ "type": "string",
333
+ "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.",
334
+ "enum": [
335
+ "session_pending",
336
+ "verification_client_opened",
337
+ "verification_client_ready",
338
+ "verification_provider_started",
339
+ "request_matched",
340
+ "request_claim_created",
341
+ "request_claim_completed",
342
+ "request_claim_rejected",
343
+ "request_claim_failed",
344
+ "verification_success",
345
+ "verification_rejected",
346
+ "verification_error",
347
+ "session_expired"
348
+ ]
349
+ }
350
+ }
351
+ }
352
+ }
353
+ },
354
+ "required": [
355
+ "params",
356
+ "query",
357
+ "body"
358
+ ],
359
+ "additionalProperties": false
360
+ }),
361
+ },
254
362
  "CreateOrg": {
255
363
  description: "Create an organization\n\nCreates a new `ORG`-kind organization with the caller as its first `OWNER`. The personal org is created automatically at user signup and is not created via this endpoint.",
256
364
  inputSchema: toZod({
@@ -271,14 +379,99 @@ export const MCP_TOOLS = {
271
379
  "body": {
272
380
  "type": "object",
273
381
  "additionalProperties": false,
382
+ "description": "Body for `POST /orgs`. Explicitly-created orgs must declare their Ethereum (secp256k1) encryption public key — it identifies the org and, when `canEncryptResult` is enabled, encrypts delivered results.",
274
383
  "required": [
275
- "name"
384
+ "name",
385
+ "publicKey"
276
386
  ],
277
387
  "properties": {
278
388
  "name": {
279
389
  "type": "string",
280
390
  "minLength": 1,
281
391
  "maxLength": 200
392
+ },
393
+ "publicKey": {
394
+ "type": "string",
395
+ "description": "The org's eth public key, uncompressed hex (`0x04` + 128 hex) — the eth-native form wallets/ethers emit. The matching private key never leaves the consumer.",
396
+ "pattern": "^0x04[0-9a-fA-F]{128}$"
397
+ },
398
+ "canEncryptResult": {
399
+ "type": "boolean",
400
+ "description": "When true, terminal results are ECIES-encrypted to this key; when false (the default), they are delivered as plaintext.",
401
+ "default": false
402
+ }
403
+ }
404
+ }
405
+ },
406
+ "required": [
407
+ "params",
408
+ "query",
409
+ "body"
410
+ ],
411
+ "additionalProperties": false
412
+ }),
413
+ },
414
+ "CreateOrgCallbackSubscription": {
415
+ 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.",
416
+ inputSchema: toZod({
417
+ "type": "object",
418
+ "properties": {
419
+ "params": {
420
+ "type": "object",
421
+ "properties": {
422
+ "orgId": {
423
+ "type": "string",
424
+ "format": "uuid"
425
+ }
426
+ },
427
+ "required": [
428
+ "orgId"
429
+ ],
430
+ "additionalProperties": false
431
+ },
432
+ "query": {
433
+ "type": "object",
434
+ "properties": {
435
+
436
+ }
437
+ },
438
+ "body": {
439
+ "type": "object",
440
+ "additionalProperties": false,
441
+ "description": "Body for `POST /orgs/{orgId}/callback-subscriptions`. The owning organization comes from the path; bearer-authenticated and gated on org membership. Delivery is scoped to the org and encrypted to its credential when set.",
442
+ "required": [
443
+ "callbackUrl",
444
+ "events"
445
+ ],
446
+ "properties": {
447
+ "callbackUrl": {
448
+ "type": "string",
449
+ "format": "uri",
450
+ "maxLength": 2000
451
+ },
452
+ "events": {
453
+ "type": "array",
454
+ "minItems": 1,
455
+ "maxItems": 12,
456
+ "items": {
457
+ "type": "string",
458
+ "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.",
459
+ "enum": [
460
+ "session_pending",
461
+ "verification_client_opened",
462
+ "verification_client_ready",
463
+ "verification_provider_started",
464
+ "request_matched",
465
+ "request_claim_created",
466
+ "request_claim_completed",
467
+ "request_claim_rejected",
468
+ "request_claim_failed",
469
+ "verification_success",
470
+ "verification_rejected",
471
+ "verification_error",
472
+ "session_expired"
473
+ ]
474
+ }
282
475
  }
283
476
  }
284
477
  }
@@ -574,9 +767,9 @@ export const MCP_TOOLS = {
574
767
  }
575
768
  }
576
769
  },
577
- "matches": {
770
+ "responseMatches": {
578
771
  "type": "array",
579
- "description": "A list of match conditions for the response.",
772
+ "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`.",
580
773
  "minItems": 1,
581
774
  "items": {
582
775
  "type": "object",
@@ -614,9 +807,172 @@ export const MCP_TOOLS = {
614
807
  "value": {
615
808
  "type": "string",
616
809
  "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."
810
+ }
811
+ }
812
+ }
813
+ },
814
+ "responseRedactions": {
815
+ "type": "array",
816
+ "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`.",
817
+ "items": {
818
+ "type": "object",
819
+ "additionalProperties": false,
820
+ "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 (i.e. \"HTTP/1.1 200 OK\")",
821
+ "properties": {
822
+ "xPath": {
823
+ "type": "string",
824
+ "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
825
+ },
826
+ "jsonPath": {
827
+ "type": "string",
828
+ "description": "expect a JSON response, retrieve the item at this path using dot notation for e.g. 'email.addresses.0'"
617
829
  },
618
- "extract": {
830
+ "regex": {
831
+ "type": "string",
832
+ "description": "select a regex match from the response"
833
+ },
834
+ "hash": {
835
+ "type": "string",
836
+ "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.",
837
+ "enum": [
838
+ "oprf",
839
+ "oprf-mpc",
840
+ "oprf-raw"
841
+ ]
842
+ }
843
+ }
844
+ }
845
+ }
846
+ }
847
+ }
848
+ },
849
+ "allowedJsRequests": {
850
+ "type": "array",
851
+ "minItems": 0,
852
+ "default": [
853
+
854
+ ],
855
+ "items": {
856
+ "type": "object",
857
+ "additionalProperties": false,
858
+ "description": "A template for selecting request",
859
+ "allOf": [
860
+ {
861
+ "type": "object",
862
+ "additionalProperties": false,
863
+ "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.",
864
+ "required": [
865
+ "url",
866
+ "method"
867
+ ],
868
+ "properties": {
869
+ "url": {
870
+ "type": "string",
871
+ "description": "The URL or generic path of the HTTP request."
872
+ },
873
+ "method": {
874
+ "type": "string",
875
+ "description": "The HTTP method used for the request.",
876
+ "enum": [
877
+ "GET",
878
+ "POST",
879
+ "PUT",
880
+ "PATCH",
881
+ "DELETE"
882
+ ]
883
+ },
884
+ "requestBodyTemplate": {
885
+ "type": "string",
886
+ "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>.*)`.",
887
+ "maxLength": 100000
888
+ },
889
+ "credentials": {
890
+ "type": "string",
891
+ "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
892
+ "enum": [
893
+ "omit",
894
+ "same-origin",
895
+ "include"
896
+ ]
897
+ },
898
+ "writeRedactionMode": {
899
+ "type": "string",
900
+ "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.",
901
+ "enum": [
902
+ "zk",
903
+ "key-update"
904
+ ]
905
+ },
906
+ "additionalClientOptions": {
907
+ "type": "object",
908
+ "additionalProperties": false,
909
+ "description": "Apply TLS configuration when creating the tunnel to the attestor.",
910
+ "properties": {
911
+ "supportedProtocolVersions": {
912
+ "type": "array",
913
+ "description": "TLS protocol versions the client is allowed to negotiate.",
914
+ "minItems": 1,
915
+ "uniqueItems": true,
916
+ "items": {
917
+ "type": "string",
918
+ "enum": [
919
+ "TLS1_2",
920
+ "TLS1_3"
921
+ ]
922
+ }
923
+ }
924
+ }
925
+ },
926
+ "responseMatches": {
927
+ "type": "array",
928
+ "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`.",
929
+ "minItems": 1,
930
+ "items": {
931
+ "type": "object",
932
+ "additionalProperties": false,
933
+ "description": "Specifies a rule to match against a string in response to validate proof content.",
934
+ "required": [
935
+ "type",
936
+ "value"
937
+ ],
938
+ "properties": {
939
+ "isOptional": {
940
+ "type": "boolean",
941
+ "description": "If true, the match condition is optional and won't fail if absent",
942
+ "default": false
943
+ },
944
+ "description": {
945
+ "type": "string",
946
+ "description": "The description of the field that is extracted using this match rule",
947
+ "minLength": 1,
948
+ "maxLength": 1000
949
+ },
950
+ "order": {
951
+ "type": "integer",
952
+ "description": "The order in which the field should be displayed to user in UI",
953
+ "minimum": 0
954
+ },
955
+ "type": {
956
+ "type": "string",
957
+ "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
958
+ "enum": [
959
+ "regex",
960
+ "contains"
961
+ ]
962
+ },
963
+ "value": {
964
+ "type": "string",
965
+ "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."
966
+ }
967
+ }
968
+ }
969
+ },
970
+ "responseRedactions": {
971
+ "type": "array",
972
+ "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`.",
973
+ "items": {
619
974
  "type": "object",
975
+ "additionalProperties": false,
620
976
  "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 (i.e. \"HTTP/1.1 200 OK\")",
621
977
  "properties": {
622
978
  "xPath": {
@@ -644,23 +1000,6 @@ export const MCP_TOOLS = {
644
1000
  }
645
1001
  }
646
1002
  }
647
- }
648
- }
649
- }
650
- },
651
- "allowedJsRequests": {
652
- "type": "array",
653
- "minItems": 0,
654
- "default": [
655
-
656
- ],
657
- "items": {
658
- "type": "object",
659
- "additionalProperties": false,
660
- "description": "A template for selecting request",
661
- "allOf": [
662
- {
663
- "$ref": "#/components/schemas/RequestSelection"
664
1003
  },
665
1004
  {
666
1005
  "type": "object",
@@ -692,7 +1031,8 @@ export const MCP_TOOLS = {
692
1031
  "geoLocation": {
693
1032
  "type": "string",
694
1033
  "description": "Geographic location (e.g. ISO country code or {{DYNAMIC_GEO}} to use user's geo location) the verification should appear to originate from.",
695
- "maxLength": 15
1034
+ "maxLength": 15,
1035
+ "default": "{{DYNAMIC_GEO}}"
696
1036
  },
697
1037
  "clientOptions": {
698
1038
  "type": "object",
@@ -707,7 +1047,7 @@ export const MCP_TOOLS = {
707
1047
  "useProxy": {
708
1048
  "type": "boolean",
709
1049
  "description": "When true, network traffic from the portal client and attestation is routed through a proxy.",
710
- "default": false
1050
+ "default": true
711
1051
  },
712
1052
  "userAgent": {
713
1053
  "type": "string",
@@ -777,14 +1117,10 @@ export const MCP_TOOLS = {
777
1117
  }
778
1118
  }
779
1119
  },
780
- "requiredParameters": {
1120
+ "requiredContext": {
781
1121
  "type": "object",
782
- "description": "Map of parameter names needed (optional or required) to use this provider to their human-readable descriptions/labels. Values are plain strings shown alongside the field in dashboards and prompts.",
783
- "maxProperties": 50,
784
- "additionalProperties": {
785
- "type": "string",
786
- "maxLength": 500
787
- }
1122
+ "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.",
1123
+ "additionalProperties": true
788
1124
  },
789
1125
  "notes": {
790
1126
  "type": "string",
@@ -802,29 +1138,16 @@ export const MCP_TOOLS = {
802
1138
  "additionalProperties": false
803
1139
  }),
804
1140
  },
805
- "DecideProviderVersionReview": {
806
- description: "Record a decision on a verification version review\n\nAdmin only (Reclaim staff). Approves or rejects a verification version currently on the `in_review` branch. `APPROVED` clears the branch tag and promotes the version to the live channel; `REJECTED` moves it to the `rejected` branch where the author can address feedback and resubmit. A rejected version stays rejected — the author either fixes and resubmits, or abandons it.\nUntil RBAC is designed, \"admin\" is detected via the user's email domain (`@reclaimprotocol.org`). Non-admin callers receive a 403.",
1141
+ "CreateVerificationSession": {
1142
+ 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",
807
1143
  inputSchema: toZod({
808
1144
  "type": "object",
809
1145
  "properties": {
810
1146
  "params": {
811
1147
  "type": "object",
812
1148
  "properties": {
813
- "providerId": {
814
- "type": "string",
815
- "format": "uuid"
816
- },
817
- "version": {
818
- "type": "string",
819
- "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$",
820
- "maxLength": 32
821
- }
822
- },
823
- "required": [
824
- "providerId",
825
- "version"
826
- ],
827
- "additionalProperties": false
1149
+
1150
+ }
828
1151
  },
829
1152
  "query": {
830
1153
  "type": "object",
@@ -835,20 +1158,105 @@ export const MCP_TOOLS = {
835
1158
  "body": {
836
1159
  "type": "object",
837
1160
  "additionalProperties": false,
838
- "description": "Body for recording a decision on a provider version in `in_review`. On `APPROVED` the branch tag is cleared and the version is promoted to the live channel (becomes public). On `REJECTED` the branch becomes `rejected`.",
1161
+ "description": "Body for `POST /verifications/sessions`. Authenticated by the consumer's `OrgToken`. Carries no callback URLs — they come from the org's callback subscriptions. The one shared `context` is validated against every provider's `requiredContext`.",
839
1162
  "required": [
840
- "decision"
1163
+ "providers",
1164
+ "context",
1165
+ "verificationClientUrl"
841
1166
  ],
842
1167
  "properties": {
843
- "decision": {
844
- "type": "string",
845
- "enum": [
846
- "APPROVED",
847
- "REJECTED"
848
- ]
849
- },
850
- "notes": {
851
- "type": "string",
1168
+ "providers": {
1169
+ "type": "array",
1170
+ "minItems": 1,
1171
+ "description": "Providers to verify, in run order. The Verification Client runs each sequentially in one browser session and submits one combined result; all are required.",
1172
+ "items": {
1173
+ "type": "object",
1174
+ "additionalProperties": false,
1175
+ "description": "A provider (+ optional version) to verify in a session.",
1176
+ "required": [
1177
+ "providerId"
1178
+ ],
1179
+ "properties": {
1180
+ "providerId": {
1181
+ "type": "string",
1182
+ "format": "uuid"
1183
+ },
1184
+ "version": {
1185
+ "type": "string",
1186
+ "description": "Semver constraint; empty resolves to the latest trunk version.",
1187
+ "maxLength": 64
1188
+ }
1189
+ }
1190
+ }
1191
+ },
1192
+ "context": {
1193
+ "type": "object",
1194
+ "additionalProperties": true,
1195
+ "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."
1196
+ },
1197
+ "verificationClientUrl": {
1198
+ "type": "string",
1199
+ "description": "Must contain a `{sessionId}` placeholder. Must be an http(s) URL.",
1200
+ "maxLength": 2000
1201
+ }
1202
+ }
1203
+ }
1204
+ },
1205
+ "required": [
1206
+ "params",
1207
+ "query",
1208
+ "body"
1209
+ ],
1210
+ "additionalProperties": false
1211
+ }),
1212
+ },
1213
+ "DecideProviderVersionReview": {
1214
+ description: "Record a decision on a verification version review\n\nAdmin only (Reclaim staff). Approves or rejects a verification version currently on the `in_review` branch. `APPROVED` clears the branch tag and promotes the version to the live channel; `REJECTED` moves it to the `rejected` branch where the author can address feedback and resubmit. A rejected version stays rejected — the author either fixes and resubmits, or abandons it.\nUntil RBAC is designed, \"admin\" is detected via the user's email domain (`@reclaimprotocol.org`). Non-admin callers receive a 403.",
1215
+ inputSchema: toZod({
1216
+ "type": "object",
1217
+ "properties": {
1218
+ "params": {
1219
+ "type": "object",
1220
+ "properties": {
1221
+ "providerId": {
1222
+ "type": "string",
1223
+ "format": "uuid"
1224
+ },
1225
+ "version": {
1226
+ "type": "string",
1227
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$",
1228
+ "maxLength": 32
1229
+ }
1230
+ },
1231
+ "required": [
1232
+ "providerId",
1233
+ "version"
1234
+ ],
1235
+ "additionalProperties": false
1236
+ },
1237
+ "query": {
1238
+ "type": "object",
1239
+ "properties": {
1240
+
1241
+ }
1242
+ },
1243
+ "body": {
1244
+ "type": "object",
1245
+ "additionalProperties": false,
1246
+ "description": "Body for recording a decision on a provider version in `in_review`. On `APPROVED` the branch tag is cleared and the version is promoted to the live channel (becomes public). On `REJECTED` the branch becomes `rejected`.",
1247
+ "required": [
1248
+ "decision"
1249
+ ],
1250
+ "properties": {
1251
+ "decision": {
1252
+ "type": "string",
1253
+ "enum": [
1254
+ "APPROVED",
1255
+ "REJECTED"
1256
+ ]
1257
+ },
1258
+ "notes": {
1259
+ "type": "string",
852
1260
  "description": "Free-form rationale shown to the author.",
853
1261
  "maxLength": 10000
854
1262
  }
@@ -863,6 +1271,118 @@ export const MCP_TOOLS = {
863
1271
  "additionalProperties": false
864
1272
  }),
865
1273
  },
1274
+ "DeleteCallbackSubscription": {
1275
+ description: "Delete a callback subscription\n\nRemoves a callback subscription. Authenticated by the org's `OrgToken`; the subscription must belong to that organization.",
1276
+ inputSchema: toZod({
1277
+ "type": "object",
1278
+ "properties": {
1279
+ "params": {
1280
+ "type": "object",
1281
+ "properties": {
1282
+ "subscriptionId": {
1283
+ "type": "string",
1284
+ "format": "uuid",
1285
+ "description": "Stable id for a callback subscription."
1286
+ }
1287
+ },
1288
+ "required": [
1289
+ "subscriptionId"
1290
+ ],
1291
+ "additionalProperties": false
1292
+ },
1293
+ "query": {
1294
+ "type": "object",
1295
+ "properties": {
1296
+
1297
+ }
1298
+ },
1299
+ "body": {
1300
+ "type": "object"
1301
+ }
1302
+ },
1303
+ "required": [
1304
+ "params",
1305
+ "query"
1306
+ ],
1307
+ "additionalProperties": false
1308
+ }),
1309
+ },
1310
+ "DeleteOrgCallbackSubscription": {
1311
+ description: "Delete an organization's callback subscription\n\nRemoves a callback subscription. Caller must be an active member of the owning org.",
1312
+ inputSchema: toZod({
1313
+ "type": "object",
1314
+ "properties": {
1315
+ "params": {
1316
+ "type": "object",
1317
+ "properties": {
1318
+ "orgId": {
1319
+ "type": "string",
1320
+ "format": "uuid"
1321
+ },
1322
+ "subscriptionId": {
1323
+ "type": "string",
1324
+ "format": "uuid",
1325
+ "description": "Stable id for a callback subscription."
1326
+ }
1327
+ },
1328
+ "required": [
1329
+ "orgId",
1330
+ "subscriptionId"
1331
+ ],
1332
+ "additionalProperties": false
1333
+ },
1334
+ "query": {
1335
+ "type": "object",
1336
+ "properties": {
1337
+
1338
+ }
1339
+ },
1340
+ "body": {
1341
+ "type": "object"
1342
+ }
1343
+ },
1344
+ "required": [
1345
+ "params",
1346
+ "query"
1347
+ ],
1348
+ "additionalProperties": false
1349
+ }),
1350
+ },
1351
+ "DeleteOrgKeypair": {
1352
+ description: "Clear the organization's encryption keypair\n\nRemoves the organization's encryption keypair (the org reverts to keyless ⇒ plaintext delivery, and loses its eth identity address) until a new keypair is set. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.",
1353
+ inputSchema: toZod({
1354
+ "type": "object",
1355
+ "properties": {
1356
+ "params": {
1357
+ "type": "object",
1358
+ "properties": {
1359
+ "orgId": {
1360
+ "type": "string",
1361
+ "format": "uuid"
1362
+ }
1363
+ },
1364
+ "required": [
1365
+ "orgId"
1366
+ ],
1367
+ "additionalProperties": false
1368
+ },
1369
+ "query": {
1370
+ "type": "object",
1371
+ "properties": {
1372
+
1373
+ }
1374
+ },
1375
+ "body": {
1376
+ "type": "object"
1377
+ }
1378
+ },
1379
+ "required": [
1380
+ "params",
1381
+ "query"
1382
+ ],
1383
+ "additionalProperties": false
1384
+ }),
1385
+ },
866
1386
  "DeleteProvider": {
867
1387
  description: "Delete a verification\n\nOwner of the verification's organization only. Soft-archives the verification (sets `status` to `ARCHIVED`) so historical references remain resolvable. Supports optimistic concurrency via `If-Match`.",
868
1388
  inputSchema: toZod({
@@ -997,24 +1517,16 @@ export const MCP_TOOLS = {
997
1517
  "additionalProperties": false
998
1518
  }),
999
1519
  },
1000
- "GetCredential": {
1001
- description: "Get a credential\n\nReturns the credential row. Visibility: anyone can fetch an anonymous (`orgId` null) credential by id; linked credentials are visible only to active members of the owning org.",
1520
+ "GetMe": {
1521
+ description: "Get the authenticated user",
1002
1522
  inputSchema: toZod({
1003
1523
  "type": "object",
1004
1524
  "properties": {
1005
1525
  "params": {
1006
1526
  "type": "object",
1007
1527
  "properties": {
1008
- "credentialId": {
1009
- "type": "string",
1010
- "format": "uuid",
1011
- "description": "Stable id for a `Credential` row."
1012
- }
1013
- },
1014
- "required": [
1015
- "credentialId"
1016
- ],
1017
- "additionalProperties": false
1528
+
1529
+ }
1018
1530
  },
1019
1531
  "query": {
1020
1532
  "type": "object",
@@ -1033,31 +1545,38 @@ export const MCP_TOOLS = {
1033
1545
  "additionalProperties": false
1034
1546
  }),
1035
1547
  },
1036
- "GetCredentialByAddress": {
1037
- description: "Look up a credential by its lowercase ETH address\n\nCompanion to `GET /credentials/{credentialId}`. The MCP / CLI knows the credential by its address (the public handle the user actually types) rather than by its UUID id, so this shortcut returns the same `Credential` shape keyed on the address. Visibility rules mirror `GetCredential`: anonymous credentials are world-readable; linked credentials are visible only to active members of the owning org. Bumps `lastUsedAt` so the dashboard shows liveness.",
1548
+ "GetOrg": {
1549
+ description: "Get an organization",
1038
1550
  inputSchema: toZod({
1039
1551
  "type": "object",
1040
1552
  "properties": {
1041
1553
  "params": {
1042
1554
  "type": "object",
1043
1555
  "properties": {
1044
- "address": {
1556
+ "orgId": {
1045
1557
  "type": "string",
1046
- "description": "Lowercase Ethereum address (no EIP-55 mixed-case checksum). The client derives this from the public key via keccak-256 of the uncompressed pubkey minus the `0x04` prefix, taking the last 20 bytes. The server re-validates the format on insert but does not re-derive from the public key — that match is the client's responsibility.",
1047
- "pattern": "^0x[0-9a-f]{40}$",
1048
- "minLength": 42,
1049
- "maxLength": 42
1558
+ "format": "uuid"
1050
1559
  }
1051
1560
  },
1052
1561
  "required": [
1053
- "address"
1562
+ "orgId"
1054
1563
  ],
1055
1564
  "additionalProperties": false
1056
1565
  },
1057
1566
  "query": {
1058
1567
  "type": "object",
1059
1568
  "properties": {
1060
-
1569
+ "tab": {
1570
+ "type": "string",
1571
+ "enum": [
1572
+ "connect",
1573
+ "providers",
1574
+ "members",
1575
+ "themes",
1576
+ "sessions",
1577
+ "billing"
1578
+ ]
1579
+ }
1061
1580
  }
1062
1581
  },
1063
1582
  "body": {
@@ -1071,16 +1590,23 @@ export const MCP_TOOLS = {
1071
1590
  "additionalProperties": false
1072
1591
  }),
1073
1592
  },
1074
- "GetMe": {
1075
- description: "Get the authenticated user",
1593
+ "GetOrgBilling": {
1594
+ description: "Get the billing record for an organization\n\nOwner only. Returns `404` when no billing has been set; presence of the row is what promotes the org's credentials out of sandbox mode (see `Credential.mode`).",
1076
1595
  inputSchema: toZod({
1077
1596
  "type": "object",
1078
1597
  "properties": {
1079
1598
  "params": {
1080
1599
  "type": "object",
1081
1600
  "properties": {
1082
-
1083
- }
1601
+ "orgId": {
1602
+ "type": "string",
1603
+ "format": "uuid"
1604
+ }
1605
+ },
1606
+ "required": [
1607
+ "orgId"
1608
+ ],
1609
+ "additionalProperties": false
1084
1610
  },
1085
1611
  "query": {
1086
1612
  "type": "object",
@@ -1099,8 +1625,8 @@ export const MCP_TOOLS = {
1099
1625
  "additionalProperties": false
1100
1626
  }),
1101
1627
  },
1102
- "GetOrg": {
1103
- description: "Get an organization",
1628
+ "GetOrgKeypair": {
1629
+ description: "Get the organization's encryption keypair\n\nReturns the organization's single Ethereum (secp256k1) encryption keypair — its public JWK, derived eth address, and `canEncryptResult` flag — or `404` when none is set (the org is keyless ⇒ plaintext delivery). Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.",
1104
1630
  inputSchema: toZod({
1105
1631
  "type": "object",
1106
1632
  "properties": {
@@ -1134,8 +1660,8 @@ export const MCP_TOOLS = {
1134
1660
  "additionalProperties": false
1135
1661
  }),
1136
1662
  },
1137
- "GetOrgBilling": {
1138
- description: "Get the billing record for an organization\n\nOwner only. Returns `404` when no billing has been set; presence of the row is what promotes the org's credentials out of sandbox mode (see `Credential.mode`).",
1663
+ "GetOrgToken": {
1664
+ description: "Get the organization's API token metadata\n\nReturns metadata about the organization's current API token — its last four characters, when it was created, and when it was last used — never the token itself. The caller must be an active **OWNER** of the organization. Returns `404` when no token has been issued.",
1139
1665
  inputSchema: toZod({
1140
1666
  "type": "object",
1141
1667
  "properties": {
@@ -1280,17 +1806,60 @@ export const MCP_TOOLS = {
1280
1806
  "additionalProperties": false
1281
1807
  }),
1282
1808
  },
1283
- "LinkCredential": {
1284
- description: "Link a credential to an organization\n\nLinks an ETH credential to an organization — registering it directly, or attaching an already-known one (matched by `address`). The private key MUST NOT leave the client — only the derived address and uncompressed public key are sent. `orgId` is required and the caller must be allowed to edit it. Idempotent for the same `(address, orgId)`. (Anonymous credentials live client-side; they are only stored here once linked.)",
1809
+ "GetVerificationSession": {
1810
+ 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",
1285
1811
  inputSchema: toZod({
1286
1812
  "type": "object",
1287
1813
  "properties": {
1288
1814
  "params": {
1815
+ "type": "object",
1816
+ "properties": {
1817
+ "sessionId": {
1818
+ "type": "string",
1819
+ "format": "uuid",
1820
+ "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`."
1821
+ }
1822
+ },
1823
+ "required": [
1824
+ "sessionId"
1825
+ ],
1826
+ "additionalProperties": false
1827
+ },
1828
+ "query": {
1289
1829
  "type": "object",
1290
1830
  "properties": {
1291
1831
 
1292
1832
  }
1293
1833
  },
1834
+ "body": {
1835
+ "type": "object"
1836
+ }
1837
+ },
1838
+ "required": [
1839
+ "params",
1840
+ "query"
1841
+ ],
1842
+ "additionalProperties": false
1843
+ }),
1844
+ },
1845
+ "IssueOrgToken": {
1846
+ description: "Issue (or regenerate) the organization's API token\n\nIssues a fresh per-organization API token (`rorg_…`). The caller must be an active **OWNER** of the organization. A successful call invalidates any previously issued token for the org. The plaintext token is returned **only once** in this response (the server stores only its HMAC); treat it like a password and store it securely.",
1847
+ inputSchema: toZod({
1848
+ "type": "object",
1849
+ "properties": {
1850
+ "params": {
1851
+ "type": "object",
1852
+ "properties": {
1853
+ "orgId": {
1854
+ "type": "string",
1855
+ "format": "uuid"
1856
+ }
1857
+ },
1858
+ "required": [
1859
+ "orgId"
1860
+ ],
1861
+ "additionalProperties": false
1862
+ },
1294
1863
  "query": {
1295
1864
  "type": "object",
1296
1865
  "properties": {
@@ -1298,64 +1867,232 @@ export const MCP_TOOLS = {
1298
1867
  }
1299
1868
  },
1300
1869
  "body": {
1870
+ "type": "object"
1871
+ }
1872
+ },
1873
+ "required": [
1874
+ "params",
1875
+ "query"
1876
+ ],
1877
+ "additionalProperties": false
1878
+ }),
1879
+ },
1880
+ "ListCallbackDlq": {
1881
+ description: "List dead-lettered callbacks (admin-only)\n\nAdmin only. Lists callback deliveries whose retries were exhausted and moved to the DLQ for manual recovery.",
1882
+ inputSchema: toZod({
1883
+ "type": "object",
1884
+ "properties": {
1885
+ "params": {
1301
1886
  "type": "object",
1302
- "additionalProperties": false,
1303
- "description": "Body for `POST /credentials`. Only the lowercase ETH `address` is sent — the private key MUST NOT leave the client, and the public key is not sent (the client derives the address from the key: keccak-256 of the uncompressed pubkey minus its `0x04` prefix, last 20 bytes, lowercase hex).",
1887
+ "properties": {
1888
+
1889
+ }
1890
+ },
1891
+ "query": {
1892
+ "type": "object",
1893
+ "properties": {
1894
+
1895
+ }
1896
+ },
1897
+ "body": {
1898
+ "type": "object"
1899
+ }
1900
+ },
1901
+ "required": [
1902
+ "params",
1903
+ "query"
1904
+ ],
1905
+ "additionalProperties": false
1906
+ }),
1907
+ },
1908
+ "ListCallbackSubscriptions": {
1909
+ description: "List callback subscriptions for the organization\n\nReturns every callback subscription owned by the organization the presented `OrgToken` resolves to.",
1910
+ inputSchema: toZod({
1911
+ "type": "object",
1912
+ "properties": {
1913
+ "params": {
1914
+ "type": "object",
1915
+ "properties": {
1916
+
1917
+ }
1918
+ },
1919
+ "query": {
1920
+ "type": "object",
1921
+ "properties": {
1922
+
1923
+ }
1924
+ },
1925
+ "body": {
1926
+ "type": "object"
1927
+ }
1928
+ },
1929
+ "required": [
1930
+ "params",
1931
+ "query"
1932
+ ],
1933
+ "additionalProperties": false
1934
+ }),
1935
+ },
1936
+ "ListOrgCallbackSubscriptions": {
1937
+ description: "List an organization's callback subscriptions\n\nReturns every callback subscription owned by the organization. Caller must be an active member of the org.",
1938
+ inputSchema: toZod({
1939
+ "type": "object",
1940
+ "properties": {
1941
+ "params": {
1942
+ "type": "object",
1943
+ "properties": {
1944
+ "orgId": {
1945
+ "type": "string",
1946
+ "format": "uuid"
1947
+ }
1948
+ },
1949
+ "required": [
1950
+ "orgId"
1951
+ ],
1952
+ "additionalProperties": false
1953
+ },
1954
+ "query": {
1955
+ "type": "object",
1956
+ "properties": {
1957
+
1958
+ }
1959
+ },
1960
+ "body": {
1961
+ "type": "object"
1962
+ }
1963
+ },
1964
+ "required": [
1965
+ "params",
1966
+ "query"
1967
+ ],
1968
+ "additionalProperties": false
1969
+ }),
1970
+ },
1971
+ "ListOrgs": {
1972
+ description: "List organizations the caller belongs to",
1973
+ inputSchema: toZod({
1974
+ "type": "object",
1975
+ "properties": {
1976
+ "params": {
1977
+ "type": "object",
1978
+ "properties": {
1979
+
1980
+ }
1981
+ },
1982
+ "query": {
1983
+ "type": "object",
1984
+ "properties": {
1985
+ "cursor": {
1986
+ "type": "string",
1987
+ "maxLength": 500
1988
+ }
1989
+ }
1990
+ },
1991
+ "body": {
1992
+ "type": "object"
1993
+ }
1994
+ },
1995
+ "required": [
1996
+ "params",
1997
+ "query"
1998
+ ],
1999
+ "additionalProperties": false
2000
+ }),
2001
+ },
2002
+ "ListOrgVerificationSessions": {
2003
+ description: "List an organization's verification sessions\n\nReturns verification sessions created under the organization, newest first. Optionally filter by `providerId`, `status`, `resolvedVersion`, `claimantClientId`, and a `createdAfter`/`createdBefore` time range. Caller must be an active member of the org. Opaque cursor pagination.\n\nNote: `status` filters on the stored column. A session that has passed `expiresAt` but has not yet been swept is reported as `expired` in its body while still stored as `pending`, so `status=expired` may not match such sessions until the sweep runs.",
2004
+ inputSchema: toZod({
2005
+ "type": "object",
2006
+ "properties": {
2007
+ "params": {
2008
+ "type": "object",
2009
+ "properties": {
2010
+ "orgId": {
2011
+ "type": "string",
2012
+ "format": "uuid"
2013
+ }
2014
+ },
1304
2015
  "required": [
1305
- "address",
1306
2016
  "orgId"
1307
2017
  ],
2018
+ "additionalProperties": false
2019
+ },
2020
+ "query": {
2021
+ "type": "object",
1308
2022
  "properties": {
1309
- "address": {
2023
+ "providerId": {
1310
2024
  "type": "string",
1311
- "description": "Lowercase Ethereum address (no EIP-55 mixed-case checksum). The client derives this from the public key via keccak-256 of the uncompressed pubkey minus the `0x04` prefix, taking the last 20 bytes. The server re-validates the format on insert but does not re-derive from the public key — that match is the client's responsibility.",
1312
- "pattern": "^0x[0-9a-f]{40}$",
1313
- "minLength": 42,
1314
- "maxLength": 42
2025
+ "format": "uuid"
1315
2026
  },
1316
- "orgId": {
2027
+ "status": {
2028
+ "type": "string",
2029
+ "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.",
2030
+ "enum": [
2031
+ "pending",
2032
+ "success",
2033
+ "rejected",
2034
+ "error",
2035
+ "expired"
2036
+ ]
2037
+ },
2038
+ "resolvedVersion": {
2039
+ "type": "string",
2040
+ "maxLength": 64
2041
+ },
2042
+ "claimantClientId": {
1317
2043
  "type": "string",
1318
2044
  "format": "uuid"
1319
2045
  },
1320
- "label": {
2046
+ "createdAfter": {
1321
2047
  "type": "string",
1322
- "description": "Optional human-readable label.",
1323
- "minLength": 1,
1324
- "maxLength": 100
2048
+ "format": "date-time"
2049
+ },
2050
+ "createdBefore": {
2051
+ "type": "string",
2052
+ "format": "date-time"
2053
+ },
2054
+ "cursor": {
2055
+ "type": "string",
2056
+ "maxLength": 500
1325
2057
  }
1326
2058
  }
2059
+ },
2060
+ "body": {
2061
+ "type": "object"
1327
2062
  }
1328
2063
  },
1329
2064
  "required": [
1330
2065
  "params",
1331
- "query",
1332
- "body"
2066
+ "query"
1333
2067
  ],
1334
2068
  "additionalProperties": false
1335
2069
  }),
1336
2070
  },
1337
- "ListOrgCredentials": {
1338
- description: "List credentials linked to an organization\n\nReturns every credential whose `orgId` equals the path parameter. Caller must be an active member of the org.",
2071
+ "ListProviderVersions": {
2072
+ description: "List a verification's versions\n\nLists versions visible to the caller. Non-public branches (`ai`, `draft`, `in_review`, `rejected`) are only visible to members of the verification's owning organization.",
1339
2073
  inputSchema: toZod({
1340
2074
  "type": "object",
1341
2075
  "properties": {
1342
2076
  "params": {
1343
2077
  "type": "object",
1344
2078
  "properties": {
1345
- "orgId": {
2079
+ "providerId": {
1346
2080
  "type": "string",
1347
2081
  "format": "uuid"
1348
2082
  }
1349
2083
  },
1350
2084
  "required": [
1351
- "orgId"
2085
+ "providerId"
1352
2086
  ],
1353
2087
  "additionalProperties": false
1354
2088
  },
1355
2089
  "query": {
1356
2090
  "type": "object",
1357
2091
  "properties": {
1358
-
2092
+ "cursor": {
2093
+ "type": "string",
2094
+ "maxLength": 500
2095
+ }
1359
2096
  }
1360
2097
  },
1361
2098
  "body": {
@@ -1369,24 +2106,29 @@ export const MCP_TOOLS = {
1369
2106
  "additionalProperties": false
1370
2107
  }),
1371
2108
  },
1372
- "ListOrgs": {
1373
- description: "List organizations the caller belongs to",
2109
+ "ListVerificationDeliveries": {
2110
+ 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",
1374
2111
  inputSchema: toZod({
1375
2112
  "type": "object",
1376
2113
  "properties": {
1377
2114
  "params": {
1378
2115
  "type": "object",
1379
2116
  "properties": {
1380
-
1381
- }
2117
+ "sessionId": {
2118
+ "type": "string",
2119
+ "format": "uuid",
2120
+ "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`."
2121
+ }
2122
+ },
2123
+ "required": [
2124
+ "sessionId"
2125
+ ],
2126
+ "additionalProperties": false
1382
2127
  },
1383
2128
  "query": {
1384
2129
  "type": "object",
1385
2130
  "properties": {
1386
- "cursor": {
1387
- "type": "string",
1388
- "maxLength": 500
1389
- }
2131
+
1390
2132
  }
1391
2133
  },
1392
2134
  "body": {
@@ -1400,31 +2142,29 @@ export const MCP_TOOLS = {
1400
2142
  "additionalProperties": false
1401
2143
  }),
1402
2144
  },
1403
- "ListProviderVersions": {
1404
- description: "List a verification's versions\n\nLists versions visible to the caller. Non-public branches (`ai`, `draft`, `in_review`, `rejected`) are only visible to members of the verification's owning organization.",
2145
+ "ListVerificationEvents": {
2146
+ 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",
1405
2147
  inputSchema: toZod({
1406
2148
  "type": "object",
1407
2149
  "properties": {
1408
2150
  "params": {
1409
2151
  "type": "object",
1410
2152
  "properties": {
1411
- "providerId": {
2153
+ "sessionId": {
1412
2154
  "type": "string",
1413
- "format": "uuid"
2155
+ "format": "uuid",
2156
+ "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`."
1414
2157
  }
1415
2158
  },
1416
2159
  "required": [
1417
- "providerId"
2160
+ "sessionId"
1418
2161
  ],
1419
2162
  "additionalProperties": false
1420
2163
  },
1421
2164
  "query": {
1422
2165
  "type": "object",
1423
2166
  "properties": {
1424
- "cursor": {
1425
- "type": "string",
1426
- "maxLength": 500
1427
- }
2167
+
1428
2168
  }
1429
2169
  },
1430
2170
  "body": {
@@ -1499,7 +2239,6 @@ export const MCP_TOOLS = {
1499
2239
  "properties": {
1500
2240
  "q": {
1501
2241
  "type": "string",
1502
- "minLength": 1,
1503
2242
  "maxLength": 200
1504
2243
  },
1505
2244
  "tag": {
@@ -1626,22 +2365,22 @@ export const MCP_TOOLS = {
1626
2365
  "additionalProperties": false
1627
2366
  }),
1628
2367
  },
1629
- "RevokeCredential": {
1630
- description: "Revoke a credential\n\nSoft-revokes the credential (sets `revokedAt`). Allowed for the creating user (anonymous credentials), an active OWNER of the owning org (linked credentials), or a Reclaim admin. Revoked credentials cannot be used for verification and cannot be re-linked.",
2368
+ "RetryVerificationCallback": {
2369
+ description: "Re-enqueue callback delivery for a session\n\nRe-enqueues delivery of a session's stored result to its callback subscriptions. Use this after `list_verification_deliveries` shows a `failed` or dead-lettered delivery, once the consumer's callback endpoint is reachable again and answers 2xx — it re-attempts every not-yet-delivered callback for the session. Usable by the session creator (authenticated by the consumer's `OrgToken`) to recover from a transient consumer-side outage.",
1631
2370
  inputSchema: toZod({
1632
2371
  "type": "object",
1633
2372
  "properties": {
1634
2373
  "params": {
1635
2374
  "type": "object",
1636
2375
  "properties": {
1637
- "credentialId": {
2376
+ "sessionId": {
1638
2377
  "type": "string",
1639
2378
  "format": "uuid",
1640
- "description": "Stable id for a `Credential` row."
2379
+ "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`."
1641
2380
  }
1642
2381
  },
1643
2382
  "required": [
1644
- "credentialId"
2383
+ "sessionId"
1645
2384
  ],
1646
2385
  "additionalProperties": false
1647
2386
  },
@@ -1662,27 +2401,21 @@ export const MCP_TOOLS = {
1662
2401
  "additionalProperties": false
1663
2402
  }),
1664
2403
  },
1665
- "SubmitProviderVersionForReview": {
1666
- description: "Submit a verification version for review\n\nSubmits a verification version (currently on the `draft` or `rejected` branch) for admin review. On success the version's branch transitions to `in_review`. Callable by any authenticated member of the verification's owning org. Meaningful only on `PUBLIC` verifications — on `PRIVATE` verifications new versions go to the live channel directly and never need review.",
2404
+ "SetOrgKeypair": {
2405
+ description: "Set (or rotate) the organization's encryption keypair\n\nUpserts the organization's single Ethereum (secp256k1) encryption keypair. The body carries the org's **eth public key** — as an uncompressed hex string (`0x04`+128 hex) or a secp256k1 public JWK (`{kty:'EC', crv:'secp256k1', x, y}`) — and `canEncryptResult`. The matching private key never leaves the consumer. Setting overwrites the single row (and creates it for a keyless org). When `canEncryptResult` is true, terminal results are delivered as an ECIES ciphertext encrypted to this key; otherwise plaintext. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.",
1667
2406
  inputSchema: toZod({
1668
2407
  "type": "object",
1669
2408
  "properties": {
1670
2409
  "params": {
1671
2410
  "type": "object",
1672
2411
  "properties": {
1673
- "providerId": {
2412
+ "orgId": {
1674
2413
  "type": "string",
1675
2414
  "format": "uuid"
1676
- },
1677
- "version": {
1678
- "type": "string",
1679
- "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$",
1680
- "maxLength": 32
1681
2415
  }
1682
2416
  },
1683
2417
  "required": [
1684
- "providerId",
1685
- "version"
2418
+ "orgId"
1686
2419
  ],
1687
2420
  "additionalProperties": false
1688
2421
  },
@@ -1693,16 +2426,88 @@ export const MCP_TOOLS = {
1693
2426
  }
1694
2427
  },
1695
2428
  "body": {
1696
- "type": "object",
1697
- "additionalProperties": false,
1698
- "description": "Body for submitting a provider version for review. Transitions the version's branch from `draft` (or `rejected`) to `in_review`.",
1699
- "properties": {
1700
- "notes": {
1701
- "type": "string",
1702
- "description": "Optional note from the author to reviewers (changelog, areas to focus on, etc.).",
1703
- "maxLength": 10000
2429
+ "oneOf": [
2430
+ {
2431
+ "type": "object",
2432
+ "additionalProperties": false,
2433
+ "description": "Body for `PUT /orgs/{orgId}/keypair`. Carries the org's eth public key as an uncompressed hex string (`0x04` + 128 hex) — the eth-native form wallets/ethers emit. The matching private key never leaves the consumer.",
2434
+ "required": [
2435
+ "publicKey"
2436
+ ],
2437
+ "properties": {
2438
+ "publicKey": {
2439
+ "type": "string",
2440
+ "description": "Uncompressed secp256k1 public key, `0x04` + 128 hex.",
2441
+ "pattern": "^0x04[0-9a-fA-F]{128}$"
2442
+ },
2443
+ "canEncryptResult": {
2444
+ "type": "boolean",
2445
+ "default": false
2446
+ },
2447
+ "label": {
2448
+ "type": "string",
2449
+ "minLength": 1,
2450
+ "maxLength": 100
2451
+ }
2452
+ }
2453
+ },
2454
+ {
2455
+ "type": "object",
2456
+ "additionalProperties": false,
2457
+ "description": "Body for `PUT /orgs/{orgId}/keypair`. Carries the org's eth public key as a secp256k1 public JWK.",
2458
+ "required": [
2459
+ "publicKeyJwk"
2460
+ ],
2461
+ "properties": {
2462
+ "publicKeyJwk": {
2463
+ "type": "object",
2464
+ "additionalProperties": false,
2465
+ "description": "A secp256k1 (Ethereum) public key in JWK form (`{kty:'EC', crv:'secp256k1', x, y}`), used to ECIES-encrypt delivered verification results and to identify the org. The matching private key never leaves the consumer. Same shape published by the signing JWKS.",
2466
+ "required": [
2467
+ "kty",
2468
+ "crv",
2469
+ "x",
2470
+ "y"
2471
+ ],
2472
+ "properties": {
2473
+ "kty": {
2474
+ "type": "string",
2475
+ "enum": [
2476
+ "EC"
2477
+ ]
2478
+ },
2479
+ "crv": {
2480
+ "type": "string",
2481
+ "enum": [
2482
+ "secp256k1"
2483
+ ]
2484
+ },
2485
+ "x": {
2486
+ "type": "string",
2487
+ "description": "base64url-encoded X coordinate (32 bytes).",
2488
+ "minLength": 1,
2489
+ "maxLength": 64
2490
+ },
2491
+ "y": {
2492
+ "type": "string",
2493
+ "description": "base64url-encoded Y coordinate (32 bytes).",
2494
+ "minLength": 1,
2495
+ "maxLength": 64
2496
+ }
2497
+ }
2498
+ },
2499
+ "canEncryptResult": {
2500
+ "type": "boolean",
2501
+ "default": false
2502
+ },
2503
+ "label": {
2504
+ "type": "string",
2505
+ "minLength": 1,
2506
+ "maxLength": 100
2507
+ }
2508
+ }
1704
2509
  }
1705
- }
2510
+ ]
1706
2511
  }
1707
2512
  },
1708
2513
  "required": [
@@ -1713,8 +2518,8 @@ export const MCP_TOOLS = {
1713
2518
  "additionalProperties": false
1714
2519
  }),
1715
2520
  },
1716
- "TransferProvider": {
1717
- description: "Transfer a verification to a different workspace\n\nAdmin-only. Moves the verification's `orgId` to the supplied workspace; preserves slug, versions, members. SQL function `builder.transfer_provider` enforces the admin gate and target existence atomically.",
2521
+ "SubmitProviderVersionForReview": {
2522
+ description: "Submit a verification version for review\n\nSubmits a verification version (currently on the `draft` or `rejected` branch) for admin review. On success the version's branch transitions to `in_review`. Callable by any authenticated member of the verification's owning org. Meaningful only on `PUBLIC` verifications — on `PRIVATE` verifications new versions go to the live channel directly and never need review.",
1718
2523
  inputSchema: toZod({
1719
2524
  "type": "object",
1720
2525
  "properties": {
@@ -1724,10 +2529,16 @@ export const MCP_TOOLS = {
1724
2529
  "providerId": {
1725
2530
  "type": "string",
1726
2531
  "format": "uuid"
2532
+ },
2533
+ "version": {
2534
+ "type": "string",
2535
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$",
2536
+ "maxLength": 32
1727
2537
  }
1728
2538
  },
1729
2539
  "required": [
1730
- "providerId"
2540
+ "providerId",
2541
+ "version"
1731
2542
  ],
1732
2543
  "additionalProperties": false
1733
2544
  },
@@ -1740,13 +2551,12 @@ export const MCP_TOOLS = {
1740
2551
  "body": {
1741
2552
  "type": "object",
1742
2553
  "additionalProperties": false,
1743
- "required": [
1744
- "orgId"
1745
- ],
2554
+ "description": "Body for submitting a provider version for review. Transitions the version's branch from `draft` (or `rejected`) to `in_review`.",
1746
2555
  "properties": {
1747
- "orgId": {
2556
+ "notes": {
1748
2557
  "type": "string",
1749
- "format": "uuid"
2558
+ "description": "Optional note from the author to reviewers (changelog, areas to focus on, etc.).",
2559
+ "maxLength": 10000
1750
2560
  }
1751
2561
  }
1752
2562
  }
@@ -1759,16 +2569,23 @@ export const MCP_TOOLS = {
1759
2569
  "additionalProperties": false
1760
2570
  }),
1761
2571
  },
1762
- "UpdateMe": {
1763
- description: "Update the authenticated user's profile",
2572
+ "TransferProvider": {
2573
+ description: "Transfer a verification to a different workspace\n\nAdmin-only. Moves the verification's `orgId` to the supplied workspace; preserves slug, versions, members. SQL function `builder.transfer_provider` enforces the admin gate and target existence atomically.",
1764
2574
  inputSchema: toZod({
1765
2575
  "type": "object",
1766
2576
  "properties": {
1767
2577
  "params": {
1768
2578
  "type": "object",
1769
2579
  "properties": {
1770
-
1771
- }
2580
+ "providerId": {
2581
+ "type": "string",
2582
+ "format": "uuid"
2583
+ }
2584
+ },
2585
+ "required": [
2586
+ "providerId"
2587
+ ],
2588
+ "additionalProperties": false
1772
2589
  },
1773
2590
  "query": {
1774
2591
  "type": "object",
@@ -1779,12 +2596,13 @@ export const MCP_TOOLS = {
1779
2596
  "body": {
1780
2597
  "type": "object",
1781
2598
  "additionalProperties": false,
1782
- "description": "Caller-editable fields on the authenticated user.",
2599
+ "required": [
2600
+ "orgId"
2601
+ ],
1783
2602
  "properties": {
1784
- "name": {
2603
+ "orgId": {
1785
2604
  "type": "string",
1786
- "minLength": 1,
1787
- "maxLength": 200
2605
+ "format": "uuid"
1788
2606
  }
1789
2607
  }
1790
2608
  }
@@ -2166,9 +2984,9 @@ export const MCP_TOOLS = {
2166
2984
  }
2167
2985
  }
2168
2986
  },
2169
- "matches": {
2987
+ "responseMatches": {
2170
2988
  "type": "array",
2171
- "description": "A list of match conditions for the response.",
2989
+ "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`.",
2172
2990
  "minItems": 1,
2173
2991
  "items": {
2174
2992
  "type": "object",
@@ -2206,9 +3024,169 @@ export const MCP_TOOLS = {
2206
3024
  "value": {
2207
3025
  "type": "string",
2208
3026
  "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."
3027
+ }
3028
+ }
3029
+ }
3030
+ },
3031
+ "responseRedactions": {
3032
+ "type": "array",
3033
+ "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`.",
3034
+ "items": {
3035
+ "type": "object",
3036
+ "additionalProperties": false,
3037
+ "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 (i.e. \"HTTP/1.1 200 OK\")",
3038
+ "properties": {
3039
+ "xPath": {
3040
+ "type": "string",
3041
+ "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
3042
+ },
3043
+ "jsonPath": {
3044
+ "type": "string",
3045
+ "description": "expect a JSON response, retrieve the item at this path using dot notation for e.g. 'email.addresses.0'"
2209
3046
  },
2210
- "extract": {
3047
+ "regex": {
3048
+ "type": "string",
3049
+ "description": "select a regex match from the response"
3050
+ },
3051
+ "hash": {
3052
+ "type": "string",
3053
+ "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.",
3054
+ "enum": [
3055
+ "oprf",
3056
+ "oprf-mpc",
3057
+ "oprf-raw"
3058
+ ]
3059
+ }
3060
+ }
3061
+ }
3062
+ }
3063
+ }
3064
+ }
3065
+ },
3066
+ "allowedJsRequests": {
3067
+ "type": "array",
3068
+ "minItems": 0,
3069
+ "items": {
3070
+ "type": "object",
3071
+ "additionalProperties": false,
3072
+ "description": "A template for selecting request",
3073
+ "allOf": [
3074
+ {
3075
+ "type": "object",
3076
+ "additionalProperties": false,
3077
+ "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.",
3078
+ "required": [
3079
+ "url",
3080
+ "method"
3081
+ ],
3082
+ "properties": {
3083
+ "url": {
3084
+ "type": "string",
3085
+ "description": "The URL or generic path of the HTTP request."
3086
+ },
3087
+ "method": {
3088
+ "type": "string",
3089
+ "description": "The HTTP method used for the request.",
3090
+ "enum": [
3091
+ "GET",
3092
+ "POST",
3093
+ "PUT",
3094
+ "PATCH",
3095
+ "DELETE"
3096
+ ]
3097
+ },
3098
+ "requestBodyTemplate": {
3099
+ "type": "string",
3100
+ "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>.*)`.",
3101
+ "maxLength": 100000
3102
+ },
3103
+ "credentials": {
3104
+ "type": "string",
3105
+ "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
3106
+ "enum": [
3107
+ "omit",
3108
+ "same-origin",
3109
+ "include"
3110
+ ]
3111
+ },
3112
+ "writeRedactionMode": {
3113
+ "type": "string",
3114
+ "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.",
3115
+ "enum": [
3116
+ "zk",
3117
+ "key-update"
3118
+ ]
3119
+ },
3120
+ "additionalClientOptions": {
3121
+ "type": "object",
3122
+ "additionalProperties": false,
3123
+ "description": "Apply TLS configuration when creating the tunnel to the attestor.",
3124
+ "properties": {
3125
+ "supportedProtocolVersions": {
3126
+ "type": "array",
3127
+ "description": "TLS protocol versions the client is allowed to negotiate.",
3128
+ "minItems": 1,
3129
+ "uniqueItems": true,
3130
+ "items": {
3131
+ "type": "string",
3132
+ "enum": [
3133
+ "TLS1_2",
3134
+ "TLS1_3"
3135
+ ]
3136
+ }
3137
+ }
3138
+ }
3139
+ },
3140
+ "responseMatches": {
3141
+ "type": "array",
3142
+ "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`.",
3143
+ "minItems": 1,
3144
+ "items": {
3145
+ "type": "object",
3146
+ "additionalProperties": false,
3147
+ "description": "Specifies a rule to match against a string in response to validate proof content.",
3148
+ "required": [
3149
+ "type",
3150
+ "value"
3151
+ ],
3152
+ "properties": {
3153
+ "isOptional": {
3154
+ "type": "boolean",
3155
+ "description": "If true, the match condition is optional and won't fail if absent",
3156
+ "default": false
3157
+ },
3158
+ "description": {
3159
+ "type": "string",
3160
+ "description": "The description of the field that is extracted using this match rule",
3161
+ "minLength": 1,
3162
+ "maxLength": 1000
3163
+ },
3164
+ "order": {
3165
+ "type": "integer",
3166
+ "description": "The order in which the field should be displayed to user in UI",
3167
+ "minimum": 0
3168
+ },
3169
+ "type": {
3170
+ "type": "string",
3171
+ "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
3172
+ "enum": [
3173
+ "regex",
3174
+ "contains"
3175
+ ]
3176
+ },
3177
+ "value": {
3178
+ "type": "string",
3179
+ "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."
3180
+ }
3181
+ }
3182
+ }
3183
+ },
3184
+ "responseRedactions": {
3185
+ "type": "array",
3186
+ "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`.",
3187
+ "items": {
2211
3188
  "type": "object",
3189
+ "additionalProperties": false,
2212
3190
  "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 (i.e. \"HTTP/1.1 200 OK\")",
2213
3191
  "properties": {
2214
3192
  "xPath": {
@@ -2236,20 +3214,6 @@ export const MCP_TOOLS = {
2236
3214
  }
2237
3215
  }
2238
3216
  }
2239
- }
2240
- }
2241
- }
2242
- },
2243
- "allowedJsRequests": {
2244
- "type": "array",
2245
- "minItems": 0,
2246
- "items": {
2247
- "type": "object",
2248
- "additionalProperties": false,
2249
- "description": "A template for selecting request",
2250
- "allOf": [
2251
- {
2252
- "$ref": "#/components/schemas/RequestSelection"
2253
3217
  },
2254
3218
  {
2255
3219
  "type": "object",
@@ -2281,7 +3245,8 @@ export const MCP_TOOLS = {
2281
3245
  "geoLocation": {
2282
3246
  "type": "string",
2283
3247
  "description": "Geographic location (e.g. ISO country code or {{DYNAMIC_GEO}} to use user's geo location) the verification should appear to originate from.",
2284
- "maxLength": 15
3248
+ "maxLength": 15,
3249
+ "default": "{{DYNAMIC_GEO}}"
2285
3250
  },
2286
3251
  "clientOptions": {
2287
3252
  "type": "object",
@@ -2296,7 +3261,7 @@ export const MCP_TOOLS = {
2296
3261
  "useProxy": {
2297
3262
  "type": "boolean",
2298
3263
  "description": "When true, network traffic from the portal client and attestation is routed through a proxy.",
2299
- "default": false
3264
+ "default": true
2300
3265
  },
2301
3266
  "userAgent": {
2302
3267
  "type": "string",
@@ -2366,14 +3331,10 @@ export const MCP_TOOLS = {
2366
3331
  }
2367
3332
  }
2368
3333
  },
2369
- "requiredParameters": {
3334
+ "requiredContext": {
2370
3335
  "type": "object",
2371
- "description": "Map of parameter names needed (optional or required) to use this provider to their human-readable descriptions/labels. Values are plain strings shown alongside the field in dashboards and prompts.",
2372
- "maxProperties": 50,
2373
- "additionalProperties": {
2374
- "type": "string",
2375
- "maxLength": 500
2376
- }
3336
+ "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.",
3337
+ "additionalProperties": true
2377
3338
  },
2378
3339
  "notes": {
2379
3340
  "type": "string",