@reclaimprotocol/agent 0.1.29 → 0.1.32

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 (91) 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 +548 -59
  10. package/lib/mcp/api/tools.js +27 -5
  11. package/lib/mcp/instructions.js +23 -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/get-provider-info.js +3 -1
  37. package/lib/old/tools/publish.js +11 -14
  38. package/lib/proof/attestor-auth.d.ts +9 -1
  39. package/lib/proof/attestor-auth.js +15 -2
  40. package/lib/proof/attestor.d.ts +2 -2
  41. package/lib/proof/attestor.js +20 -2
  42. package/lib/proof/pod-prover.js +1 -1
  43. package/lib/proof/proof-core.d.ts +4 -0
  44. package/lib/proof/proof-core.js +20 -0
  45. package/lib/provider/injection-doc.d.ts +3 -2
  46. package/lib/provider/injection-doc.js +12 -10
  47. package/lib/provider/matcher.js +19 -15
  48. package/lib/provider/to-version.d.ts +3 -0
  49. package/lib/provider/to-version.js +2 -1
  50. package/package.json +3 -3
  51. package/skill/SKILL.builder.md +44 -86
  52. package/skill/SKILL.common.md +38 -22
  53. package/skill/SKILL.old.md +21 -5
  54. package/skill/builder-mode.md +62 -4
  55. package/skill/community-contributions.md +12 -3
  56. package/skill/hash-validation.md +9 -9
  57. package/skill/interception.md +39 -46
  58. package/skill/old-mode.md +25 -0
  59. package/skill/user-script.md +24 -8
  60. package/skill/verification-client-integration.md +133 -0
  61. package/src/consts.ts +9 -7
  62. package/src/mcp/api/operations.gen.ts +550 -59
  63. package/src/mcp/api/tools.ts +38 -7
  64. package/src/mcp/instructions.ts +33 -32
  65. package/src/mcp/remap_errors.ts +6 -0
  66. package/src/mcp/server.ts +2 -8
  67. package/src/mcp/start.ts +3 -5
  68. package/src/mcp/success-response.ts +26 -0
  69. package/src/mcp/tools/agent/attach.ts +9 -71
  70. package/src/mcp/tools/agent/build.ts +4 -7
  71. package/src/mcp/tools/agent/how-it-works.ts +9 -22
  72. package/src/mcp/tools/agent/live-view.ts +76 -116
  73. package/src/mcp/tools/agent/propose.ts +7 -23
  74. package/src/mcp/tools/agent/publish.ts +89 -18
  75. package/src/mcp/tools/agent/session.ts +6 -23
  76. package/src/mcp/tools/verification/result.ts +30 -29
  77. package/src/old/client.ts +2 -2
  78. package/src/old/flag.ts +2 -5
  79. package/src/old/instructions.ts +1 -1
  80. package/src/old/to-register.ts +4 -3
  81. package/src/old/tools/get-provider-info.ts +3 -1
  82. package/src/old/tools/publish.ts +16 -14
  83. package/src/proof/attestor-auth.ts +18 -1
  84. package/src/proof/attestor.ts +24 -3
  85. package/src/proof/pod-prover.ts +1 -1
  86. package/src/proof/proof-core.ts +28 -0
  87. package/src/provider/injection-doc.ts +12 -10
  88. package/src/provider/matcher.ts +25 -17
  89. package/src/provider/to-version.ts +7 -1
  90. package/src/live/cloudflared.ts +0 -348
  91. 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:099a5bcf4fba).
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
 
7
8
  import { toZod } from './to-zod.ts'
@@ -66,6 +67,77 @@ export const MCP_TOOLS = {
66
67
  "additionalProperties": false
67
68
  }),
68
69
  },
