@reclaimprotocol/agent 0.1.15 → 0.1.18

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 (64) hide show
  1. package/lib/authoring/index.d.ts +1 -1
  2. package/lib/authoring/index.js +1 -1
  3. package/lib/authoring/util.js +3 -0
  4. package/lib/config/store.d.ts +7 -0
  5. package/lib/consts.d.ts +15 -0
  6. package/lib/consts.js +35 -0
  7. package/lib/index.js +1 -1
  8. package/lib/mcp/api/operations.gen.d.ts +8 -16
  9. package/lib/mcp/api/operations.gen.js +428 -479
  10. package/lib/mcp/remap_errors.js +7 -14
  11. package/lib/mcp/start.js +10 -3
  12. package/lib/mcp/tools/agent/proof.js +3 -3
  13. package/lib/mcp/tools/agent/publish.js +33 -0
  14. package/lib/mcp/tools/authenticate/authenticate.js +178 -93
  15. package/lib/mcp/tools/authenticate/eth-key.js +2 -3
  16. package/lib/mcp/tools/index.d.ts +1 -0
  17. package/lib/mcp/tools/index.js +1 -0
  18. package/lib/mcp/tools/mode/index.d.ts +1 -0
  19. package/lib/mcp/tools/mode/index.js +3 -0
  20. package/lib/mcp/tools/mode/mode.d.ts +17 -0
  21. package/lib/mcp/tools/mode/mode.js +69 -0
  22. package/lib/old/to-register.d.ts +16 -8
  23. package/lib/old/to-register.js +29 -21
  24. package/lib/old/tools/publish.js +86 -8
  25. package/lib/provider/injection-doc.js +4 -3
  26. package/lib/provider/schema.d.ts +26 -1
  27. package/lib/provider/to-version.d.ts +19 -2
  28. package/lib/provider/to-version.js +22 -4
  29. package/lib/tools/registry.d.ts +6 -13
  30. package/lib/tools/registry.js +29 -0
  31. package/package.json +5 -8
  32. package/scripts/prepend-shebang.js +1 -1
  33. package/skill/builder-mode.md +2 -0
  34. package/skill/old-mode.md +3 -1
  35. package/src/authoring/index.ts +1 -0
  36. package/src/authoring/util.ts +3 -0
  37. package/src/cdp/launcher.ts +1 -1
  38. package/src/config/store.ts +8 -0
  39. package/src/consts.ts +44 -0
  40. package/src/index.ts +1 -1
  41. package/src/mcp/api/operations.gen.ts +430 -487
  42. package/src/mcp/remap_errors.ts +8 -15
  43. package/src/mcp/start.ts +11 -2
  44. package/src/mcp/tools/agent/proof.ts +3 -3
  45. package/src/mcp/tools/agent/publish.ts +42 -0
  46. package/src/mcp/tools/authenticate/authenticate.ts +238 -108
  47. package/src/mcp/tools/authenticate/eth-key.ts +7 -5
  48. package/src/mcp/tools/index.ts +1 -0
  49. package/src/mcp/tools/mode/index.ts +3 -0
  50. package/src/mcp/tools/mode/mode.ts +82 -0
  51. package/src/old/to-register.ts +50 -27
  52. package/src/old/tools/publish.ts +108 -8
  53. package/src/proof/debug-response-dump.ts +1 -1
  54. package/src/proof/proof-core.ts +1 -1
  55. package/src/proof/zk-files.ts +2 -2
  56. package/src/provider/dom-xpath.ts +1 -1
  57. package/src/provider/draft.ts +3 -3
  58. package/src/provider/injection-doc.ts +4 -3
  59. package/src/provider/schema.ts +27 -1
  60. package/src/provider/to-version.ts +45 -6
  61. package/src/tools/registry.ts +19 -0
  62. package/src/cli/args.ts +0 -20
  63. package/src/cli/commands.ts +0 -27
  64. package/src/cli.ts +0 -7
@@ -8,7 +8,7 @@ import { toZod } from './to-zod.ts'
8
8
 
