@reclaimprotocol/agent 0.1.28 → 0.1.31

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 (89) hide show
  1. package/README.md +28 -9
  2. package/lib/consts.d.ts +5 -5
  3. package/lib/consts.js +7 -7
  4. package/lib/live/tunnel-watchdog.d.ts +1 -0
  5. package/lib/live/tunnel-watchdog.js +66 -0
  6. package/lib/live/tunnel.d.ts +30 -7
  7. package/lib/live/tunnel.js +217 -40
  8. package/lib/mcp/api/operations.gen.d.ts +12 -0
  9. package/lib/mcp/api/operations.gen.js +537 -59
  10. package/lib/mcp/api/tools.js +27 -5
  11. package/lib/mcp/instructions.js +25 -32
  12. package/lib/mcp/remap_errors.js +6 -0
  13. package/lib/mcp/server.js +2 -8
  14. package/lib/mcp/start.js +3 -5
  15. package/lib/mcp/success-response.d.ts +5 -0
  16. package/lib/mcp/success-response.js +21 -0
  17. package/lib/mcp/tools/agent/attach.js +9 -66
  18. package/lib/mcp/tools/agent/build.d.ts +0 -3
  19. package/lib/mcp/tools/agent/build.js +3 -4
  20. package/lib/mcp/tools/agent/how-it-works.d.ts +5 -15
  21. package/lib/mcp/tools/agent/how-it-works.js +9 -22
  22. package/lib/mcp/tools/agent/live-view.d.ts +1 -15
  23. package/lib/mcp/tools/agent/live-view.js +71 -96
  24. package/lib/mcp/tools/agent/propose.js +7 -23
  25. package/lib/mcp/tools/agent/publish.js +80 -18
  26. package/lib/mcp/tools/agent/session.d.ts +4 -7
  27. package/lib/mcp/tools/agent/session.js +8 -23
  28. package/lib/mcp/tools/verification/result.d.ts +2 -1
  29. package/lib/mcp/tools/verification/result.js +29 -28
  30. package/lib/old/client.d.ts +2 -2
  31. package/lib/old/flag.d.ts +2 -5
  32. package/lib/old/flag.js +2 -5
  33. package/lib/old/instructions.d.ts +1 -1
  34. package/lib/old/instructions.js +1 -1
  35. package/lib/old/to-register.d.ts +4 -3
  36. package/lib/old/tools/publish.js +11 -14
  37. package/lib/proof/attestor-auth.d.ts +9 -1
  38. package/lib/proof/attestor-auth.js +15 -2
  39. package/lib/proof/attestor.d.ts +2 -2
  40. package/lib/proof/attestor.js +20 -2
  41. package/lib/proof/pod-prover.js +1 -1
  42. package/lib/proof/proof-core.d.ts +4 -0
  43. package/lib/proof/proof-core.js +20 -0
  44. package/lib/provider/injection-doc.d.ts +3 -2
  45. package/lib/provider/injection-doc.js +12 -10
  46. package/lib/provider/matcher.js +19 -15
  47. package/lib/provider/to-version.d.ts +3 -0
  48. package/lib/provider/to-version.js +2 -1
  49. package/package.json +3 -3
  50. package/skill/SKILL.builder.md +32 -85
  51. package/skill/SKILL.common.md +38 -22
  52. package/skill/SKILL.old.md +17 -3
  53. package/skill/builder-mode.md +37 -4
  54. package/skill/community-contributions.md +12 -3
  55. package/skill/hash-validation.md +9 -9
  56. package/skill/interception.md +39 -46
  57. package/skill/old-mode.md +13 -0
  58. package/skill/user-script.md +24 -8
  59. package/skill/verification-client-integration.md +130 -0
  60. package/src/consts.ts +9 -7
  61. package/src/mcp/api/operations.gen.ts +539 -59
  62. package/src/mcp/api/tools.ts +38 -7
  63. package/src/mcp/instructions.ts +35 -32
  64. package/src/mcp/remap_errors.ts +6 -0
  65. package/src/mcp/server.ts +2 -8
  66. package/src/mcp/start.ts +3 -5
  67. package/src/mcp/success-response.ts +26 -0
  68. package/src/mcp/tools/agent/attach.ts +9 -71
  69. package/src/mcp/tools/agent/build.ts +4 -7
  70. package/src/mcp/tools/agent/how-it-works.ts +9 -22
  71. package/src/mcp/tools/agent/live-view.ts +76 -116
  72. package/src/mcp/tools/agent/propose.ts +7 -23
  73. package/src/mcp/tools/agent/publish.ts +89 -18
  74. package/src/mcp/tools/agent/session.ts +6 -23
  75. package/src/mcp/tools/verification/result.ts +30 -29
  76. package/src/old/client.ts +2 -2
  77. package/src/old/flag.ts +2 -5
  78. package/src/old/instructions.ts +1 -1
  79. package/src/old/to-register.ts +4 -3
  80. package/src/old/tools/publish.ts +16 -14
  81. package/src/proof/attestor-auth.ts +18 -1
  82. package/src/proof/attestor.ts +24 -3
  83. package/src/proof/pod-prover.ts +1 -1
  84. package/src/proof/proof-core.ts +28 -0
  85. package/src/provider/injection-doc.ts +12 -10
  86. package/src/provider/matcher.ts +25 -17
  87. package/src/provider/to-version.ts +7 -1
  88. package/src/live/cloudflared.ts +0 -348
  89. package/src/live/tunnel.ts +0 -254
@@ -1,7 +1,8 @@
1
1
  // AUTO-GENERATED by packages/app/scripts/mcp-tools-gen.ts
2
- // from packages/app/openapi.yaml.
3
- // Run `npm run openapi:gen --workspace=packages/app`
4
- // to regenerate. Do not edit by hand.
2
+ // from packages/app/openapi.yaml (spec v0.1.0, source sha256:9ba46b5cbd7c).
3
+ // The hash catches drift the version misses (a spec can change without a
4
+ // version bump) — do not remove it as "redundant" with the version.
5
+ // Run `npm run openapi:gen --workspace=packages/app` to regenerate. Do not edit by hand.
5
6
  // @ts-nocheck
6
7
  import { toZod } from "./to-zod.js";
7
8
  export const MCP_TOOLS = {
@@ -62,6 +63,75 @@ export const MCP_TOOLS = {
62
63
  "additionalProperties": false
63
64
  }),
64
65
  },