70
+ "AdminAnalytics": {
71
+ 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`.",
72
+ inputSchema: toZod({
73
+ "type": "object",
74
+ "properties": {
75
+ "params": {
76
+ "type": "object",
77
+ "properties": {
78
+
79
+ }
80
+ },
81
+ "query": {
82
+ "type": "object",
83
+ "properties": {
84
+ "orgId": {
85
+ "type": "string",
86
+ "minLength": 1,
87
+ "maxLength": 64,
88
+ "pattern": "^[0-9a-fA-F-]+$",
89
+ "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."
90
+ },
91
+ "providerSearch": {
92
+ "type": "string",
93
+ "maxLength": 100
94
+ },
95
+ "verificationClientId": {
96
+ "type": "string",
97
+ "minLength": 1,
98
+ "maxLength": 64,
99
+ "pattern": "^[0-9a-fA-F-]+$",
100
+ "description": "A verification client id used as a filter. Hyphens are ignored."
101
+ },
102
+ "from": {
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
+ "to": {
109
+ "type": "string",
110
+ "maxLength": 40,
111
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
112
+ "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."
113
+ },
114
+ "format": {
115
+ "type": "string",
116
+ "enum": [
117
+ "csv"
118
+ ]
119
+ },
120
+ "section": {
121
+ "type": "string",
122
+ "enum": [
123
+ "providers",
124
+ "revenue",
125
+ "usage"
126
+ ]
127
+ }
128
+ }
129
+ },
130
+ "body": {
131
+ "type": "object"
132
+ }
133
+ },
134
+ "required": [
135
+ "params",
136
+ "query"
137
+ ],
138
+ "additionalProperties": false
139
+ }),
140
+ },
69
141
  "AdminOrgs": {
70
142
  description: "All workspaces (admin-only)\n\nAdmin only. Lists all organizations. Search matches workspace name or any member's email address.",
71
143
  inputSchema: toZod({
@@ -83,6 +155,10 @@ export const MCP_TOOLS = {
83
155
  "q": {
84
156
  "type": "string",
85
157
  "maxLength": 200
158
+ },
159
+ "cursor": {
160
+ "type": "string",
161
+ "maxLength": 500
86
162
  }
87
163
  }
88
164
  },
@@ -145,7 +221,7 @@ export const MCP_TOOLS = {
145
221
  }),
146
222
  },
147
223
  "AdminReviews": {
148
- 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.",
224
+ 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.",
149
225
  inputSchema: toZod({
150
226
  "type": "object",
151
227
  "properties": {
@@ -173,7 +249,7 @@ export const MCP_TOOLS = {
173
249
  }),
174
250
  },
175
251
  "AdminSessions": {
176
- 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.",
252
+ 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.",
177
253
  inputSchema: toZod({
178
254
  "type": "object",
179
255
  "properties": {
@@ -194,6 +270,17 @@ export const MCP_TOOLS = {
194
270
  "type": "string",
195
271
  "maxLength": 100
196
272
  },
273
+ "verificationClientId": {
274
+ "type": "string",
275
+ "minLength": 1,
276
+ "maxLength": 64,
277
+ "pattern": "^[0-9a-fA-F-]+$",
278
+ "description": "A verification client id used as a filter. Hyphens are ignored."
279
+ },
280
+ "providerSearch": {
281
+ "type": "string",
282
+ "maxLength": 100
283
+ },
197
284
  "claimantClientId": {
198
285
  "type": "string",
199
286
  "maxLength": 100
@@ -221,6 +308,10 @@ export const MCP_TOOLS = {
221
308
  "createdBefore": {
222
309
  "type": "string",
223
310
  "format": "date-time"
311
+ },
312
+ "cursor": {
313
+ "type": "string",
314
+ "maxLength": 500
224
315
  }
225
316
  }
226
317
  },
@@ -430,7 +521,7 @@ export const MCP_TOOLS = {
430
521
  "events": {
431
522
  "type": "array",
432
523
  "minItems": 1,
433
- "maxItems": 50,
524
+ "maxItems": 51,
434
525
  "items": {
435
526
  "type": "string",
436
527
  "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.",
@@ -583,7 +674,7 @@ export const MCP_TOOLS = {
583
674
  "events": {
584
675
  "type": "array",
585
676
  "minItems": 1,
586
- "maxItems": 50,
677
+ "maxItems": 51,
587
678
  "items": {
588
679
  "type": "string",
589
680
  "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.",
@@ -654,7 +745,7 @@ export const MCP_TOOLS = {
654
745
  }),
655
746
  },
656
747
  "CreateProvider": {
657
- 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.",
748
+ 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.",
658
749
  inputSchema: toZod({
659
750
  "type": "object",
660
751
  "properties": {
@@ -787,7 +878,7 @@ export const MCP_TOOLS = {
787
878
  }),
788
879
  },
789
880
  "CreateProviderVersion": {
790
- 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",
881
+ 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.",
791
882
  inputSchema: toZod({
792
883
  "type": "object",
793
884
  "properties": {
@@ -1326,6 +1417,144 @@ export const MCP_TOOLS = {
1326
1417
  "type": "string",
1327
1418
  "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.",
1328
1419
  "maxLength": 1000000
1420
+ },
1421
+ "browserRequestActions": {
1422
+ "type": "array",
1423
+ "description": "Portal-only authenticated browser actions available to `jsUserScripts` through `window.Reclaim.browserRequest`.",
1424
+ "maxItems": 50,
1425
+ "items": {
1426
+ "type": "object",
1427
+ "additionalProperties": false,
1428
+ "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.",
1429
+ "required": [
1430
+ "id",
1431
+ "origin",
1432
+ "path",
1433
+ "method"
1434
+ ],
1435
+ "properties": {
1436
+ "id": {
1437
+ "type": "string",
1438
+ "pattern": "^[A-Za-z][A-Za-z0-9_-]{0,99}$",
1439
+ "minLength": 1,
1440
+ "maxLength": 100
1441
+ },
1442
+ "origin": {
1443
+ "type": "string",
1444
+ "format": "uri",
1445
+ "pattern": "^https://[^/?#]+$",
1446
+ "maxLength": 2000
1447
+ },
1448
+ "path": {
1449
+ "type": "string",
1450
+ "description": "Origin-relative fallback path.",
1451
+ "pattern": "^/(?:$|[^/\\\\][^\\\\]*)$",
1452
+ "maxLength": 4000
1453
+ },
1454
+ "pathTemplate": {
1455
+ "type": "string",
1456
+ "description": "Optional origin-relative path/query template. Declared inputs use `{{name}}` and are URL-encoded.",
1457
+ "pattern": "^/(?:$|[^/\\\\][^\\\\]*)$",
1458
+ "maxLength": 4000
1459
+ },
1460
+ "method": {
1461
+ "type": "string",
1462
+ "enum": [
1463
+ "GET",
1464
+ "POST",
1465
+ "PUT",
1466
+ "PATCH",
1467
+ "DELETE"
1468
+ ]
1469
+ },
1470
+ "transport": {
1471
+ "type": "string",
1472
+ "description": "`fetch` is the default. `navigate` supports GET only and performs a top-level navigation in the action's isolated browser page.",
1473
+ "enum": [
1474
+ "fetch",
1475
+ "navigate"
1476
+ ]
1477
+ },
1478
+ "userAgent": {
1479
+ "type": "string",
1480
+ "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.",
1481
+ "minLength": 1,
1482
+ "maxLength": 300,
1483
+ "pattern": "^[^\\r\\n]+$"
1484
+ },
1485
+ "omitOriginHeader": {
1486
+ "type": "boolean",
1487
+ "description": "Remove Chromium's automatic Origin header from a fetch action. Unsupported for navigate actions."
1488
+ },
1489
+ "headers": {
1490
+ "type": "object",
1491
+ "maxProperties": 50,
1492
+ "additionalProperties": {
1493
+ "type": "string",
1494
+ "maxLength": 8192
1495
+ }
1496
+ },
1497
+ "headersTemplate": {
1498
+ "type": "object",
1499
+ "description": "Header values may interpolate declared `{{name}}` inputs.",
1500
+ "maxProperties": 50,
1501
+ "additionalProperties": {
1502
+ "type": "string",
1503
+ "maxLength": 8192
1504
+ }
1505
+ },
1506
+ "bodyTemplate": {
1507
+ "type": "string",
1508
+ "description": "JSON template whose `{{name}}` inputs are inserted as JSON literals. The rendered body is limited again at execution time.",
1509
+ "maxLength": 65536
1510
+ },
1511
+ "cookieValueHeader": {
1512
+ "type": "object",
1513
+ "additionalProperties": false,
1514
+ "description": "Copies one same-origin, script-readable cookie into a request header. The cookie value stays inside the verification client's browser.",
1515
+ "required": [
1516
+ "name",
1517
+ "cookieName"
1518
+ ],
1519
+ "properties": {
1520
+ "name": {
1521
+ "type": "string",
1522
+ "minLength": 1,
1523
+ "maxLength": 256
1524
+ },
1525
+ "cookieName": {
1526
+ "type": "string",
1527
+ "minLength": 1,
1528
+ "maxLength": 256
1529
+ }
1530
+ }
1531
+ },
1532
+ "includeBody": {
1533
+ "type": "boolean",
1534
+ "description": "Return the bounded raw response body."
1535
+ },
1536
+ "inputKeys": {
1537
+ "type": "array",
1538
+ "maxItems": 50,
1539
+ "uniqueItems": true,
1540
+ "items": {
1541
+ "type": "string",
1542
+ "pattern": "^[A-Za-z][A-Za-z0-9_]{0,99}$",
1543
+ "maxLength": 100
1544
+ }
1545
+ },
1546
+ "responseFields": {
1547
+ "type": "array",
1548
+ "maxItems": 50,
1549
+ "uniqueItems": true,
1550
+ "items": {
1551
+ "type": "string",
1552
+ "pattern": "^[A-Za-z][A-Za-z0-9_]{0,99}$",
1553
+ "maxLength": 100
1554
+ }
1555
+ }
1556
+ }
1557
+ }
1329
1558
  }
1330
1559
  }
1331
1560
  },
@@ -1351,7 +1580,7 @@ export const MCP_TOOLS = {
1351
1580
  }),
1352
1581
  },
1353
1582
  "CreateVerificationSession": {
1354
- 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.",
1583
+ 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.",
1355
1584
  inputSchema: toZod({
1356
1585
  "type": "object",
1357
1586
  "properties": {
@@ -1379,7 +1608,9 @@ export const MCP_TOOLS = {
1379
1608
  "providers": {
1380
1609
  "type": "array",
1381
1610
  "minItems": 1,
1382
- "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.",
1611
+ "maxItems": 20,
1612
+ "uniqueItems": true,
1613
+ "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.",
1383
1614
  "items": {
1384
1615
  "type": "object",
1385
1616
  "additionalProperties": false,
@@ -1403,11 +1634,11 @@ export const MCP_TOOLS = {
1403
1634
  "context": {
1404
1635
  "type": "object",
1405
1636
  "additionalProperties": true,
1406
- "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."
1637
+ "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."
1407
1638
  },
1408
1639
  "verificationClientUrl": {
1409
1640
  "type": "string",
1410
- "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.",
1641
+ "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.",
1411
1642
  "maxLength": 2000,
1412
1643
  "pattern": "^https?://"
1413
1644
  },
@@ -1425,6 +1656,103 @@ export const MCP_TOOLS = {
1425
1656
  "preferAiAgent": {
1426
1657
  "type": "boolean",
1427
1658
  "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."
1659
+ },
1660
+ "diagnostics": {
1661
+ "type": "boolean",
1662
+ "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."
1663
+ },
1664
+ "launchOptions": {
1665
+ "type": "object",
1666
+ "additionalProperties": false,
1667
+ "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.",
1668
+ "properties": {
1669
+ "redirectUrl": {
1670
+ "type": "string",
1671
+ "format": "uri",
1672
+ "description": "Where to send the claimant after a successful verification.",
1673
+ "maxLength": 2000,
1674
+ "pattern": "^https://"
1675
+ },
1676
+ "redirectUrlOptions": {
1677
+ "type": "object",
1678
+ "additionalProperties": false,
1679
+ "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`.",
1680
+ "properties": {
1681
+ "method": {
1682
+ "type": "string",
1683
+ "enum": [
1684
+ "GET",
1685
+ "POST"
1686
+ ]
1687
+ },
1688
+ "body": {
1689
+ "type": "array",
1690
+ "maxItems": 50,
1691
+ "items": {
1692
+ "type": "object",
1693
+ "additionalProperties": false,
1694
+ "required": [
1695
+ "name",
1696
+ "value"
1697
+ ],
1698
+ "properties": {
1699
+ "name": {
1700
+ "type": "string",
1701
+ "maxLength": 256
1702
+ },
1703
+ "value": {
1704
+ "type": "string",
1705
+ "maxLength": 2000
1706
+ }
1707
+ }
1708
+ }
1709
+ }
1710
+ }
1711
+ },
1712
+ "cancelRedirectUrl": {
1713
+ "type": "string",
1714
+ "format": "uri",
1715
+ "description": "Where to send the claimant after a cancelled verification.",
1716
+ "maxLength": 2000,
1717
+ "pattern": "^https://"
1718
+ },
1719
+ "cancelRedirectUrlOptions": {
1720
+ "type": "object",
1721
+ "additionalProperties": false,
1722
+ "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`.",
1723
+ "properties": {
1724
+ "method": {
1725
+ "type": "string",
1726
+ "enum": [
1727
+ "GET",
1728
+ "POST"
1729
+ ]
1730
+ },
1731
+ "body": {
1732
+ "type": "array",
1733
+ "maxItems": 50,
1734
+ "items": {
1735
+ "type": "object",
1736
+ "additionalProperties": false,
1737
+ "required": [
1738
+ "name",
1739
+ "value"
1740
+ ],
1741
+ "properties": {
1742
+ "name": {
1743
+ "type": "string",
1744
+ "maxLength": 256
1745
+ },
1746
+ "value": {
1747
+ "type": "string",
1748
+ "maxLength": 2000
1749
+ }
1750
+ }
1751
+ }
1752
+ }
1753
+ }
1754
+ }
1755
+ }
1428
1756
  }