9
9
  export const MCP_TOOLS = {
10
10
  "AddOrgMember": {
11
- description: "Invite a member to an organization\n\nOwner only. Invites a user to the organization by email. The invitee does **not** need to be a registered user — an invite is created in either case, and an email is dispatched. The new row is returned with `status: PENDING`; it flips to `ACTIVE` on first sign-in by the invited email. `PERSONAL` organizations reject this call (409). In the current milestone the email is not actually dispatched — the invite is auto-claimed when the invitee next signs in.",
11
+ description: "Invite a member to an organization\n\nOwner only. Invites a user to the organization by email. The invitee does **not** need to be a registered user — an invite is created in either case, and an invite email with an accept link is dispatched. The new row is returned with `status: PENDING`; it flips to `ACTIVE` only when the invitee explicitly accepts via `POST /orgs/{orgId}/invite`. `PERSONAL` organizations reject this call (409).",
12
12
  inputSchema: toZod({
13
13
  "type": "object",
14
14
  "properties": {
@@ -265,34 +265,6 @@ export const MCP_TOOLS = {
265
265
  "additionalProperties": false
266
266
  }),
267
267
  },
268
- "CreateAttachSession": {
269
- description: "Open a device-pairing session to authorize a device\n\nOpens a short-lived (15-minute) device-pairing session. The CLI / MCP needs a bearer token to make authenticated API calls: the human opens `attachUrl`, signs in, and taps \"Authorize this device\". On confirmation the CLI receives a 2-day auth token via `GetAttachSession` polling. Linking a credential to an org is a separate step (`POST /credentials`) and is not part of pairing.",
270
- inputSchema: toZod({
271
- "type": "object",
272
- "properties": {
273
- "params": {
274
- "type": "object",
275
- "properties": {
276
-
277
- }
278
- },
279
- "query": {
280
- "type": "object",
281
- "properties": {
282
-
283
- }
284
- },
285
- "body": {
286
- "type": "object"
287
- }
288
- },
289
- "required": [
290
- "params",
291
- "query"
292
- ],
293
- "additionalProperties": false
294
- }),
295
- },
296
268
  "CreateCallbackSubscription": {
297
269
  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
270
  inputSchema: toZod({
@@ -379,26 +351,15 @@ export const MCP_TOOLS = {
379
351
  "body": {
380
352
  "type": "object",
381
353
  "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.",
354
+ "description": "Body for `POST /orgs` — just a name. Every org is created keyless, like auto-provisioned personal orgs; its Ethereum (secp256k1) key pair is published separately via `PUT /orgs/{orgId}/keypair`, which is also where `canEncryptResult` is set. Creation deliberately collects nothing else so it never blocks on generating and safeguarding a private key.",
383
355
  "required": [
384
- "name",
385
- "publicKey"
356
+ "name"
386
357
  ],
387
358
  "properties": {
388
359
  "name": {
389
360
  "type": "string",
390
361
  "minLength": 1,
391
362
  "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
363
  }
403
364
  }
404
365
  }
@@ -706,8 +667,7 @@ export const MCP_TOOLS = {
706
667
  },
707
668
  "initialUrl": {
708
669
  "type": "string",
709
- "format": "uri",
710
- "maxLength": 300
670
+ "format": "uri"
711
671
  },
712
672
  "requests": {
713
673
  "type": "array",
@@ -869,172 +829,177 @@ export const MCP_TOOLS = {
869
829
  "items": {
870
830
  "type": "object",
871
831
  "additionalProperties": false,
872
- "description": "A template for selecting request",
873
- "allOf": [
874
- {
832
+ "description": "A template for selecting requests. Same matcher shape as `RequestSelection`, plus template flags (`multiple`/`required`) and optional `templateParams` expansion.",
833
+ "required": [
834
+ "url",
835
+ "method",
836
+ "multiple",
837
+ "required"
838
+ ],
839
+ "properties": {
840
+ "url": {
841
+ "type": "string",
842
+ "description": "The URL or generic path of the HTTP request."
843
+ },
844
+ "method": {
845
+ "type": "string",
846
+ "description": "The HTTP method used for the request.",
847
+ "enum": [
848
+ "GET",
849
+ "POST",
850
+ "PUT",
851
+ "PATCH",
852
+ "DELETE"
853
+ ]
854
+ },
855
+ "requestBodyTemplate": {
856
+ "type": "string",
857
+ "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>.*)`.",
858
+ "maxLength": 100000
859
+ },
860
+ "credentials": {
861
+ "type": "string",
862
+ "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
863
+ "enum": [
864
+ "omit",
865
+ "same-origin",
866
+ "include"
867
+ ]
868
+ },
869
+ "writeRedactionMode": {
870
+ "type": "string",
871
+ "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.",
872
+ "enum": [
873
+ "zk",
874
+ "key-update"
875
+ ]
876
+ },
877
+ "additionalClientOptions": {
875
878
  "type": "object",
876
879
  "additionalProperties": false,
877
- "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.",
878
- "required": [
879
- "url",
880
- "method"
881
- ],
880
+ "description": "Apply TLS configuration when creating the tunnel to the attestor.",
882
881
  "properties": {
883
- "url": {
884
- "type": "string",
885
- "description": "The URL or generic path of the HTTP request."
886
- },
887
- "method": {
888
- "type": "string",
889
- "description": "The HTTP method used for the request.",
890
- "enum": [
891
- "GET",
892
- "POST",
893
- "PUT",
894
- "PATCH",
895
- "DELETE"
896
- ]
897
- },
898
- "requestBodyTemplate": {
899
- "type": "string",
900
- "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>.*)`.",
901
- "maxLength": 100000
902
- },
903
- "credentials": {
904
- "type": "string",
905
- "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
906
- "enum": [
907
- "omit",
908
- "same-origin",
909
- "include"
910
- ]
911
- },
912
- "writeRedactionMode": {
913
- "type": "string",
914
- "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.",
915
- "enum": [
916
- "zk",
917
- "key-update"
918
- ]
919
- },
920
- "additionalClientOptions": {
921
- "type": "object",
922
- "additionalProperties": false,
923
- "description": "Apply TLS configuration when creating the tunnel to the attestor.",
924
- "properties": {
925
- "supportedProtocolVersions": {
926
- "type": "array",
927
- "description": "TLS protocol versions the client is allowed to negotiate.",
928
- "minItems": 1,
929
- "uniqueItems": true,
930
- "items": {
931
- "type": "string",
932
- "enum": [
933
- "TLS1_2",
934
- "TLS1_3"
935
- ]
936
- }
937
- }
938
- }
939
- },
940
- "responseMatches": {
882
+ "supportedProtocolVersions": {
941
883
  "type": "array",
942
- "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`.",
884
+ "description": "TLS protocol versions the client is allowed to negotiate.",
943
885
  "minItems": 1,
886
+ "uniqueItems": true,
944
887
  "items": {
945
- "type": "object",
946
- "additionalProperties": false,
947
- "description": "Specifies a rule to match against a string in response to validate proof content.",
948
- "required": [
949
- "type",
950
- "value"
951
- ],
952
- "properties": {
953
- "isOptional": {
954
- "type": "boolean",
955
- "description": "If true, the match condition is optional and won't fail if absent",
956
- "default": false
957
- },
958
- "description": {
959
- "type": "string",
960
- "description": "The description of the field that is extracted using this match rule",
961
- "minLength": 1,
962
- "maxLength": 1000
963
- },
964
- "order": {
965
- "type": "integer",
966
- "description": "The order in which the field should be displayed to user in UI",
967
- "minimum": 0
968
- },
969
- "type": {
970
- "type": "string",
971
- "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
972
- "enum": [
973
- "regex",
974
- "contains"
975
- ]
976
- },
977
- "value": {
978
- "type": "string",
979
- "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."
980
- }
981
- }
888
+ "type": "string",
889
+ "enum": [
890
+ "TLS1_2",
891
+ "TLS1_3"
892
+ ]
982
893
  }
983
- },
984
- "responseRedactions": {
985
- "type": "array",
986
- "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`.",
987
- "items": {
988
- "type": "object",
989
- "additionalProperties": false,
990
- "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\")",
991
- "properties": {
992
- "xPath": {
993
- "type": "string",
994
- "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
995
- },
996
- "jsonPath": {
997
- "type": "string",
998
- "description": "expect a JSON response, retrieve the item at this path using dot notation for e.g. 'email.addresses.0'"
999
- },
1000
- "regex": {
1001
- "type": "string",
1002
- "description": "select a regex match from the response"
1003
- },
1004
- "hash": {
1005
- "type": "string",
1006
- "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.",
1007
- "enum": [
1008
- "oprf",
1009
- "oprf-mpc",
1010
- "oprf-raw"
1011
- ]
1012
- }
1013
- }
894
+ }
895
+ }
896
+ },
897
+ "responseMatches": {
898
+ "type": "array",
899
+ "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`.",
900
+ "minItems": 1,
901
+ "items": {
902
+ "type": "object",
903
+ "additionalProperties": false,
904
+ "description": "Specifies a rule to match against a string in response to validate proof content.",
905
+ "required": [
906
+ "type",
907
+ "value"
908
+ ],
909
+ "properties": {
910
+ "isOptional": {
911
+ "type": "boolean",
912
+ "description": "If true, the match condition is optional and won't fail if absent",
913
+ "default": false
914
+ },
915
+ "description": {
916
+ "type": "string",
917
+ "description": "The description of the field that is extracted using this match rule",
918
+ "minLength": 1,
919
+ "maxLength": 1000
920
+ },
921
+ "order": {
922
+ "type": "integer",
923
+ "description": "The order in which the field should be displayed to user in UI",
924
+ "minimum": 0
925
+ },
926
+ "type": {
927
+ "type": "string",
928
+ "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
929
+ "enum": [
930
+ "regex",
931
+ "contains"
932
+ ]
933
+ },
934
+ "value": {
935
+ "type": "string",
936
+ "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."
1014
937
  }
1015
938
  }
1016
939
  }
1017
940
  },
1018
- {
1019
- "type": "object",
1020
- "required": [
1021
- "multiple",
1022
- "required"
1023
- ],
1024
- "properties": {
1025
- "multiple": {
1026
- "type": "boolean",
1027
- "description": "If true, the template is allowed for multiple requests. Useful for requests like paginated API calls.",
1028
- "default": true
1029
- },
1030
- "required": {
1031
- "type": "boolean",
1032
- "description": "If true, a request is required to match with this template. If not requests matches this template in proof, then validation fails.",
1033
- "default": true
941
+ "responseRedactions": {
942
+ "type": "array",
943
+ "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`.",
944
+ "items": {
945
+ "type": "object",
946
+ "additionalProperties": false,
947
+ "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\")",
948
+ "properties": {
949
+ "xPath": {
950
+ "type": "string",
951
+ "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
952
+ },
953
+ "jsonPath": {
954
+ "type": "string",
955
+ "description": "expect a JSON response, retrieve the item at this path using dot notation for e.g. 'email.addresses.0'"
956
+ },
957
+ "regex": {
958
+ "type": "string",
959
+ "description": "select a regex match from the response"
960
+ },
961
+ "hash": {
962
+ "type": "string",
963
+ "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.",
964
+ "enum": [
965
+ "oprf",
966
+ "oprf-mpc",
967
+ "oprf-raw"
968
+ ]
969
+ }
1034
970
  }
1035
971
  }
972
+ },
973
+ "multiple": {
974
+ "type": "boolean",
975
+ "description": "If true, the template is allowed for multiple requests. Useful for requests like paginated API calls.",
976
+ "default": true
977
+ },
978
+ "required": {
979
+ "type": "boolean",
980
+ "description": "If true, a request is required to match with this template. If not requests matches this template in proof, then validation fails.",
981
+ "default": true
982
+ },
983
+ "templateParams": {
984
+ "type": "array",
985
+ "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.",
986
+ "maxItems": 50,
987
+ "items": {
988
+ "type": "string",
989
+ "minLength": 1,
990
+ "maxLength": 100
991
+ }
992
+ },
993
+ "templateParamsMode": {
994
+ "type": "string",
995
+ "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.",
996
+ "enum": [
997
+ "separate",
998
+ "merge"
999
+ ],
1000
+ "default": "separate"
1036
1001
  }
1037
- ]
1002
+ }
1038
1003
  }
1039
1004
  },
1040
1005
  "webSettings": {
@@ -1121,6 +1086,12 @@ export const MCP_TOOLS = {
1121
1086
  }
1122
1087
  }
1123
1088
  }
1089
+ },
1090
+ "extension": {
1091
+ "type": "object",
1092
+ "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.",
1093
+ "maxProperties": 100,
1094
+ "additionalProperties": true
1124
1095
  }
1125
1096
  }
1126
1097
  },
@@ -1175,8 +1146,7 @@ export const MCP_TOOLS = {
1175
1146
  "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`.",
1176
1147
  "required": [
1177
1148
  "providers",
1178
- "context",
1179
- "verificationClientUrl"
1149
+ "context"
1180
1150
  ],
1181
1151
  "properties": {
1182
1152
  "providers": {
@@ -1210,8 +1180,13 @@ export const MCP_TOOLS = {
1210
1180
  },
1211
1181
  "verificationClientUrl": {
1212
1182
  "type": "string",
1213
- "description": "Must contain a `{sessionId}` placeholder. Must be an http(s) URL.",
1214
- "maxLength": 2000
1183
+ "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.",
1184
+ "maxLength": 2000,
1185
+ "pattern": "^https?://"
1186
+ },
1187
+ "preferAiAgent": {
1188
+ "type": "boolean",
1189
+ "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."
1215
1190
  }
1216
1191
  }
1217
1192
  }
@@ -1566,10 +1541,12 @@ export const MCP_TOOLS = {
1566
1541
  },
1567
1542
  "mode": {
1568
1543
  "type": "string",
1544
+ "description": "How the resolver picks providers. `combine` (default) minimizes to the fewest providers (set-cover); `ai` is a forward-compat alias that currently resolves like combine.",
1569
1545
  "enum": [
1570
1546
  "combine",
1571
1547
  "ai"
1572
- ]
1548
+ ],
1549
+ "default": "combine"
1573
1550
  }
1574
1551
  },
1575
1552
  "required": [
@@ -1589,44 +1566,6 @@ export const MCP_TOOLS = {
1589
1566
  "additionalProperties": false
1590
1567
  }),
1591
1568
  },
1592
- "GetAttachSession": {
1593
- description: "Poll a pairing session\n\nAnonymous poll endpoint used by the CLI / MCP while it waits for the human to complete the dashboard step. Once `status` is `LINKED`, the response includes a `token` (2-day bearer token) the CLI / MCP can use for authenticated API calls. Expired or unknown codes return `404`.",
1594
- inputSchema: toZod({
1595
- "type": "object",
1596
- "properties": {
1597
- "params": {
1598
- "type": "object",
1599
- "properties": {
1600
- "code": {
1601
- "type": "string",
1602
- "description": "Five-character device-pairing code. The CLI / MCP shows this to the user, who types it into the dashboard's `/attach` page to confirm the link. Always uppercase alphanumeric; chars `O`/`0` and `I`/`1` are excluded to avoid ambiguity when copied from a terminal.",
1603
- "pattern": "^[A-HJ-NP-Z2-9]{5}$",
1604
- "minLength": 5,
1605
- "maxLength": 5
1606
- }
1607
- },
1608
- "required": [
1609
- "code"
1610
- ],
1611
- "additionalProperties": false
1612
- },
1613
- "query": {
1614
- "type": "object",
1615
- "properties": {
1616
-
1617
- }
1618
- },
1619
- "body": {
1620
- "type": "object"
1621
- }
1622
- },
1623
- "required": [
1624
- "params",
1625
- "query"
1626
- ],
1627
- "additionalProperties": false
1628
- }),
1629
- },
1630
1569
  "GetMe": {
1631
1570
  description: "Get the authenticated user",
1632
1571
  inputSchema: toZod({
@@ -1686,6 +1625,15 @@ export const MCP_TOOLS = {
1686
1625
  "sessions",
1687
1626
  "billing"
1688
1627
  ]
1628
+ },
1629
+ "billing": {
1630
+ "type": "string",
1631
+ "enum": [
1632
+ "success",
1633
+ "cancelled",
1634
+ "changed",
1635
+ "credits"
1636
+ ]
1689
1637
  }
1690
1638
  }
1691
1639
  },
@@ -1770,43 +1718,8 @@ export const MCP_TOOLS = {
1770
1718
  "additionalProperties": false
1771
1719
  }),
1772
1720
  },
1773
- "GetOrgToken": {
1774
- 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.",
1775
- inputSchema: toZod({
1776
- "type": "object",
1777
- "properties": {
1778
- "params": {
1779
- "type": "object",
1780
- "properties": {
1781
- "orgId": {
1782
- "type": "string",
1783
- "format": "uuid"
1784
- }
1785
- },
1786
- "required": [
1787
- "orgId"
1788
- ],
1789
- "additionalProperties": false
1790
- },
1791
- "query": {
1792
- "type": "object",
1793
- "properties": {
1794
-
1795
- }
1796
- },
1797
- "body": {
1798
- "type": "object"
1799
- }
1800
- },
1801
- "required": [
1802
- "params",
1803
- "query"
1804
- ],
1805
- "additionalProperties": false
1806
- }),
1807
- },
1808
- "GetProvider": {
1809
- description: "Get a provider\n\nFetch a single Reclaim provider by id. Returns every field needed\nto integrate it into a flow: domain, the live version (initialUrl + requests),\nand the data points it can prove. Use `providers` first if you only\nhave a query string.\n\nReturns the provider record.\n\n**Canonical URL.** For SEO and stable sharing, the canonical\nHTML URL for a provider is `/providers/{providerId}/{slug}`\n(see `GetProviderBySlug`). HTML callers (`Accept: text/html`)\nthat hit this route — which omits the slug — receive a `301`\nredirect to the slugged URL. JSON callers\n(`Accept: application/json`) receive the body directly without\nredirect; the slug is on the response.\n",
1721
+ "GetProvider": {
1722
+ description: "Get a provider\n\nFetch a single Reclaim provider by id. Returns every field needed\nto integrate it into a flow: domain, the live version (initialUrl + requests),\nand the data points it can prove. Use `providers` first if you only\nhave a query string.\n\nReturns the provider record.\n\n**Canonical URL.** For SEO and stable sharing, the canonical\nHTML URL for a provider is `/providers/{providerId}/{slug}`\n(see `GetProviderBySlug`). HTML callers (`Accept: text/html`)\nthat hit this route — which omits the slug — receive a `301`\nredirect to the slugged URL. JSON callers\n(`Accept: application/json`) receive the body directly without\nredirect; the slug is on the response.\n",
1810
1723
  inputSchema: toZod({
1811
1724
  "type": "object",
1812
1725
  "properties": {
@@ -1882,7 +1795,7 @@ export const MCP_TOOLS = {
1882
1795
  }),
1883
1796
  },
1884
1797
  "GetUser": {
1885
- description: "Get a user's profile\n\nReturns a user record. Visible to: the user themselves, or any member of an organization the subject also belongs to.",
1798
+ description: "Get a user's profile\n\nReturns a user record. Visible to the user themselves, any member of an organization the subject also belongs to, and staff.",
1886
1799
  inputSchema: toZod({
1887
1800
  "type": "object",
1888
1801
  "properties": {
@@ -1953,7 +1866,7 @@ export const MCP_TOOLS = {
1953
1866
  }),
1954
1867
  },
1955
1868
  "IssueOrgToken": {
1956
- 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.",
1869
+ description: "Issue a new organization API key\n\nIssues a fresh per-organization API key (`rorg_…`). The caller must be an active **OWNER** of the organization. An org may hold several keys; issuing a new one does **not** invalidate existing keys (revoke those explicitly). The plaintext key is returned **only once** in this response (the server stores only its HMAC); treat it like a password.",
1957
1870
  inputSchema: toZod({
1958
1871
  "type": "object",
1959
1872
  "properties": {
@@ -2109,6 +2022,41 @@ export const MCP_TOOLS = {
2109
2022
  "additionalProperties": false
2110
2023
  }),
2111
2024
  },
2025
+ "ListOrgTokens": {
2026
+ description: "List the organization's API keys\n\nLists metadata for every API key the organization holds — id, last four characters, when issued, and when last used — never the keys themselves. The caller must be an active **OWNER** of the organization.",
2027
+ inputSchema: toZod({
2028
+ "type": "object",
2029
+ "properties": {
2030
+ "params": {
2031
+ "type": "object",
2032
+ "properties": {
2033
+ "orgId": {
2034
+ "type": "string",
2035
+ "format": "uuid"
2036
+ }
2037
+ },
2038
+ "required": [
2039
+ "orgId"
2040
+ ],
2041
+ "additionalProperties": false
2042
+ },
2043
+ "query": {
2044
+ "type": "object",
2045
+ "properties": {
2046
+
2047
+ }
2048
+ },
2049
+ "body": {
2050
+ "type": "object"
2051
+ }
2052
+ },
2053
+ "required": [
2054
+ "params",
2055
+ "query"
2056
+ ],
2057
+ "additionalProperties": false
2058
+ }),
2059
+ },
2112
2060
  "ListOrgVerificationSessions": {
2113
2061
  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.",
2114
2062
  inputSchema: toZod({
@@ -2511,6 +2459,46 @@ export const MCP_TOOLS = {
2511
2459
  "additionalProperties": false
2512
2460
  }),
2513
2461
  },
2462
+ "RevokeOrgToken": {
2463
+ description: "Revoke one of the organization's API keys\n\nRevokes a single API key by id (leaving the org's other keys intact). The caller must be an active **OWNER** of the organization. The key stops authenticating immediately.",
2464
+ inputSchema: toZod({
2465
+ "type": "object",
2466
+ "properties": {
2467
+ "params": {
2468
+ "type": "object",
2469
+ "properties": {
2470
+ "orgId": {
2471
+ "type": "string",
2472
+ "format": "uuid"
2473
+ },
2474
+ "tokenId": {
2475
+ "type": "string",
2476
+ "format": "uuid"
2477
+ }
2478
+ },
2479
+ "required": [
2480
+ "orgId",
2481
+ "tokenId"
2482
+ ],
2483
+ "additionalProperties": false
2484
+ },
2485
+ "query": {
2486
+ "type": "object",
2487
+ "properties": {
2488
+
2489
+ }
2490
+ },
2491
+ "body": {
2492
+ "type": "object"
2493
+ }
2494
+ },
2495
+ "required": [
2496
+ "params",
2497
+ "query"
2498
+ ],
2499
+ "additionalProperties": false
2500
+ }),
2501
+ },
2514
2502
  "SetOrgKeypair": {
2515
2503
  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.",
2516
2504
  inputSchema: toZod({
@@ -2783,61 +2771,6 @@ export const MCP_TOOLS = {
2783
2771
  "additionalProperties": false
2784
2772
  }),
2785
2773
  },
2786
- "UpdateOrgBilling": {
2787
- description: "Add or update billing details for an organization\n\nOwner only. Upserts the billing row. The first successful call flips every credential linked to this org from `SANDBOX` to `PRODUCTION` (see `Credential.mode`). Subsequent calls update the contact fields without affecting credential mode.",
2788
- inputSchema: toZod({
2789
- "type": "object",
2790
- "properties": {
2791
- "params": {
2792
- "type": "object",
2793
- "properties": {
2794
- "orgId": {
2795
- "type": "string",
2796
- "format": "uuid"
2797
- }
2798
- },
2799
- "required": [
2800
- "orgId"
2801
- ],
2802
- "additionalProperties": false
2803
- },
2804
- "query": {
2805
- "type": "object",
2806
- "properties": {
2807
-
2808
- }
2809
- },
2810
- "body": {
2811
- "type": "object",
2812
- "additionalProperties": false,
2813
- "description": "Body for `PUT /orgs/{orgId}/billing`.",
2814
- "required": [
2815
- "contactEmail",
2816
- "contactName"
2817
- ],
2818
- "properties": {
2819
- "contactEmail": {
2820
- "type": "string",
2821
- "format": "email",
2822
- "minLength": 3,
2823
- "maxLength": 320
2824
- },
2825
- "contactName": {
2826
- "type": "string",
2827
- "minLength": 1,
2828
- "maxLength": 200
2829
- }
2830
- }
2831
- }
2832
- },
2833
- "required": [
2834
- "params",
2835
- "query",
2836
- "body"
2837
- ],
2838
- "additionalProperties": false
2839
- }),
2840
- },
2841
2774
  "UpdateProvider": {
2842
2775
  description: "Update a provider\n\nUpdate a Reclaim provider's metadata. Partial PATCH — pass only fields you want to change. The caller must be an active member of the owning organization. To change the provider's recipe (initialUrl, requests, …) cut a new version via the dashboard. Use `seo` to control how the provider appears in search results and social shares; omit a subfield to keep the server default.\nCaller must be a member of the provider's owning organization. `id`, `orgId`, and `slug` are immutable. Supports optimistic concurrency via `If-Match`.",
2843
2776
  inputSchema: toZod({
@@ -3022,8 +2955,7 @@ export const MCP_TOOLS = {
3022
2955
  "properties": {
3023
2956
  "initialUrl": {
3024
2957
  "type": "string",
3025
- "format": "uri",
3026
- "maxLength": 300
2958
+ "format": "uri"
3027
2959
  },
3028
2960
  "verificationType": {
3029
2961
  "type": "string",
@@ -3193,172 +3125,177 @@ export const MCP_TOOLS = {
3193
3125
  "items": {
3194
3126
  "type": "object",
3195
3127
  "additionalProperties": false,
3196
- "description": "A template for selecting request",
3197
- "allOf": [
3198
- {
3128
+ "description": "A template for selecting requests. Same matcher shape as `RequestSelection`, plus template flags (`multiple`/`required`) and optional `templateParams` expansion.",
3129
+ "required": [
3130
+ "url",
3131
+ "method",
3132
+ "multiple",
3133
+ "required"
3134
+ ],
3135
+ "properties": {
3136
+ "url": {
3137
+ "type": "string",
3138
+ "description": "The URL or generic path of the HTTP request."
3139
+ },
3140
+ "method": {
3141
+ "type": "string",
3142
+ "description": "The HTTP method used for the request.",
3143
+ "enum": [
3144
+ "GET",
3145
+ "POST",
3146
+ "PUT",
3147
+ "PATCH",
3148
+ "DELETE"
3149
+ ]
3150
+ },
3151
+ "requestBodyTemplate": {
3152
+ "type": "string",
3153
+ "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>.*)`.",
3154
+ "maxLength": 100000
3155
+ },
3156
+ "credentials": {
3157
+ "type": "string",
3158
+ "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
3159
+ "enum": [
3160
+ "omit",
3161
+ "same-origin",
3162
+ "include"
3163
+ ]
3164
+ },
3165
+ "writeRedactionMode": {
3166
+ "type": "string",
3167
+ "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.",
3168
+ "enum": [
3169
+ "zk",
3170
+ "key-update"
3171
+ ]
3172
+ },
3173
+ "additionalClientOptions": {
3199
3174
  "type": "object",
3200
3175
  "additionalProperties": false,
3201
- "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.",
3202
- "required": [
3203
- "url",
3204
- "method"
3205
- ],
3176
+ "description": "Apply TLS configuration when creating the tunnel to the attestor.",
3206
3177
  "properties": {
3207
- "url": {
3208
- "type": "string",
3209
- "description": "The URL or generic path of the HTTP request."
3210
- },
3211
- "method": {
3212
- "type": "string",
3213
- "description": "The HTTP method used for the request.",
3214
- "enum": [
3215
- "GET",
3216
- "POST",
3217
- "PUT",
3218
- "PATCH",
3219
- "DELETE"
3220
- ]
3221
- },
3222
- "requestBodyTemplate": {
3223
- "type": "string",
3224
- "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>.*)`.",
3225
- "maxLength": 100000
3226
- },
3227
- "credentials": {
3228
- "type": "string",
3229
- "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.",
3230
- "enum": [
3231
- "omit",
3232
- "same-origin",
3233
- "include"
3234
- ]
3235
- },
3236
- "writeRedactionMode": {
3237
- "type": "string",
3238
- "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.",
3239
- "enum": [
3240
- "zk",
3241
- "key-update"
3242
- ]
3243
- },
3244
- "additionalClientOptions": {
3245
- "type": "object",
3246
- "additionalProperties": false,
3247
- "description": "Apply TLS configuration when creating the tunnel to the attestor.",
3248
- "properties": {
3249
- "supportedProtocolVersions": {
3250
- "type": "array",
3251
- "description": "TLS protocol versions the client is allowed to negotiate.",
3252
- "minItems": 1,
3253
- "uniqueItems": true,
3254
- "items": {
3255
- "type": "string",
3256
- "enum": [
3257
- "TLS1_2",
3258
- "TLS1_3"
3259
- ]
3260
- }
3261
- }
3262
- }
3263
- },
3264
- "responseMatches": {
3178
+ "supportedProtocolVersions": {
3265
3179
  "type": "array",
3266
- "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`.",
3180
+ "description": "TLS protocol versions the client is allowed to negotiate.",
3267
3181
  "minItems": 1,
3182
+ "uniqueItems": true,
3268
3183
  "items": {
3269
- "type": "object",
3270
- "additionalProperties": false,
3271
- "description": "Specifies a rule to match against a string in response to validate proof content.",
3272
- "required": [
3273
- "type",
3274
- "value"
3275
- ],
3276
- "properties": {
3277
- "isOptional": {
3278
- "type": "boolean",
3279
- "description": "If true, the match condition is optional and won't fail if absent",
3280
- "default": false
3281
- },
3282
- "description": {
3283
- "type": "string",
3284
- "description": "The description of the field that is extracted using this match rule",
3285
- "minLength": 1,
3286
- "maxLength": 1000
3287
- },
3288
- "order": {
3289
- "type": "integer",
3290
- "description": "The order in which the field should be displayed to user in UI",
3291
- "minimum": 0
3292
- },
3293
- "type": {
3294
- "type": "string",
3295
- "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
3296
- "enum": [
3297
- "regex",
3298
- "contains"
3299
- ]
3300
- },
3301
- "value": {
3302
- "type": "string",
3303
- "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."
3304
- }
3305
- }
3184
+ "type": "string",
3185
+ "enum": [
3186
+ "TLS1_2",
3187
+ "TLS1_3"
3188
+ ]
3306
3189
  }
3307
- },
3308
- "responseRedactions": {
3309
- "type": "array",
3310
- "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`.",
3311
- "items": {
3312
- "type": "object",
3313
- "additionalProperties": false,
3314
- "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\")",
3315
- "properties": {
3316
- "xPath": {
3317
- "type": "string",
3318
- "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
3319
- },
3320
- "jsonPath": {
3321
- "type": "string",
3322
- "description": "expect a JSON response, retrieve the item at this path using dot notation for e.g. 'email.addresses.0'"
3323
- },
3324
- "regex": {
3325
- "type": "string",
3326
- "description": "select a regex match from the response"
3327
- },
3328
- "hash": {
3329
- "type": "string",
3330
- "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.",
3331
- "enum": [
3332
- "oprf",
3333
- "oprf-mpc",
3334
- "oprf-raw"
3335
- ]
3336
- }
3337
- }
3190
+ }
3191
+ }
3192
+ },
3193
+ "responseMatches": {
3194
+ "type": "array",
3195
+ "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`.",
3196
+ "minItems": 1,
3197
+ "items": {
3198
+ "type": "object",
3199
+ "additionalProperties": false,
3200
+ "description": "Specifies a rule to match against a string in response to validate proof content.",
3201
+ "required": [
3202
+ "type",
3203
+ "value"
3204
+ ],
3205
+ "properties": {
3206
+ "isOptional": {
3207
+ "type": "boolean",
3208
+ "description": "If true, the match condition is optional and won't fail if absent",
3209
+ "default": false
3210
+ },
3211
+ "description": {
3212
+ "type": "string",
3213
+ "description": "The description of the field that is extracted using this match rule",
3214
+ "minLength": 1,
3215
+ "maxLength": 1000
3216
+ },
3217
+ "order": {
3218
+ "type": "integer",
3219
+ "description": "The order in which the field should be displayed to user in UI",
3220
+ "minimum": 0
3221
+ },
3222
+ "type": {
3223
+ "type": "string",
3224
+ "description": "The matching mechanism to use value as against response. Typically regex or simple string containment",
3225
+ "enum": [
3226
+ "regex",
3227
+ "contains"
3228
+ ]
3229
+ },
3230
+ "value": {
3231
+ "type": "string",
3232
+ "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."
3338
3233
  }
3339
3234
  }
3340
3235
  }
3341
3236
  },
3342
- {
3343
- "type": "object",
3344
- "required": [
3345
- "multiple",
3346
- "required"
3347
- ],
3348
- "properties": {
3349
- "multiple": {
3350
- "type": "boolean",
3351
- "description": "If true, the template is allowed for multiple requests. Useful for requests like paginated API calls.",
3352
- "default": true
3353
- },
3354
- "required": {
3355
- "type": "boolean",
3356
- "description": "If true, a request is required to match with this template. If not requests matches this template in proof, then validation fails.",
3357
- "default": true
3237
+ "responseRedactions": {
3238
+ "type": "array",
3239
+ "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`.",
3240
+ "items": {
3241
+ "type": "object",
3242
+ "additionalProperties": false,
3243
+ "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\")",
3244
+ "properties": {
3245
+ "xPath": {
3246
+ "type": "string",
3247
+ "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\""
3248
+ },
3249
+ "jsonPath": {
3250
+ "type": "string",
3251
+ "description": "expect a JSON response, retrieve the item at this path using dot notation for e.g. 'email.addresses.0'"
3252
+ },
3253
+ "regex": {
3254
+ "type": "string",
3255
+ "description": "select a regex match from the response"
3256
+ },
3257
+ "hash": {
3258
+ "type": "string",
3259
+ "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.",
3260
+ "enum": [
3261
+ "oprf",
3262
+ "oprf-mpc",
3263
+ "oprf-raw"
3264
+ ]
3265
+ }
3358
3266
  }
3359
3267
  }
3268
+ },
3269
+ "multiple": {
3270
+ "type": "boolean",
3271
+ "description": "If true, the template is allowed for multiple requests. Useful for requests like paginated API calls.",
3272
+ "default": true
3273
+ },
3274
+ "required": {
3275
+ "type": "boolean",
3276
+ "description": "If true, a request is required to match with this template. If not requests matches this template in proof, then validation fails.",
3277
+ "default": true
3278
+ },
3279
+ "templateParams": {
3280
+ "type": "array",
3281
+ "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.",
3282
+ "maxItems": 50,
3283
+ "items": {
3284
+ "type": "string",
3285
+ "minLength": 1,
3286
+ "maxLength": 100
3287
+ }
3288
+ },
3289
+ "templateParamsMode": {
3290
+ "type": "string",
3291
+ "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.",
3292
+ "enum": [
3293
+ "separate",
3294
+ "merge"
3295
+ ],
3296
+ "default": "separate"
3360
3297
  }
3361
- ]
3298
+ }
3362
3299
  }
3363
3300
  },
3364
3301
  "webSettings": {
@@ -3445,6 +3382,12 @@ export const MCP_TOOLS = {
3445
3382
  }
3446
3383
  }
3447
3384
  }
3385
+ },
3386
+ "extension": {
3387
+ "type": "object",
3388
+ "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.",
3389
+ "maxProperties": 100,
3390
+ "additionalProperties": true
3448
3391
  }
3449
3392
  }
3450
3393
  },