66
+ "AdminAnalytics": {
67
+ description: "Usage, session, and revenue analytics (admin-only)\n\nAdmin only. Aggregates across every organization over a date window: session outcomes by UTC day, device category, and claimant country; demand per provider, money in by month, and per-org consumption against the plan allowance (including closed periods, which the org-scoped usage endpoint never returns). Defaults to the last 30 days; narrow to one org with `orgId`.",
68
+ inputSchema: toZod({
69
+ "type": "object",
70
+ "properties": {
71
+ "params": {
72
+ "type": "object",
73
+ "properties": {}
74
+ },
75
+ "query": {
76
+ "type": "object",
77
+ "properties": {
78
+ "orgId": {
79
+ "type": "string",
80
+ "minLength": 1,
81
+ "maxLength": 64,
82
+ "pattern": "^[0-9a-fA-F-]+$",
83
+ "description": "An organization id used as a filter. Hyphens are ignored, so it matches with or without them; an id that matches no organization returns nothing."
84
+ },
85
+ "providerSearch": {
86
+ "type": "string",
87
+ "maxLength": 100
88
+ },
89
+ "verificationClientId": {
90
+ "type": "string",
91
+ "minLength": 1,
92
+ "maxLength": 64,
93
+ "pattern": "^[0-9a-fA-F-]+$",
94
+ "description": "A verification client id used as a filter. Hyphens are ignored."
95
+ },
96
+ "from": {
97
+ "type": "string",
98
+ "maxLength": 40,
99
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
100
+ "description": "One end of a date window: either a calendar date (`2026-09-01`, read as UTC midnight) or a full ISO date-time. The date-only form is what a native `<input type=\"date\">` submits, so `format: date-time` alone would reject every filter the dashboard's own form sends."
101
+ },
102
+ "to": {
103
+ "type": "string",
104
+ "maxLength": 40,
105
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
106
+ "description": "One end of a date window: either a calendar date (`2026-09-01`, read as UTC midnight) or a full ISO date-time. The date-only form is what a native `<input type=\"date\">` submits, so `format: date-time` alone would reject every filter the dashboard's own form sends."
107
+ },
108
+ "format": {
109
+ "type": "string",
110
+ "enum": [
111
+ "csv"
112
+ ]
113
+ },
114
+ "section": {
115
+ "type": "string",
116
+ "enum": [
117
+ "providers",
118
+ "revenue",
119
+ "usage"
120
+ ]
121
+ }
122
+ }
123
+ },
124
+ "body": {
125
+ "type": "object"
126
+ }
127
+ },
128
+ "required": [
129
+ "params",
130
+ "query"
131
+ ],
132
+ "additionalProperties": false
133
+ }),
134
+ },
65
135
  "AdminOrgs": {
66
136
  description: "All workspaces (admin-only)\n\nAdmin only. Lists all organizations. Search matches workspace name or any member's email address.",
67
137
  inputSchema: toZod({
@@ -77,6 +147,10 @@ export const MCP_TOOLS = {
77
147
  "q": {
78
148
  "type": "string",
79
149
  "maxLength": 200
150
+ },
151
+ "cursor": {
152
+ "type": "string",
153
+ "maxLength": 500
80
154
  }
81
155
  }
82
156
  },
@@ -137,7 +211,7 @@ export const MCP_TOOLS = {
137
211
  }),
138
212
  },