1429
1757
  }
1430
1758
  }
@@ -1438,7 +1766,7 @@ export const MCP_TOOLS = {
1438
1766
  }),
1439
1767
  },
1440
1768
  "DecideProviderVersionReview": {
1441
- 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.",
1769
+ 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.",
1442
1770
  inputSchema: toZod({
1443
1771
  "type": "object",
1444
1772
  "properties": {
@@ -1656,7 +1984,7 @@ export const MCP_TOOLS = {
1656
1984
  }),
1657
1985
  },
1658
1986
  "DiscoverDataPoints": {
1659
- 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`.",
1987
+ 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`.",
1660
1988
  inputSchema: toZod({
1661
1989
  "type": "object",
1662
1990
  "properties": {
@@ -1697,7 +2025,7 @@ export const MCP_TOOLS = {
1697
2025
  }),
1698
2026
  },
1699
2027
  "DiscoverResolve": {
1700
- 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.",
2028
+ 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.",
1701
2029
  inputSchema: toZod({
1702
2030
  "type": "object",
1703
2031
  "properties": {
@@ -1754,7 +2082,7 @@ export const MCP_TOOLS = {
1754
2082
  }),
1755
2083
  },
1756
2084
  "GetMe": {
1757
- description: "Get the authenticated user",
2085
+ 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.",
1758
2086
  inputSchema: toZod({
1759
2087
  "type": "object",
1760
2088
  "properties": {
@@ -1782,7 +2110,7 @@ export const MCP_TOOLS = {
1782
2110
  }),
1783
2111
  },
1784
2112
  "GetOrg": {
1785
- description: "Get an organization",
2113
+ 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.",
1786
2114
  inputSchema: toZod({
1787
2115
  "type": "object",
1788
2116
  "properties": {
@@ -1805,14 +2133,84 @@ export const MCP_TOOLS = {
1805
2133
  "tab": {
1806
2134
  "type": "string",
1807
2135
  "enum": [
2136
+ "overview",
1808
2137
  "connect",
2138
+ "integrate",
1809
2139
  "providers",
1810
2140
  "members",
1811
2141
  "themes",
2142
+ "settings",
1812
2143
  "sessions",
1813
2144
  "billing"
1814
2145
  ]
1815
2146
  },
2147
+ "track": {
2148
+ "type": "string",
2149
+ "enum": [
2150
+ "agent",
2151
+ "sdk",
2152
+ "http"
2153
+ ]
2154
+ },
2155
+ "agent": {
2156
+ "type": "string",
2157
+ "enum": [
2158
+ "claude",
2159
+ "cursor",
2160
+ "opencode",
2161
+ "codex",
2162
+ "others"
2163
+ ]
2164
+ },
2165
+ "providerId": {
2166
+ "type": "string",
2167
+ "format": "uuid"
2168
+ },
2169
+ "client": {
2170
+ "type": "string",
2171
+ "enum": [
2172
+ "auto",
2173
+ "portals",
2174
+ "verifier-app",
2175
+ "reclaim-browser-extension",
2176
+ "builder",
2177
+ "inapp-sdk"
2178
+ ]
2179
+ },
2180
+ "from": {
2181
+ "type": "string",
2182
+ "maxLength": 40,
2183
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2184
+ "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."
2185
+ },
2186
+ "to": {
2187
+ "type": "string",
2188
+ "maxLength": 40,
2189
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2190
+ "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."
2191
+ },
2192
+ "verificationClientId": {
2193
+ "type": "string",
2194
+ "minLength": 1,
2195
+ "maxLength": 64,
2196
+ "pattern": "^[0-9a-fA-F-]+$",
2197
+ "description": "A verification client id used as a filter. Hyphens are ignored."
2198
+ },
2199
+ "q": {
2200
+ "type": "string",
2201
+ "minLength": 1,
2202
+ "maxLength": 200
2203
+ },
2204
+ "visibility": {
2205
+ "type": "string",
2206
+ "enum": [
2207
+ "PUBLIC",
2208
+ "PRIVATE"
2209
+ ]
2210
+ },
2211
+ "newProvider": {
2212
+ "type": "boolean"
2213
+ },
1816
2214
  "billing": {
1817
2215
  "type": "string",
1818
2216
  "enum": [
@@ -1905,8 +2303,65 @@ export const MCP_TOOLS = {
1905
2303
  "additionalProperties": false
1906
2304
  }),
1907
2305
  },
2306
+ "GetOrgVerificationAnalytics": {
2307
+ 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.",
2308
+ inputSchema: toZod({
2309
+ "type": "object",
2310
+ "properties": {
2311
+ "params": {
2312
+ "type": "object",
2313
+ "properties": {
2314
+ "orgId": {
2315
+ "type": "string",
2316
+ "format": "uuid"
2317
+ }
2318
+ },
2319
+ "required": [
2320
+ "orgId"
2321
+ ],
2322
+ "additionalProperties": false
2323
+ },
2324
+ "query": {
2325
+ "type": "object",
2326
+ "properties": {
2327
+ "from": {
2328
+ "type": "string",
2329
+ "maxLength": 40,
2330
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2331
+ "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."
2332
+ },
2333
+ "to": {
2334
+ "type": "string",
2335
+ "maxLength": 40,
2336
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2337
+ "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."
2338
+ },
2339
+ "providerId": {
2340
+ "type": "string",
2341
+ "format": "uuid"
2342
+ },
2343
+ "verificationClientId": {
2344
+ "type": "string",
2345
+ "minLength": 1,
2346
+ "maxLength": 64,
2347
+ "pattern": "^[0-9a-fA-F-]+$",
2348
+ "description": "A verification client id used as a filter. Hyphens are ignored."
2349
+ }
2350
+ }
2351
+ },
2352
+ "body": {
2353
+ "type": "object"
2354
+ }
2355
+ },
2356
+ "required": [
2357
+ "params",
2358
+ "query"
2359
+ ],
2360
+ "additionalProperties": false
2361
+ }),
2362
+ },
1908
2363
  "GetProvider": {
1909
- 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",
2364
+ 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.",
1910
2365
  inputSchema: toZod({
1911
2366
  "type": "object",
1912
2367
  "properties": {
@@ -2090,7 +2545,7 @@ export const MCP_TOOLS = {
2090
2545
  }),
2091
2546
  },
2092
2547
  "GetVerificationSession": {
2093
- 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.",
2548
+ 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.",
2094
2549
  inputSchema: toZod({
2095
2550
  "type": "object",
2096
2551
  "properties": {
@@ -2114,15 +2569,6 @@ export const MCP_TOOLS = {
2114
2569
 
2115
2570
  }
2116
2571
  },
2117
- "headers": {
2118
- "type": "object",
2119
- "properties": {
2120
- "x-reclaim-vc-id": {
2121
- "type": "string",
2122
- "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."
2123
- }
2124
- }
2125
- },
2126
2572
  "body": {
2127
2573
  "type": "object"
2128
2574
  }
@@ -2305,7 +2751,7 @@ export const MCP_TOOLS = {
2305
2751
  }),
2306
2752
  },
2307
2753
  "ListOrgs": {
2308
- description: "List organizations the caller belongs to",
2754
+ 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.",
2309
2755
  inputSchema: toZod({
2310
2756
  "type": "object",
2311
2757
  "properties": {
@@ -2318,9 +2764,17 @@ export const MCP_TOOLS = {
2318
2764
  "query": {
2319
2765
  "type": "object",
2320
2766
  "properties": {
2767
+ "q": {
2768
+ "type": "string",
2769
+ "minLength": 1,
2770
+ "maxLength": 200
2771
+ },
2321
2772
  "cursor": {
2322
2773
  "type": "string",
2323
2774
  "maxLength": 500
2775
+ },
2776
+ "newOrg": {
2777
+ "type": "boolean"
2324
2778
  }
2325
2779
  }
2326
2780
  },
@@ -2370,8 +2824,56 @@ export const MCP_TOOLS = {
2370
2824
  "additionalProperties": false
2371
2825
  }),
2372
2826
  },
2827
+ "ListOrgUsedProviders": {
2828
+ 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.",
2829
+ inputSchema: toZod({
2830
+ "type": "object",
2831
+ "properties": {
2832
+ "params": {
2833
+ "type": "object",
2834
+ "properties": {
2835
+ "orgId": {
2836
+ "type": "string",
2837
+ "format": "uuid"
2838
+ }
2839
+ },
2840
+ "required": [
2841
+ "orgId"
2842
+ ],
2843
+ "additionalProperties": false
2844
+ },
2845
+ "query": {
2846
+ "type": "object",
2847
+ "properties": {
2848
+ "q": {
2849
+ "type": "string",
2850
+ "minLength": 1,
2851
+ "maxLength": 200
2852
+ },
2853
+ "cursor": {
2854
+ "type": "string",
2855
+ "maxLength": 500
2856
+ },
2857
+ "limit": {
2858
+ "type": "integer",
2859
+ "minimum": 1,
2860
+ "maximum": 1000
2861
+ }
2862
+ }
2863
+ },
2864
+ "body": {
2865
+ "type": "object"
2866
+ }
2867
+ },
2868
+ "required": [
2869
+ "params",
2870
+ "query"
2871
+ ],
2872
+ "additionalProperties": false
2873
+ }),
2874
+ },
2373
2875
  "ListOrgVerificationSessions": {
2374
- 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.",
2876
+ 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.",
2375
2877
  inputSchema: toZod({
2376
2878
  "type": "object",
2377
2879
  "properties": {
@@ -2399,6 +2901,13 @@ export const MCP_TOOLS = {
2399
2901
  "type": "string",
2400
2902
  "maxLength": 100
2401
2903
  },
2904
+ "verificationClientId": {
2905
+ "type": "string",
2906
+ "minLength": 1,
2907
+ "maxLength": 64,
2908
+ "pattern": "^[0-9a-fA-F-]+$",
2909
+ "description": "A verification client id used as a filter. Hyphens are ignored."
2910
+ },
2402
2911
  "status": {
2403
2912
  "type": "string",
2404
2913
  "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.",
@@ -2483,7 +2992,7 @@ export const MCP_TOOLS = {
2483
2992
  }),
2484
2993
  },
2485
2994
  "ListVerificationDeliveries": {
2486
- 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.",
2995
+ 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.",
2487
2996
  inputSchema: toZod({
2488
2997
  "type": "object",
2489
2998
  "properties": {
@@ -2507,15 +3016,6 @@ export const MCP_TOOLS = {
2507
3016
 
2508
3017
  }
2509
3018
  },
2510
- "headers": {
2511
- "type": "object",
2512
- "properties": {
2513
- "x-reclaim-vc-id": {
2514
- "type": "string",
2515
- "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."
2516
- }
2517
- }
2518
- },
2519
3019
  "body": {
2520
3020
  "type": "object"
2521
3021
  }
@@ -2528,7 +3028,7 @@ export const MCP_TOOLS = {
2528
3028
  }),
2529
3029
  },
2530
3030
  "ListVerificationEvents": {
2531
- 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.",
3031
+ 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.",
2532
3032
  inputSchema: toZod({
2533
3033
  "type": "object",
2534
3034
  "properties": {
@@ -2552,15 +3052,6 @@ export const MCP_TOOLS = {
2552
3052
 
2553
3053
  }
2554
3054
  },
2555
- "headers": {
2556
- "type": "object",
2557
- "properties": {
2558
- "x-reclaim-vc-id": {
2559
- "type": "string",
2560
- "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."
2561
- }
2562
- }
2563
- },
2564
3055
  "body": {
2565
3056
  "type": "object"
2566
3057
  }
@@ -2618,7 +3109,7 @@ export const MCP_TOOLS = {
2618
3109
  }),
2619
3110
  },
2620
3111
  "Providers": {
2621
- 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.",
3112
+ 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.",
2622
3113
  inputSchema: toZod({
2623
3114
  "type": "object",
2624
3115
  "properties": {
@@ -2664,7 +3155,7 @@ export const MCP_TOOLS = {
2664
3155
  }),
2665
3156
  },
2666
3157
  "PublishProviderVersion": {
2667
- 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).",
3158
+ 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.",
2668
3159
  inputSchema: toZod({
2669
3160
  "type": "object",
2670
3161
  "properties": {
@@ -2715,7 +3206,7 @@ export const MCP_TOOLS = {
2715
3206
  }),
2716
3207
  },
2717
3208
  "RequestPublicListing": {
2718
- 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.",
3209
+ 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.",
2719
3210
  inputSchema: toZod({
2720
3211
  "type": "object",
2721
3212
  "properties": {
@@ -2836,7 +3327,7 @@ export const MCP_TOOLS = {
2836
3327
  }),
2837
3328
  },
2838
3329
  "SetOrgKeypair": {
2839
- 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.",
3330
+ 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.",
2840
3331
  inputSchema: toZod({
2841
3332
  "type": "object",
2842
3333
  "properties": {
@@ -2953,7 +3444,7 @@ export const MCP_TOOLS = {
2953
3444
  }),
2954
3445
  },
2955
3446
  "SubmitProviderVersionForReview": {
2956
- 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.",
3447
+ 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.",
2957
3448
  inputSchema: toZod({
2958
3449
  "type": "object",
2959
3450
  "properties": {
@@ -3004,7 +3495,7 @@ export const MCP_TOOLS = {
3004
3495
  }),
3005
3496
  },
3006
3497
  "TransferProvider": {
3007
- 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.",
3498
+ 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.",
3008
3499
  inputSchema: toZod({
3009
3500
  "type": "object",
3010
3501
  "properties": {
@@ -3050,7 +3541,7 @@ export const MCP_TOOLS = {
3050
3541
  }),
3051
3542
  },
3052
3543
  "UpdateOrg": {
3053
- description: "Update an organization\n\nOwner only.",
3544
+ 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.",
3054
3545
  inputSchema: toZod({
3055
3546
  "type": "object",
3056
3547
  "properties": {
@@ -3108,7 +3599,7 @@ export const MCP_TOOLS = {
3108
3599
  }),
3109
3600
  },
3110
3601
  "UpdateProvider": {
3111
- 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`.",
3602
+ 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.",
3112
3603
  inputSchema: toZod({
3113
3604
  "type": "object",
3114
3605
  "properties": {