139
213
  "AdminReviews": {
140
- description: "Pending review queue (admin-only)\n\nAdmin only. Lists all provider versions currently awaiting review (branch = 'in_review'). Use DecideProviderVersionReview to approve or reject each version.",
214
+ description: "Pending review queue (admin-only)\n\nAdmin only. Lists all provider versions currently awaiting review (branch = 'in_review'). Use decide_provider_version_review to approve or reject each version.",
141
215
  inputSchema: toZod({
142
216
  "type": "object",
143
217
  "properties": {
@@ -161,7 +235,7 @@ export const MCP_TOOLS = {
161
235
  }),
162
236
  },
163
237
  "AdminSessions": {
164
- description: "Explore verification sessions (admin-only)\n\nAdmin only. Search verification sessions across all organizations — filter by `sessionId` (prefix match, at least 5 characters), `providerId`, `claimantClientId`, `orgId` (all exact match), `status`, and a `createdAfter`/`createdBefore` time range. Rows link to the org-scoped session detail page (admins can open any org's pages). Capped at 100, newest first.",
238
+ description: "Explore verification sessions (admin-only)\n\nAdmin only. Search verification sessions across all organizations — filter by `sessionId` (prefix match, at least 5 characters), `providerId` (id or slug), `claimantClientId`, `orgId` (all exact match), `status`, and a `createdAfter`/`createdBefore` time range. Rows link to the org-scoped session detail page (admins can open any org's pages). Newest first, 50 per page, with opaque cursor pagination.",
165
239
  inputSchema: toZod({
166
240
  "type": "object",
167
241
  "properties": {
@@ -180,6 +254,17 @@ export const MCP_TOOLS = {
180
254
  "type": "string",
181
255
  "maxLength": 100
182
256
  },
257
+ "verificationClientId": {
258
+ "type": "string",
259
+ "minLength": 1,
260
+ "maxLength": 64,
261
+ "pattern": "^[0-9a-fA-F-]+$",
262
+ "description": "A verification client id used as a filter. Hyphens are ignored."
263
+ },
264
+ "providerSearch": {
265
+ "type": "string",
266
+ "maxLength": 100
267
+ },
183
268
  "claimantClientId": {
184
269
  "type": "string",
185
270
  "maxLength": 100
@@ -207,6 +292,10 @@ export const MCP_TOOLS = {
207
292
  "createdBefore": {
208
293
  "type": "string",
209
294
  "format": "date-time"
295
+ },
296
+ "cursor": {
297
+ "type": "string",
298
+ "maxLength": 500
210
299
  }
211
300
  }
212
301
  },
@@ -408,7 +497,7 @@ export const MCP_TOOLS = {
408
497
  "events": {
409
498
  "type": "array",
410
499
  "minItems": 1,
411
- "maxItems": 50,
500
+ "maxItems": 51,
412
501
  "items": {
413
502
  "type": "string",
414
503
  "description": "Canonical Builder lifecycle event. Names use lower snake case; metadata uses camel case. Provider events include providerId, resolvedVersion, and ordinal. Request events also include requestId. New values are additive, so clients must tolerate unknown response values. For field requirements and funnel semantics, see docs/verification-analytics-events.md.",
@@ -555,7 +644,7 @@ export const MCP_TOOLS = {
555
644
  "events": {
556
645
  "type": "array",
557
646
  "minItems": 1,
558
- "maxItems": 50,
647
+ "maxItems": 51,
559
648
  "items": {
560
649
  "type": "string",
561
650
  "description": "Canonical Builder lifecycle event. Names use lower snake case; metadata uses camel case. Provider events include providerId, resolvedVersion, and ordinal. Request events also include requestId. New values are additive, so clients must tolerate unknown response values. For field requirements and funnel semantics, see docs/verification-analytics-events.md.",
@@ -626,7 +715,7 @@ export const MCP_TOOLS = {
626
715
  }),
627
716
  },
628
717
  "CreateProvider": {
629
- description: "Create a provider\n\nCreate a new Reclaim provider. Use this only after `providers` returned nothing useful for the domain. The caller must be an active member of the target organization.\nCreates a new provider in the specified organization. `visibility` is coerced to `PRIVATE` at creation regardless of what's sent; the author may toggle to `PUBLIC` later via `PATCH /providers/{id}`. While `PRIVATE`, versions go live freely; once `PUBLIC`, non-admin versions need admin review. See `Provider.visibility`.\nThe server also seeds an initial `0.1.0` version on the `draft` branch in the same transaction so the provider is immediately editable. Its `initialUrl` defaults to `https://<domain>`; all other version fields fall back to their schema-declared defaults (a `structured` verificationType, empty requests, empty web settings). `Provider.latestVersion` stays `null` until the draft is promoted to the live channel.",
718
+ description: "Create a provider\n\nCreates a provider in an organization. Call providers first and only create when nothing existing covers the domain. Requires active membership of the target organization. A provider starts empty — add its recipe with create_provider_version.",
630
719
  inputSchema: toZod({
631
720
  "type": "object",
632
721
  "properties": {
@@ -753,7 +842,7 @@ export const MCP_TOOLS = {
753
842
  }),
754
843
  },
755
844
  "CreateProviderVersion": {
756
- description: "Create a new provider version\n\nCreates a new immutable semantic version of the provider. Provider\nauthoring clients must create another version for every content change;\nthey must not edit a previously created version in place. Use a patch\nbump by default, or use a major/minor bump or exact higher version when\nthe user directs it. The starting branch\ndepends on the provider's `visibility` and the caller's role:\n\n- `PRIVATE` provider (any caller): the live channel (no review).\n\n- `PUBLIC` provider, admin caller (Reclaim staff): the live channel\n (no review).\n\n- `PUBLIC` provider, non-admin caller: `draft` (or `ai` if\n authored by the AI assistant). Must pass review (see\n `POST /providers/{id}/versions/{version}/review`) before\n reaching the live channel.\n",
845
+ description: "Create a new provider version\n\nCreates a new immutable semantic version of a provider. Every recipe change needs its own version; existing versions are never edited in place. Defaults to a patch bump. Publish it with publish_provider_version, or submit it for review with submit_provider_version_for_review.",
757
846
  inputSchema: toZod({
758
847
  "type": "object",
759
848
  "properties": {
@@ -1286,6 +1375,144 @@ export const MCP_TOOLS = {
1286
1375
  "type": "string",
1287
1376
  "description": "JavaScript snippets injected into the page which runs before every page load. `window.Reclaim.` APIs are available to these scripts to request actions to the client like claim creation.",
1288
1377
  "maxLength": 1000000
1378
+ },
1379
+ "browserRequestActions": {
1380
+ "type": "array",
1381
+ "description": "Portal-only authenticated browser actions available to `jsUserScripts` through `window.Reclaim.browserRequest`.",
1382
+ "maxItems": 50,
1383
+ "items": {
1384
+ "type": "object",
1385
+ "additionalProperties": false,
1386
+ "description": "A portal-only, provider-declared HTTP action for `window.Reclaim.browserRequest`. The claimant page supplies only the action id and declared primitive inputs; the recipe controls the HTTPS origin, request template, and returned fields. Other Verification Clients currently ignore this field.",
1387
+ "required": [
1388
+ "id",
1389
+ "origin",
1390
+ "path",
1391
+ "method"
1392
+ ],
1393
+ "properties": {
1394
+ "id": {
1395
+ "type": "string",
1396
+ "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,99}$",
1397
+ "minLength": 1,
1398
+ "maxLength": 100
1399
+ },
1400
+ "origin": {
1401
+ "type": "string",
1402
+ "format": "uri",
1403
+ "pattern": "^https://[^/?#]+$",
1404
+ "maxLength": 2000
1405
+ },
1406
+ "path": {
1407
+ "type": "string",
1408
+ "description": "Origin-relative fallback path.",
1409
+ "pattern": "^/(?:$|[^/\\\\][^\\\\]*)$",
1410
+ "maxLength": 4000
1411
+ },
1412
+ "pathTemplate": {
1413
+ "type": "string",
1414
+ "description": "Optional origin-relative path/query template. Declared inputs use `{{name}}` and are URL-encoded.",
1415
+ "pattern": "^/(?:$|[^/\\\\][^\\\\]*)$",
1416
+ "maxLength": 4000
1417
+ },
1418
+ "method": {
1419
+ "type": "string",
1420
+ "enum": [
1421
+ "GET",
1422
+ "POST",
1423
+ "PUT",
1424
+ "PATCH",
1425
+ "DELETE"
1426
+ ]
1427
+ },
1428
+ "transport": {
1429
+ "type": "string",
1430
+ "description": "`fetch` is the default. `navigate` supports GET only and performs a top-level navigation in the action's isolated browser page.",
1431
+ "enum": [
1432
+ "fetch",
1433
+ "navigate"
1434
+ ]
1435
+ },
1436
+ "userAgent": {
1437
+ "type": "string",
1438
+ "description": "Browser User-Agent applied to the isolated action page before its first navigation. Use only when the target origin requires a specific browser identity.",
1439
+ "minLength": 1,
1440
+ "maxLength": 300,
1441
+ "pattern": "^[^\\r\\n]+$"
1442
+ },
1443
+ "omitOriginHeader": {
1444
+ "type": "boolean",
1445
+ "description": "Remove Chromium's automatic Origin header from a fetch action. Unsupported for navigate actions."
1446
+ },
1447
+ "headers": {
1448
+ "type": "object",
1449
+ "maxProperties": 50,
1450
+ "additionalProperties": {
1451
+ "type": "string",
1452
+ "maxLength": 8192
1453
+ }
1454
+ },
1455
+ "headersTemplate": {
1456
+ "type": "object",
1457
+ "description": "Header values may interpolate declared `{{name}}` inputs.",
1458
+ "maxProperties": 50,
1459
+ "additionalProperties": {
1460
+ "type": "string",
1461
+ "maxLength": 8192
1462
+ }
1463
+ },
1464
+ "bodyTemplate": {
1465
+ "type": "string",
1466
+ "description": "JSON template whose `{{name}}` inputs are inserted as JSON literals. The rendered body is limited again at execution time.",
1467
+ "maxLength": 65536
1468
+ },
1469
+ "cookieValueHeader": {
1470
+ "type": "object",
1471
+ "additionalProperties": false,
1472
+ "description": "Copies one same-origin, script-readable cookie into a request header. The cookie value stays inside the verification client's browser.",
1473
+ "required": [
1474
+ "name",
1475
+ "cookieName"
1476
+ ],
1477
+ "properties": {
1478
+ "name": {
1479
+ "type": "string",
1480
+ "minLength": 1,
1481
+ "maxLength": 256
1482
+ },
1483
+ "cookieName": {
1484
+ "type": "string",
1485
+ "minLength": 1,
1486
+ "maxLength": 256
1487
+ }
1488
+ }
1489
+ },
1490
+ "includeBody": {
1491
+ "type": "boolean",
1492
+ "description": "Return the bounded raw response body."
1493
+ },
1494
+ "inputKeys": {
1495
+ "type": "array",
1496
+ "maxItems": 50,
1497
+ "uniqueItems": true,
1498
+ "items": {
1499
+ "type": "string",
1500
+ "pattern": "^[A-Za-z][A-Za-z0-9_]{0,99}$",
1501
+ "maxLength": 100
1502
+ }
1503
+ },
1504
+ "responseFields": {
1505
+ "type": "array",
1506
+ "maxItems": 50,
1507
+ "uniqueItems": true,
1508
+ "items": {
1509
+ "type": "string",
1510
+ "pattern": "^[A-Za-z][A-Za-z0-9_]{0,99}$",
1511
+ "maxLength": 100
1512
+ }
1513
+ }
1514
+ }
1515
+ }
1289
1516
  }
1290
1517
  }
1291
1518
  },
@@ -1311,7 +1538,7 @@ export const MCP_TOOLS = {
1311
1538
  }),
1312
1539
  },
1313
1540
  "CreateVerificationSession": {
1314
- description: "Create a verification session\n\nCreates an end-user verification session. Requires an OrgToken and a callback subscription; pass providers, context, and an optional registered verificationClientUrl. Billing refusal returns 402 or 429 with event billing_required and a terminal sessionId.",
1541
+ description: "Create a verification session\n\nCreates an end-user verification session. Requires an OrgToken and a callback subscription; pass providers, context, and an optional registered verificationClientUrl (omitted: the Portal). Billing refusal returns 402 or 429 with event billing_required and a terminal sessionId.",
1315
1542
  inputSchema: toZod({
1316
1543
  "type": "object",
1317
1544
  "properties": {
@@ -1335,7 +1562,9 @@ export const MCP_TOOLS = {
1335
1562
  "providers": {
1336
1563
  "type": "array",
1337
1564
  "minItems": 1,
1338
- "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.",
1565
+ "maxItems": 20,
1566
+ "uniqueItems": true,
1567
+ "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. Provider version constraints are resolved only while this request is created; clients receive the exact immutable resolved versions and never resolve them again.",
1339
1568
  "items": {
1340
1569
  "type": "object",
1341
1570
  "additionalProperties": false,
@@ -1359,11 +1588,11 @@ export const MCP_TOOLS = {
1359
1588
  "context": {
1360
1589
  "type": "object",
1361
1590
  "additionalProperties": true,
1362
- "description": "Consumer context, shared by all providers. Validated against EACH resolved provider version's `requiredContext` JSON Schema (a 400 is returned on mismatch); extra fields are always allowed. Recipe requests reference these values as `{{context.<key>}}`. To support old DevTools recipes, Builder-mode Verification Clients also use a same-named scalar context value to seed a missing bare `{{key}}` when the recipe doesn't use `{{context.key}}`; an explicit parameter takes precedence. Echoed back (plus `reclaimSessionId`) in the result. Builder-owned `reclaimSessionId` and `attestationNonce` remain context-only."
1591
+ "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 resolve scalar values as `{{context.key}}`, then `{{context_key}}`, then `{{key}}`. A lower-priority alias is used only when the recipe doesn't use a higher-priority spelling; an explicit parameter takes precedence. Echoed back (plus `reclaimSessionId`) in the result. Builder-owned `reclaimSessionId` and `attestationNonce` remain context-only."
1363
1592
  },
1364
1593
  "verificationClientUrl": {
1365
1594
  "type": "string",
1366
- "description": "Optional. Must exactly equal the base URL of a registered verification client (see the `verification_clients` registry / `/admin/verification-clients`). Omit to use the default (`builder`) client. The Builder resolves and stores the registered client UUID, then returns the ready-to-share `verificationUrl` with the session id and `api=2`. A URL that is not a registered client's base is rejected with 400. Consumers append any client-owned redirect parameters after receiving the URL; Builder does not manage them.",
1595
+ "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 (`portals`) client. The Builder resolves and stores the registered client UUID, then returns the ready-to-share `verificationUrl` with the session id and `api=2`. A URL that is not a registered client's base is rejected with 400. Consumers append any client-owned redirect parameters after receiving the URL; Builder does not manage them.",
1367
1596
  "maxLength": 2000,
1368
1597
  "pattern": "^https?://"
1369
1598
  },
@@ -1381,6 +1610,103 @@ export const MCP_TOOLS = {
1381
1610
  "preferAiAgent": {
1382
1611
  "type": "boolean",
1383
1612
  "description": "Legacy-only preference. Builder mode runs the structured recipe and does not enable AI or manual verification. Omit this field for Builder-mode sessions; dual-mode clients may continue to interpret it only on their legacy path."
1613
+ },
1614
+ "diagnostics": {
1615
+ "type": "boolean",
1616
+ "description": "Optional; omit or send false for a normal session. Opts this session into diagnostic mode. A diagnostic session records more event detail, including personal data such as the claimant's IP addresses (see ClaimantDetails.network). Builder appends `diag=1` to the returned `verificationUrl` for a diagnostic session and strips any `diag` value the Consumer's own `verificationClientUrl` carries, so this field — not the URL — is the only way to turn diagnostics on. Treat a diagnostic verification URL as sensitive, and don't hand it to a claimant by default."
1617
+ },
1618
+ "launchOptions": {
1619
+ "type": "object",
1620
+ "additionalProperties": false,
1621
+ "description": "Where a Verification Client sends the claimant's browser at the end of a flow. Builder stores these on the session and returns them unchanged (see VerificationSession.launchOptions / BootstrapVerificationClient) — it never reads them itself, never redirects a claimant to them, and never executes them; only the Verification Client that renders the flow does. Vocabulary matches `reclaim-js-sdk`'s `VerificationRequest` and `reclaim-portal`'s `parseVerificationLaunch`: `redirectUrl`/`redirectUrlOptions` on success, `cancelRedirectUrl`/`cancelRedirectUrlOptions` on cancellation. `https:` only — `javascript:`, `data:`, and any other scheme are rejected with 400 at session creation.",
1622
+ "properties": {
1623
+ "redirectUrl": {
1624
+ "type": "string",
1625
+ "format": "uri",
1626
+ "description": "Where to send the claimant after a successful verification.",
1627
+ "maxLength": 2000,
1628
+ "pattern": "^https://"
1629
+ },
1630
+ "redirectUrlOptions": {
1631
+ "type": "object",
1632
+ "additionalProperties": false,
1633
+ "description": "How a Verification Client performs a launch-options redirect — a plain GET (default) or a form POST/GET carrying extra fields. Matches `reclaim-portal`'s `HttpRedirectionOptions`.",
1634
+ "properties": {
1635
+ "method": {
1636
+ "type": "string",
1637
+ "enum": [
1638
+ "GET",
1639
+ "POST"
1640
+ ]
1641
+ },
1642
+ "body": {
1643
+ "type": "array",
1644
+ "maxItems": 50,
1645
+ "items": {
1646
+ "type": "object",
1647
+ "additionalProperties": false,
1648
+ "required": [
1649
+ "name",
1650
+ "value"
1651
+ ],
1652
+ "properties": {
1653
+ "name": {
1654
+ "type": "string",
1655
+ "maxLength": 256
1656
+ },
1657
+ "value": {
1658
+ "type": "string",
1659
+ "maxLength": 2000
1660
+ }
1661
+ }
1662
+ }
1663
+ }
1664
+ }
1665
+ },
1666
+ "cancelRedirectUrl": {
1667
+ "type": "string",
1668
+ "format": "uri",
1669
+ "description": "Where to send the claimant after a cancelled verification.",
1670
+ "maxLength": 2000,
1671
+ "pattern": "^https://"
1672
+ },
1673
+ "cancelRedirectUrlOptions": {
1674
+ "type": "object",
1675
+ "additionalProperties": false,
1676
+ "description": "How a Verification Client performs a launch-options redirect — a plain GET (default) or a form POST/GET carrying extra fields. Matches `reclaim-portal`'s `HttpRedirectionOptions`.",
1677
+ "properties": {
1678
+ "method": {
1679
+ "type": "string",
1680
+ "enum": [
1681
+ "GET",
1682
+ "POST"
1683
+ ]
1684
+ },
1685
+ "body": {
1686
+ "type": "array",
1687
+ "maxItems": 50,
1688
+ "items": {
1689
+ "type": "object",
1690
+ "additionalProperties": false,
1691
+ "required": [
1692
+ "name",
1693
+ "value"
1694
+ ],
1695
+ "properties": {
1696
+ "name": {
1697
+ "type": "string",
1698
+ "maxLength": 256
1699
+ },
1700
+ "value": {
1701
+ "type": "string",
1702
+ "maxLength": 2000
1703
+ }
1704
+ }
1705
+ }
1706
+ }
1707
+ }
1708
+ }
1709
+ }
1384
1710
  }
1385
1711
  }
1386
1712
  }
@@ -1394,7 +1720,7 @@ export const MCP_TOOLS = {
1394
1720
  }),
1395
1721
  },
1396
1722
  "DecideProviderVersionReview": {
1397
- description: "Record a decision on a provider version review\n\nAdmin only (Reclaim staff). Approves or rejects a provider 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.",
1723
+ description: "Record a decision on a provider version review\n\nApproves or rejects a provider version awaiting review. Admin only. Approval promotes the version to the live channel; rejection moves it to the rejected branch with a reason. Use admin_reviews to find versions waiting on a decision.",
1398
1724
  inputSchema: toZod({
1399
1725
  "type": "object",
1400
1726
  "properties": {
@@ -1602,7 +1928,7 @@ export const MCP_TOOLS = {
1602
1928
  }),
1603
1929
  },
1604
1930
  "DiscoverDataPoints": {
1605
- description: "List the verifiable data points on a website\n\nThe data points existing providers can prove on a website — the menu to pick from before `GET /discover/resolve`. Optionally filter by `q`.",
1931
+ description: "List the verifiable data points on a website\n\nThe data points existing providers can prove on a website — the menu to pick from before discover_resolve. Optionally filter by `q`.",
1606
1932
  inputSchema: toZod({
1607
1933
  "type": "object",
1608
1934
  "properties": {
@@ -1641,7 +1967,7 @@ export const MCP_TOOLS = {
1641
1967
  }),
1642
1968
  },
1643
1969
  "DiscoverResolve": {
1644
- description: "Resolve a website + data points to providers\n\nProvider resolution: given a website and the data points the user wants their users to prove, return the smallest set of existing providers whose data points COVER the selection (greedy combine), the `requiredContext` inputs the consumer must supply, and any `uncovered` points no provider exposes yet (`needsCreation` is true then — author a provider with the agent tools). When the chosen providers can be fused into one (same start page, no clashing page scripts) `merge.mergeable` is true.\n\nAgent flow: pick a website (`GET /discover/data-points` lists what's verifiable there), confirm the data points with the user, call this to get the `providers` + `requiredContext`, collect those context values from the user, then `POST /verifications/sessions` with `providers` (pass every id) and `context` to mint a verification.",
1970
+ description: "Resolve a website + data points to providers\n\nResolves a website plus the data points to prove into the smallest set of existing providers that covers them, with the context inputs each needs. Use after discover_data_points, and before deciding whether to build anything new.",
1645
1971
  inputSchema: toZod({
1646
1972
  "type": "object",
1647
1973
  "properties": {
@@ -1696,7 +2022,7 @@ export const MCP_TOOLS = {
1696
2022
  }),
1697
2023
  },
1698
2024
  "GetMe": {
1699
- description: "Get the authenticated user",
2025
+ description: "Get the authenticated user\n\nGets the authenticated caller's own profile: id, email, and name. Requires a signed-in user session, not an OrgToken. Use it to confirm who the current credentials belong to.",
1700
2026
  inputSchema: toZod({
1701
2027
  "type": "object",
1702
2028
  "properties": {
@@ -1720,7 +2046,7 @@ export const MCP_TOOLS = {
1720
2046
  }),
1721
2047
  },
1722
2048
  "GetOrg": {
1723
- description: "Get an organization",
2049
+ description: "Get an organization\n\nGets one organization: name, kind, status, and members. Requires membership or staff access. Use list_orgs when the id is unknown.",
1724
2050
  inputSchema: toZod({
1725
2051
  "type": "object",
1726
2052
  "properties": {
@@ -1743,14 +2069,73 @@ export const MCP_TOOLS = {
1743
2069
  "tab": {
1744
2070
  "type": "string",
1745
2071
  "enum": [
2072
+ "overview",
1746
2073
  "connect",
2074
+ "integrate",
1747
2075
  "providers",
1748
2076
  "members",
1749
2077
  "themes",
2078
+ "settings",
1750
2079
  "sessions",
1751
2080
  "billing"
1752
2081
  ]
1753
2082
  },
2083
+ "track": {
2084
+ "type": "string",
2085
+ "enum": [
2086
+ "agent",
2087
+ "sdk",
2088
+ "http"
2089
+ ]
2090
+ },
2091
+ "agent": {
2092
+ "type": "string",
2093
+ "enum": [
2094
+ "claude",
2095
+ "cursor",
2096
+ "opencode",
2097
+ "codex",
2098
+ "others"
2099
+ ]
2100
+ },
2101
+ "from": {
2102
+ "type": "string",
2103
+ "maxLength": 40,
2104
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2105
+ "description": "One end of a date window: either a calendar date (`2026-09-01`, read as UTC midnight) or a full ISO date-time. The date-only form is what a native `<input type=\"date\">` submits, so `format: date-time` alone would reject every filter the dashboard's own form sends."
2106
+ },
2107
+ "to": {
2108
+ "type": "string",
2109
+ "maxLength": 40,
2110
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2111
+ "description": "One end of a date window: either a calendar date (`2026-09-01`, read as UTC midnight) or a full ISO date-time. The date-only form is what a native `<input type=\"date\">` submits, so `format: date-time` alone would reject every filter the dashboard's own form sends."
2112
+ },
2113
+ "providerId": {
2114
+ "type": "string",
2115
+ "format": "uuid"
2116
+ },
2117
+ "verificationClientId": {
2118
+ "type": "string",
2119
+ "minLength": 1,
2120
+ "maxLength": 64,
2121
+ "pattern": "^[0-9a-fA-F-]+$",
2122
+ "description": "A verification client id used as a filter. Hyphens are ignored."
2123
+ },
2124
+ "q": {
2125
+ "type": "string",
2126
+ "minLength": 1,
2127
+ "maxLength": 200
2128
+ },
2129
+ "visibility": {
2130
+ "type": "string",
2131
+ "enum": [
2132
+ "PUBLIC",
2133
+ "PRIVATE"
2134
+ ]
2135
+ },
2136
+ "newProvider": {
2137
+ "type": "boolean"
2138
+ },
1754
2139
  "billing": {
1755
2140
  "type": "string",
1756
2141
  "enum": [
@@ -1839,8 +2224,65 @@ export const MCP_TOOLS = {
1839
2224
  "additionalProperties": false
1840
2225
  }),
1841
2226
  },
2227
+ "GetOrgVerificationAnalytics": {
2228
+ description: "Verification outcomes by day, device, and country\n\nShow an organization's verification counts and outcomes by UTC day, claimant device category, and claimant country. Missing telemetry appears in unknown buckets; filter with from and to.",
2229
+ inputSchema: toZod({
2230
+ "type": "object",
2231
+ "properties": {
2232
+ "params": {
2233
+ "type": "object",
2234
+ "properties": {
2235
+ "orgId": {
2236
+ "type": "string",
2237
+ "format": "uuid"
2238
+ }
2239
+ },
2240
+ "required": [
2241
+ "orgId"
2242
+ ],
2243
+ "additionalProperties": false
2244
+ },
2245
+ "query": {
2246
+ "type": "object",
2247
+ "properties": {
2248
+ "from": {
2249
+ "type": "string",
2250
+ "maxLength": 40,
2251
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2252
+ "description": "One end of a date window: either a calendar date (`2026-09-01`, read as UTC midnight) or a full ISO date-time. The date-only form is what a native `<input type=\"date\">` submits, so `format: date-time` alone would reject every filter the dashboard's own form sends."
2253
+ },
2254
+ "to": {
2255
+ "type": "string",
2256
+ "maxLength": 40,
2257
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2258
+ "description": "One end of a date window: either a calendar date (`2026-09-01`, read as UTC midnight) or a full ISO date-time. The date-only form is what a native `<input type=\"date\">` submits, so `format: date-time` alone would reject every filter the dashboard's own form sends."
2259
+ },
2260
+ "providerId": {
2261
+ "type": "string",
2262
+ "format": "uuid"
2263
+ },
2264
+ "verificationClientId": {
2265
+ "type": "string",
2266
+ "minLength": 1,
2267
+ "maxLength": 64,
2268
+ "pattern": "^[0-9a-fA-F-]+$",
2269
+ "description": "A verification client id used as a filter. Hyphens are ignored."
2270
+ }
2271
+ }
2272
+ },
2273
+ "body": {
2274
+ "type": "object"
2275
+ }
2276
+ },
2277
+ "required": [
2278
+ "params",
2279
+ "query"
2280
+ ],
2281
+ "additionalProperties": false
2282
+ }),
2283
+ },
1842
2284
  "GetProvider": {
1843
- 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",
2285
+ description: "Get a provider\n\nGets one provider by id: its domain, live version (initialUrl and requests), and the data points it can prove. Use providers first when only a domain or search term is known.",
1844
2286
  inputSchema: toZod({
1845
2287
  "type": "object",
1846
2288
  "properties": {
@@ -2018,7 +2460,7 @@ export const MCP_TOOLS = {
2018
2460
  }),
2019
2461
  },
2020
2462
  "GetVerificationSession": {
2021
- description: "Get a verification session\n\nGets one verification session. Use it to inspect status, resolved providers, context, Verification Client identity, and expiry. Present the owning organization token or the session's x-reclaim-vc-id.",
2463
+ description: "Get a verification session\n\nGets one verification session. Use it to inspect status, resolved providers, context, Verification Client identity, and expiry. Requires the owning organization token.",
2022
2464
  inputSchema: toZod({
2023
2465
  "type": "object",
2024
2466
  "properties": {
@@ -2040,15 +2482,6 @@ export const MCP_TOOLS = {
2040
2482
  "type": "object",
2041
2483
  "properties": {}
2042
2484
  },
2043
- "headers": {
2044
- "type": "object",
2045
- "properties": {
2046
- "x-reclaim-vc-id": {
2047
- "type": "string",
2048
- "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull."
2049
- }
2050
- }
2051
- },
2052
2485
  "body": {
2053
2486
  "type": "object"
2054
2487
  }
@@ -2215,7 +2648,7 @@ export const MCP_TOOLS = {
2215
2648
  }),
2216
2649
  },
2217
2650
  "ListOrgs": {
2218
- description: "List organizations the caller belongs to",
2651
+ description: "List organizations the caller belongs to\n\nLists the organizations the caller belongs to, personal and shared. Use it first to find an organization id — most other tools take one.",
2219
2652
  inputSchema: toZod({
2220
2653
  "type": "object",
2221
2654
  "properties": {
@@ -2226,9 +2659,17 @@ export const MCP_TOOLS = {
2226
2659
  "query": {
2227
2660
  "type": "object",
2228
2661
  "properties": {
2662
+ "q": {
2663
+ "type": "string",
2664
+ "minLength": 1,
2665
+ "maxLength": 200
2666
+ },
2229
2667
  "cursor": {
2230
2668
  "type": "string",
2231
2669
  "maxLength": 500
2670
+ },
2671
+ "newOrg": {
2672
+ "type": "boolean"
2232
2673
  }
2233
2674
  }
2234
2675
  },
@@ -2276,8 +2717,56 @@ export const MCP_TOOLS = {
2276
2717
  "additionalProperties": false
2277
2718
  }),
2278
2719
  },
2720
+ "ListOrgUsedProviders": {
2721
+ description: "List the providers an organization uses\n\nLists the providers that have verification sessions in an organization, busiest first, with session count and last use. Use it to find a provider id to filter sessions or analytics.",
2722
+ inputSchema: toZod({
2723
+ "type": "object",
2724
+ "properties": {
2725
+ "params": {
2726
+ "type": "object",
2727
+ "properties": {
2728
+ "orgId": {
2729
+ "type": "string",
2730
+ "format": "uuid"
2731
+ }
2732
+ },
2733
+ "required": [
2734
+ "orgId"
2735
+ ],
2736
+ "additionalProperties": false
2737
+ },
2738
+ "query": {
2739
+ "type": "object",
2740
+ "properties": {
2741
+ "q": {
2742
+ "type": "string",
2743
+ "minLength": 1,
2744
+ "maxLength": 200
2745
+ },
2746
+ "cursor": {
2747
+ "type": "string",
2748
+ "maxLength": 500
2749
+ },
2750
+ "limit": {
2751
+ "type": "integer",
2752
+ "minimum": 1,
2753
+ "maximum": 1000
2754
+ }
2755
+ }
2756
+ },
2757
+ "body": {
2758
+ "type": "object"
2759
+ }
2760
+ },
2761
+ "required": [
2762
+ "params",
2763
+ "query"
2764
+ ],
2765
+ "additionalProperties": false
2766
+ }),
2767
+ },
2279
2768
  "ListOrgVerificationSessions": {
2280
- description: "List an organization's verification sessions\n\nReturns verification sessions created under the organization, newest first. Optionally filter by `sessionId` (prefix match, at least 5 characters), `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.",
2769
+ description: "List an organization's verification sessions\n\nLists an organization's verification sessions, newest first, filterable by session id prefix, provider, status, resolved version, claimant, and a created-at range. Use it to find a session id; use get_verification_session for one session in full.",
2281
2770
  inputSchema: toZod({
2282
2771
  "type": "object",
2283
2772
  "properties": {
@@ -2305,6 +2794,13 @@ export const MCP_TOOLS = {
2305
2794
  "type": "string",
2306
2795
  "maxLength": 100
2307
2796
  },
2797
+ "verificationClientId": {
2798
+ "type": "string",
2799
+ "minLength": 1,
2800
+ "maxLength": 64,
2801
+ "pattern": "^[0-9a-fA-F-]+$",
2802
+ "description": "A verification client id used as a filter. Hyphens are ignored."
2803
+ },
2308
2804
  "status": {
2309
2805
  "type": "string",
2310
2806
  "description": "Status of a verification session, derived from its events. New values\nmay be added over time; clients MUST tolerate unknown values in\nresponses.\n\n- `pending`: Created, not yet finished; completable until `expiresAt`.\n\n- `success`: Terminal — `verification_success` recorded.\n\n- `rejected`: Terminal — `verification_rejected` recorded.\n\n- `error`: Terminal — `verification_error` recorded.\n\n- `cancelled`: Terminal — `verification_cancelled` recorded.\n\n- `expired`: `expiresAt` passed before a terminal event; the end-user\n can no longer complete it.",
@@ -2389,7 +2885,7 @@ export const MCP_TOOLS = {
2389
2885
  }),
2390
2886
  },
2391
2887
  "ListVerificationDeliveries": {
2392
- description: "Get the callback delivery status for a session\n\nLists callback delivery attempts for a session. Requires an OrgToken or the session-bound x-reclaim-vc-id. Use after terminal status to diagnose pending, failed, or dead-lettered callbacks; retry failures with retry_verification_callback.",
2888
+ description: "Get the callback delivery status for a session\n\nLists callback delivery attempts for a session. Requires the owning organization's token. Use after terminal status to diagnose pending, failed, or dead-lettered callbacks; retry failures with retry_verification_callback.",
2393
2889
  inputSchema: toZod({
2394
2890
  "type": "object",
2395
2891
  "properties": {
@@ -2411,15 +2907,6 @@ export const MCP_TOOLS = {
2411
2907
  "type": "object",
2412
2908
  "properties": {}
2413
2909
  },
2414
- "headers": {
2415
- "type": "object",
2416
- "properties": {
2417
- "x-reclaim-vc-id": {
2418
- "type": "string",
2419
- "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull."
2420
- }
2421
- }
2422
- },
2423
2910
  "body": {
2424
2911
  "type": "object"
2425
2912
  }
@@ -2432,7 +2919,7 @@ export const MCP_TOOLS = {
2432
2919
  }),
2433
2920
  },
2434
2921
  "ListVerificationEvents": {
2435
- description: "Get the event log for a session\n\nLists append-only lifecycle events for a session. Requires an OrgToken or the session-bound x-reclaim-vc-id. Use after get_verification_session to find the first missing or failed milestone; inspect eventData for failure details.",
2922
+ description: "Get the event log for a session\n\nLists append-only lifecycle events for a session. Requires the owning organization's token. Use after get_verification_session to find the first missing or failed milestone; inspect eventData for failure details.",
2436
2923
  inputSchema: toZod({
2437
2924
  "type": "object",
2438
2925
  "properties": {
@@ -2454,15 +2941,6 @@ export const MCP_TOOLS = {
2454
2941
  "type": "object",
2455
2942
  "properties": {}
2456
2943
  },
2457
- "headers": {
2458
- "type": "object",
2459
- "properties": {
2460
- "x-reclaim-vc-id": {
2461
- "type": "string",
2462
- "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull."
2463
- }
2464
- }
2465
- },
2466
2944
  "body": {
2467
2945
  "type": "object"
2468
2946
  }
@@ -2518,7 +2996,7 @@ export const MCP_TOOLS = {
2518
2996
  }),
2519
2997
  },
2520
2998
  "Providers": {
2521
- description: "Search providers\n\nSearch Reclaim providers by domain or data point. A provider is the recipe an end-user follows to prove something about themselves, such as \"I have N followers on Twitter\".\nCall this BEFORE `create_provider` — most popular domains already have a public provider you can reuse, and creating another one just stacks duplicates.\nReturns a paginated list of the providers the caller can see: public providers to everyone, private providers only to members of the owning organization.",
2999
+ description: "Search providers\n\nSearches existing Reclaim providers by domain or data point. A provider is the recipe an end-user follows to prove something about themselves, such as a follower count or an order history. Call this before create_provider — most popular domains already have one.",
2522
3000
  inputSchema: toZod({
2523
3001
  "type": "object",
2524
3002
  "properties": {
@@ -2562,7 +3040,7 @@ export const MCP_TOOLS = {
2562
3040
  }),
2563
3041
  },
2564
3042
  "PublishProviderVersion": {
2565
- description: "Publish a draft version directly (PRIVATE providers only)\n\nPublishes a provider version on the `draft` branch directly to the live channel (trunk). Only allowed for PRIVATE providers — PUBLIC providers must use the review flow (`POST .../review` → admin decision). On success the version's branch transitions from `draft` to `null` (trunk/live).",
3043
+ description: "Publish a draft version directly (PRIVATE providers only)\n\nPublishes a draft version straight to live. PRIVATE providers only — they need no review. For a PUBLIC provider use submit_provider_version_for_review instead.",
2566
3044
  inputSchema: toZod({
2567
3045
  "type": "object",
2568
3046
  "properties": {
@@ -2611,7 +3089,7 @@ export const MCP_TOOLS = {
2611
3089
  }),
2612
3090
  },
2613
3091
  "RequestPublicListing": {
2614
- description: "Request public listing for a PRIVATE provider\n\nSubmits a PRIVATE provider's latest trunk version for admin review. When approved, the provider's visibility becomes PUBLIC and all future versions require review before going live. Fails if the provider is already PUBLIC or has no live versions.",
3092
+ description: "Request public listing for a PRIVATE provider\n\nAsks Reclaim staff to list a PRIVATE provider publicly. This changes the PROVIDER's visibility, not one version: once approved, every future version needs review. To ship a single version, use publish_provider_version or submit_provider_version_for_review.",
2615
3093
  inputSchema: toZod({
2616
3094
  "type": "object",
2617
3095
  "properties": {
@@ -2726,7 +3204,7 @@ export const MCP_TOOLS = {
2726
3204
  }),
2727
3205
  },
2728
3206
  "SetOrgKeypair": {
2729
- 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.",
3207
+ description: "Set (or rotate) the organization's encryption keypair\n\nSets or rotates the organization's single secp256k1 encryption keypair from its public key, which turns on encrypted result delivery. The private key stays with the caller and is never sent. Rotating makes results encrypted to the previous key undecryptable.",
2730
3208
  inputSchema: toZod({
2731
3209
  "type": "object",
2732
3210
  "properties": {
@@ -2841,7 +3319,7 @@ export const MCP_TOOLS = {
2841
3319
  }),
2842
3320
  },
2843
3321
  "SubmitProviderVersionForReview": {
2844
- description: "Submit a provider version for review\n\nSubmits a provider 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 provider's owning org. Meaningful only on `PUBLIC` providers — on `PRIVATE` providers new versions go to the live channel directly and never need review.",
3322
+ description: "Submit a provider version for review\n\nSubmits a draft or rejected version for admin review, the way a PUBLIC provider's versions go live. On a PRIVATE provider use publish_provider_version instead — those need no review.",
2845
3323
  inputSchema: toZod({
2846
3324
  "type": "object",
2847
3325
  "properties": {
@@ -2890,7 +3368,7 @@ export const MCP_TOOLS = {
2890
3368
  }),
2891
3369
  },
2892
3370
  "TransferProvider": {
2893
- description: "Transfer a provider to a different workspace\n\nAdmin-only. Moves the provider's `orgId` to the supplied workspace; preserves slug, versions, members. SQL function `builder.transfer_provider` enforces the admin gate and target existence atomically.",
3371
+ description: "Transfer a provider to a different workspace\n\nAdmin-only. Moves a provider to a different organization, preserving its slug, versions, and members. Fails if the target organization does not exist.",
2894
3372
  inputSchema: toZod({
2895
3373
  "type": "object",
2896
3374
  "properties": {
@@ -2934,7 +3412,7 @@ export const MCP_TOOLS = {
2934
3412
  }),
2935
3413
  },
2936
3414
  "UpdateOrg": {
2937
- description: "Update an organization\n\nOwner only.",
3415
+ description: "Update an organization\n\nUpdates an organization's name, icon, or status. Owner only, and a partial update — pass only the fields to change. Archiving an organization is a status change, not a delete.",
2938
3416
  inputSchema: toZod({
2939
3417
  "type": "object",
2940
3418
  "properties": {
@@ -2990,7 +3468,7 @@ export const MCP_TOOLS = {
2990
3468
  }),
2991
3469
  },
2992
3470
  "UpdateProvider": {
2993
- 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`.",
3471
+ description: "Update a provider\n\nUpdates a provider's metadata, such as title, description, or tags. Partial update — pass only the fields to change. Requires active membership. To change the recipe (initialUrl or requests), cut a new version with create_provider_version instead.",
2994
3472
  inputSchema: toZod({
2995
3473
  "type": "object",
2996
3474
  "properties": {