@reclaimprotocol/agent 0.1.31 → 0.1.33

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.
@@ -367,7 +367,10 @@ developer it's awaiting admin review.
367
367
  context params — for example, `context: { "username": "…" }` in
368
368
  `create_verification_session`. Quote the `requiredContext` from the created
369
369
  version verbatim — a session missing those fields gets a 400, and verification
370
- matches the supplied values exactly.
370
+ matches the supplied values exactly. Then ask once how they want to use it —
371
+ try it now here, integrate it into an existing backend or frontend, or create a
372
+ new app — unless they already said (see "Using a provider" in the server
373
+ instructions).
371
374
 
372
375
  **6. If the response includes `_notes` for an attached browser, follow them for
373
376
  an optional authenticated-state retest.** Only when its profile is still signed
@@ -391,9 +394,18 @@ use, run the same flow the Discover UI does:
391
394
  3. `discover_resolve({ domain, dataPoints })` → the smallest provider set
392
395
  (`providers`, greedy combine), the `requiredContext` inputs to collect, and
393
396
  any `uncovered` points (author those with the flow above, then re-resolve).
394
- 4. `create_verification_session({ providers: [{ providerId }, …], context,
397
+ 4. Resolved providers are published and usable as-is: don't capture, replay,
398
+ or prove them unless the developer asks you to check or test one. Ask once
399
+ whether they just want to try them or want them in an app — just try it
400
+ now, integrate into an existing backend or frontend (this directory or
401
+ another path), or create a new app — unless they already said.
402
+ 5. Just try it (no app, callback, or client package) →
403
+ `create_verification_session({ providers: [{ providerId }, …], context,
395
404
  verificationClientUrl })` with EVERY resolved provider id and the collected
396
- context.
405
+ context, give them `verificationUrl`, poll `get_verification_session` until
406
+ it is terminal, and report the outcome with `get_verification_result`
407
+ (builder-mode instructions cover the org key and temporary callback).
408
+ Integrate or new app → topic `integration`.
397
409
 
398
410
  `merge.mergeable` only signals the set *could* collapse into one provider — you
399
411
  still pass them all; the Builder runs them in one session.
@@ -318,8 +318,10 @@ applies them.
318
318
  would fetch. Reads the public production SDK backend directly, no auth.
319
319
 
320
320
  There's no create-then-version step and no org / public-review workflow here.
321
- When done, tell the developer the version is live and that they can integrate
322
- using the `providerId`.
321
+ When done, tell the developer the version is live, then ask once how they want
322
+ to use it — try it now, integrate it into an existing backend or frontend, or
323
+ create a new app — unless they already said (see "Using a provider" in the
324
+ server instructions).
323
325
 
324
326
  **If the response includes `_notes` for an attached browser, follow them for an
325
327
  optional authenticated-state retest.** Only when its profile is still signed in,
@@ -6,12 +6,55 @@ authoring tools.
6
6
 
7
7
  ## Claimant-facing Builder sessions
8
8
 
9
- This integration is separate from provider authoring. When asked to set up an
10
- app, read `how_it_works({ topic: "integration" })`, then configure the
11
- organization with generated tools (`list_orgs`, `create_org`,
12
- `create_org_callback_subscription`, and owner-only `issue_org_token`) and edit
13
- the app's frontend and backend with the coding agent's file tools. The guide
14
- covers the `@reclaimprotocol/client` workflow, exact `api=2` boundary, result
9
+ This integration is separate from provider authoring.
10
+
11
+ **Using a provider.** A provider found with `providers`, `discover_resolve`, or
12
+ another lookup is published and usable as-is. Don't capture, `replay_request`,
13
+ or `run_proof` against it unless the developer asks you to check or test it.
14
+ Before using a provider, found or just created, ask once whether they just want
15
+ to try it or want it in an app (skip this if they already said):
16
+
17
+ > Want to (1) just try it right now, (2) integrate it into an existing backend
18
+ > or frontend (this directory or another path), or (3) create a new app for it?
19
+
20
+ - **Just try it:** no app or client package, but the same production API the
21
+ app will use. You need an org API key (`rorg_…`): reuse one the developer
22
+ already has, else `issue_org_token` (owner only; the key is shown once).
23
+ Session creation returns 409 while the org has no callback subscription, and
24
+ the result is only stored for subscriptions to the event the session ends
25
+ with. If the org has none, register a temporary one for all five ending
26
+ events with `create_org_callback_subscription` (for example, a tunnel to a
27
+ local listener that saves the body it receives). Then call
28
+ `create_verification_session` with `orgToken`, give the developer
29
+ `verificationUrl` to open, poll `get_verification_session` (with `orgToken`)
30
+ until it is terminal, and report the outcome: from the body your listener
31
+ received, or with `get_verification_result` (with `orgToken`), which only
32
+ works until the callback is delivered. Delete the temporary subscription with
33
+ `delete_org_callback_subscription` only after that: deleting it also deletes
34
+ its stored results.
35
+ - **Integrate, or new app:** follow the setup below in the path they named.
36
+
37
+ **Org API key vs. sign-in.** Management tools (`list_orgs`,
38
+ `create_org_callback_subscription`, `issue_org_token`, …) use the developer's
39
+ sign-in. Session tools (`create_verification_session`,
40
+ `get_verification_session`, `list_verification_events`,
41
+ `list_verification_deliveries`, `retry_verification_callback`) are the
42
+ production API a backend calls, so they take the org key as `orgToken`
43
+ (defaulting to this server's `RECLAIM_ORG_SECRET`). Never print the key back to
44
+ the developer.
45
+
46
+ **Prefer the HTTP API over `@reclaimprotocol/client`** for every option:
47
+ create sessions with `POST /verifications/sessions`, open `verificationUrl`,
48
+ poll `GET /verifications/sessions/{sessionId}`, and take the result on the
49
+ callback. Use the client package only when the developer asks for it — the one
50
+ exception is `results.receive`, to verify the result on your callback.
51
+
52
+ When integrating into an app, read `how_it_works({ topic: "integration" })`,
53
+ then configure the organization with generated tools (`list_orgs`,
54
+ `create_org`, `create_org_callback_subscription`, and owner-only
55
+ `issue_org_token`) and edit the app's frontend and backend with the coding
56
+ agent's file tools. The guide
57
+ covers the HTTP session workflow, exact `api=2` boundary, result
15
58
  verification, request-proof contract, and optional TEE binding. A URL without
16
59
  `api=2` stays on its existing legacy path.
17
60
 
@@ -21,15 +64,15 @@ else:
21
64
 
22
65
  > This project uses `@reclaimprotocol/js-sdk`. Keep it (I switch this MCP
23
66
  > server to legacy devtools mode), or migrate to the Builder integration
24
- > (`@reclaimprotocol/client`)?
67
+ > (Builder HTTP API)?
25
68
 
26
69
  - **Keep js-sdk:** call `set_devtools_mode({ mode: "old" })`, then tell them to
27
70
  restart or reconnect the MCP server; the switch applies on the next start. An
28
71
  explicit `USE_OLD_DEVTOOLS` env var overrides it. After the restart, read
29
72
  `get_js_sdk_integration_guide`.
30
73
  - **Migrate:** stay in Builder mode. Follow `how_it_works({ topic:
31
- "integration" })` to replace `@reclaimprotocol/js-sdk` with
32
- `@reclaimprotocol/client` and update the app's code.
74
+ "integration" })` to replace `@reclaimprotocol/js-sdk` with the Builder
75
+ HTTP session flow and update the app's code.
33
76
 
34
77
  **A `provider` is a recipe for extracting a data point from a site. A
35
78
  `verification` is an end-user session that proves a data point using one. Never
package/skill/old-mode.md CHANGED
@@ -55,6 +55,18 @@ existing provider instead; you can only version a provider you own. For a
55
55
  multi-request provider pass `providers: [draftA, draftB, …]` so each becomes a
56
56
  parallel `requestData` entry on the one version.
57
57
 
58
+ **Using a provider.** A provider found with `get_me_providers` or
59
+ `get_provider_info` is published and usable as-is. Don't capture,
60
+ `replay_request`, or `run_proof` against it unless the developer asks you to
61
+ check or test it. Before using a provider, found or just created, ask once how
62
+ they want to use it (skip this if they already said):
63
+
64
+ > Want to (1) try it right now here, (2) integrate it into an existing backend
65
+ > or frontend (this directory or another path), or (3) create a new app for it?
66
+
67
+ Try it now → `scaffold_reclaim_demo_server` with its `providerId`. Integrate,
68
+ or new app → `get_js_sdk_integration_guide`, then work in the path they named.
69
+
58
70
  **Two independent auth systems — don't confuse them.** `reclaim_authenticate`
59
71
  authorizes everything in this mode; its Firebase token is short-lived (~1h), so
60
72
  an auth error on publish or `get_me_providers` means re-run it.
@@ -9,7 +9,7 @@ configure Builder resources; the coding agent's file tools edit the app.
9
9
 
10
10
  If the app depends on `@reclaimprotocol/js-sdk`, ask the developer first:
11
11
  keep it (call `set_devtools_mode({ mode: "old" })` and have them restart the MCP
12
- server), or migrate to `@reclaimprotocol/client` with the steps below. When
12
+ server), or migrate to the Builder session flow below. When
13
13
  migrating, remove `@reclaimprotocol/js-sdk` and replace its
14
14
  `ReclaimProofRequest` and `verifyProof` calls with the session flow below.
15
15
 
@@ -21,19 +21,24 @@ migrating, remove `@reclaimprotocol/js-sdk` and replace its
21
21
  error, cancellation, and expiry events. If the app needs encrypted results,
22
22
  register its public key with `set_org_keypair`; retain the private key only
23
23
  in the backend.
24
- 3. An organization owner can call `issue_org_token`. Its `orgSecret` is shown
25
- once. Put it in the app backend's secret configuration as
26
- `RECLAIM_ORG_SECRET`; keep it out of frontend bundles, logs, source control,
27
- and the final response. Reuse an already configured secret when available;
28
- issue a new token when setup needs one.
29
- 4. Install `@reclaimprotocol/client` in the backend. Use
30
- `ReclaimVerification.create({ orgSecret })` to create sessions, save each
31
- returned session ID alongside the app's own user or order, and return only
32
- `verificationUrl` to the frontend. The frontend opens that URL and asks its
33
- backend for the final status; a browser redirect alone is not proof of
34
- success.
35
- 5. Add a backend callback endpoint. Persist each delivery idempotently, load
36
- the expected session ID and org ID from app storage, and call
24
+ 3. Reuse a `RECLAIM_ORG_SECRET` the app already has. Otherwise an organization
25
+ owner calls `issue_org_token`; its `orgSecret` is shown once. Write it with
26
+ your file tools into the backend's env file (for example
27
+ `RECLAIM_ORG_SECRET=rorg_…` in `.env`) and make sure that file is
28
+ gitignored. Keep it out of frontend bundles, logs, source control, and the
29
+ final response.
30
+ 4. Prefer plain HTTP from the backend (see [Code to write](#code-to-write)).
31
+ Create sessions with `POST /verifications/sessions`
32
+ (`Authorization: Bearer $RECLAIM_ORG_SECRET`), save each returned session ID
33
+ alongside the app's own user or order, and return only `verificationUrl` to
34
+ the frontend. The frontend opens that URL and asks its backend for the final
35
+ status (`GET /verifications/sessions/{sessionId}`); a browser redirect alone
36
+ is not proof of success. Use `@reclaimprotocol/client`
37
+ (`ReclaimVerification.create({ orgSecret })`, `sessions.create`) only when
38
+ the developer asks for it.
39
+ 5. Add a backend callback endpoint. Persist each delivery idempotently and load
40
+ the expected session ID and org ID from app storage. To verify the result on
41
+ your callback, install `@reclaimprotocol/client` in the backend and call
37
42
  `reclaim.results.receive(body, { reclaimSessionId, expectedAud,
38
43
  orgEthPrivateKey })`. Use the verified proof data to update app state.
39
44
  Handle callback retries and terminal failure outcomes.
@@ -48,6 +53,100 @@ consumer backend uses the separate organization token. The SDK's API-only
48
53
  entry point, `@reclaimprotocol/client/api`, is available when an application
49
54
  needs typed Builder operations without the full verification workflow.
50
55
 
56
+ The MCP session tools (`create_verification_session`,
57
+ `get_verification_session`, `list_verification_events`,
58
+ `list_verification_deliveries`, `retry_verification_callback`,
59
+ `create_callback_subscription`, `list_callback_subscriptions`,
60
+ `delete_callback_subscription`, `bind_verification_session_tee_nonce`, and
61
+ `get_verification_result`) call these same production endpoints with the org
62
+ key: pass it as `orgToken`, or let them fall back to the MCP server's
63
+ `RECLAIM_ORG_SECRET`. Use them, or `curl` with the key from `.env`, to test the
64
+ integration end to end.
65
+
66
+ ## Code to write
67
+
68
+ Use the API base URL the developer's Builder runs at (production:
69
+ `https://build.reclaimprotocol.org`). Every call authenticates with
70
+ `authorization: Bearer $RECLAIM_ORG_SECRET`.
71
+
72
+ Subscribe a callback once (or use `create_org_callback_subscription`). Session
73
+ creation returns 409 while the org has none, and a result is only delivered to
74
+ subscriptions that include the event the session ends with, so subscribe to all
75
+ five:
76
+
77
+ ```bash
78
+ curl -X POST https://build.reclaimprotocol.org/verifications/callback-subscriptions \
79
+ -H "authorization: Bearer $RECLAIM_ORG_SECRET" \
80
+ -H "content-type: application/json" \
81
+ -d '{
82
+ "callbackUrl": "https://your.app/reclaim/callback",
83
+ "events": [
84
+ "verification_success",
85
+ "verification_rejected",
86
+ "verification_error",
87
+ "verification_cancelled",
88
+ "session_expired"
89
+ ]
90
+ }'
91
+ ```
92
+
93
+ Create a session per claimant, from the backend; store `id` and hand
94
+ `verificationUrl` to the frontend:
95
+
96
+ ```bash
97
+ curl -X POST https://build.reclaimprotocol.org/verifications/sessions \
98
+ -H "authorization: Bearer $RECLAIM_ORG_SECRET" \
99
+ -H "content-type: application/json" \
100
+ -d '{
101
+ "providers": [
102
+ {
103
+ "providerId": "<your-provider-id>"
104
+ }
105
+ ],
106
+ "context": {
107
+ "userId": "abc"
108
+ }
109
+ }'
110
+ ```
111
+
112
+ Receive and verify the result on the callback route. This is the one place the
113
+ client package is needed:
114
+
115
+ ```js
116
+ import { ReclaimVerification } from '@reclaimprotocol/client'
117
+
118
+ const reclaim = ReclaimVerification.create({
119
+ orgSecret: process.env.RECLAIM_ORG_SECRET,
120
+ })
121
+
122
+ app.post('/reclaim/callback', async(req, res) => {
123
+ const outcome = await reclaim.results.receive(req.body, {
124
+ reclaimSessionId: sessionId, // the id you stored
125
+ })
126
+ if(outcome.kind === 'result') {
127
+ console.log(outcome.result.payload) // verified
128
+ }
129
+
130
+ res.sendStatus(200)
131
+ })
132
+ ```
133
+
134
+ Check or investigate a session, from the backend (optional, e.g. a status
135
+ endpoint the frontend polls) or by hand with `curl`. All take the org key:
136
+
137
+ | Route | Use |
138
+ | --- | --- |
139
+ | `GET /verifications/sessions/{sessionId}` | Status and outcome. |
140
+ | `GET /verifications/sessions/{sessionId}/events` | The claimant's event timeline, to see where a flow stopped. |
141
+ | `GET /verifications/sessions/{sessionId}/deliveries` | Callback delivery attempts and their responses. |
142
+ | `GET /verifications/sessions/{sessionId}/result` | Recovery only: a signed result Builder hasn't delivered yet. Builder clears it once the callback succeeds, or after 7 days undelivered (`payload: null`). Verify with `verifyResultFull`. |
143
+ | `POST /verifications/sessions/{sessionId}/retry-callback` | Redeliver an undelivered result (within the 7 days). |
144
+
145
+ ```bash
146
+ curl https://build.reclaimprotocol.org/verifications/sessions/$SESSION_ID \
147
+ -H "authorization: Bearer $RECLAIM_ORG_SECRET"
148
+ ```
149
+
51
150
  ## Create and launch a session
52
151
 
53
152
  Consumers authenticate with an organization token (`rorg_…`, issued in the
@@ -109,7 +208,8 @@ that public key instead; decrypt it with `@reclaimprotocol/client`'s
109
208
  `decryptCallback`/`verifyResult` and the org's eth private key before treating
110
209
  it as a result. A session created without `canEncryptResult` never needs this
111
210
  step. Troubleshoot a stuck or failed session with `get_verification_session`,
112
- `list_verification_events`, and `list_org_verification_sessions`.
211
+ `list_verification_events`, `list_verification_deliveries` (all with
212
+ `orgToken`), and `list_org_verification_sessions`.
113
213
 
114
214
  ## Use the browser extension
115
215
 
@@ -1,5 +1,5 @@
1
1
  // AUTO-GENERATED by packages/app/scripts/mcp-tools-gen.ts
2
- // from packages/app/openapi.yaml (spec v0.1.0, source sha256:9ba46b5cbd7c).
2
+ // from packages/app/openapi.yaml (spec v0.1.0, source sha256:3e28ff308da3).
3
3
  // The hash catches drift the version misses (a spec can change without a
4
4
  // version bump) — do not remove it as "redundant" with the version.
5
5
  // Run `npm run openapi:gen --workspace=packages/app` to regenerate. Do not edit by hand.
@@ -9,7 +9,7 @@ import { toZod } from './to-zod.ts'
9
9
 
10
10
  export const MCP_TOOLS = {
11
11
  "AddOrgMember": {
12
- description: "Invite a member to an organization\n\nOwner only. Invites a user to the organization by email. The invitee does **not** need to be a registered user — an invite is created in either case, and an invite email with an accept link is dispatched. The new row is returned with `status: PENDING`; it flips to `ACTIVE` only when the invitee explicitly accepts via `POST /orgs/{orgId}/invite`. `PERSONAL` organizations reject this call (409).",
12
+ description: "Invite a member to an organization\n\nOwner only. Invites a user to the organization by email. The invitee does **not** need to be a registered user — an invite is created in either case, and an invite email with an accept link is dispatched. The new row is returned with `status: PENDING`; it flips to `ACTIVE` only when the invitee explicitly accepts via `POST /orgs/{orgId}/invite`.",
13
13
  inputSchema: toZod({
14
14
  "type": "object",
15
15
  "properties": {
@@ -50,7 +50,7 @@ export const MCP_TOOLS = {
50
50
  },
51
51
  "role": {
52
52
  "type": "string",
53
- "description": "Role a user holds in an organization. `OWNER` can invite, promote, demote, and remove members, and delete the org. `MEMBER` has read/write access to resources owned by the org but cannot manage membership. `PERSONAL` orgs have exactly one `OWNER` and reject all member-mutating operations.",
53
+ "description": "Role a user holds in an organization. `OWNER` can invite, promote, demote, and remove members, and delete the org. `MEMBER` has read/write access to resources owned by the org but cannot manage membership.",
54
54
  "enum": [
55
55
  "OWNER",
56
56
  "MEMBER"
@@ -425,6 +425,12 @@ export const MCP_TOOLS = {
425
425
  "maxLength": 132
426
426
  }
427
427
  }
428
+ },
429
+ "orgToken": {
430
+ "type": "string",
431
+ "pattern": "^rorg_",
432
+ "maxLength": 200,
433
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
428
434
  }
429
435
  },
430
436
  "required": [
@@ -434,6 +440,7 @@ export const MCP_TOOLS = {
434
440
  ],
435
441
  "additionalProperties": false
436
442
  }),
443
+ orgTokenOnly: true,
437
444
  },
438
445
  "CancelPublicListingRequest": {
439
446
  description: "Cancel a pending public listing review request\n\nCancels a pending public listing request by moving the version from `in_review` back to `draft`. Only org members can cancel their own review requests. This allows users to withdraw a request before admin review if they change their mind.",
@@ -581,6 +588,12 @@ export const MCP_TOOLS = {
581
588
  }
582
589
  }
583
590
  }
591
+ },
592
+ "orgToken": {
593
+ "type": "string",
594
+ "pattern": "^rorg_",
595
+ "maxLength": 200,
596
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
584
597
  }
585
598
  },
586
599
  "required": [
@@ -590,9 +603,10 @@ export const MCP_TOOLS = {
590
603
  ],
591
604
  "additionalProperties": false
592
605
  }),
606
+ orgTokenOnly: true,
593
607
  },
594
608
  "CreateOrg": {
595
- description: "Create an organization\n\nCreates a new `ORG`-kind organization with the caller as its first `OWNER`. The personal org is created automatically at user signup and is not created via this endpoint.",
609
+ description: "Create an organization\n\nCreates a new `ORG`-kind organization with the caller as its first `OWNER`. Every user gets a default organization at sign-up, and it counts toward their org-creation limit (1 active organization unless Reclaim support raises it). Past the limit this returns `409`; contact support@reclaimprotocol.org to raise the limit or archive an organization.",
596
610
  inputSchema: toZod({
597
611
  "type": "object",
598
612
  "properties": {
@@ -611,7 +625,7 @@ export const MCP_TOOLS = {
611
625
  "body": {
612
626
  "type": "object",
613
627
  "additionalProperties": false,
614
- "description": "Body for `POST /orgs` — just a name. Every org is created keyless, like auto-provisioned personal orgs; its Ethereum (secp256k1) key pair is published separately via `PUT /orgs/{orgId}/keypair`, which is also where `canEncryptResult` is set. Creation deliberately collects nothing else so it never blocks on generating and safeguarding a private key.",
628
+ "description": "Body for `POST /orgs` — just a name. Every org is created keyless, like each user's default org; its Ethereum (secp256k1) key pair is published separately via `PUT /orgs/{orgId}/keypair`, which is also where `canEncryptResult` is set. Creation deliberately collects nothing else so it never blocks on generating and safeguarding a private key.",
615
629
  "required": [
616
630
  "name"
617
631
  ],
@@ -1580,7 +1594,7 @@ export const MCP_TOOLS = {
1580
1594
  }),
1581
1595
  },
1582
1596
  "CreateVerificationSession": {
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.",
1597
+ 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). Send the end user to the returned verificationUrl; that is where they verify. Billing refusal returns 402 or 429 with event billing_required and a terminal sessionId.",
1584
1598
  inputSchema: toZod({
1585
1599
  "type": "object",
1586
1600
  "properties": {
@@ -1638,9 +1652,16 @@ export const MCP_TOOLS = {
1638
1652
  },
1639
1653
  "verificationClientUrl": {
1640
1654
  "type": "string",
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.",
1655
+ "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. The built-in clients are `{origin}/share/{name}`, listed in the examples.",
1642
1656
  "maxLength": 2000,
1643
- "pattern": "^https?://"
1657
+ "pattern": "^https?://",
1658
+ "examples": [
1659
+ "https://build.reclaimprotocol.org/share/portals",
1660
+ "https://build.reclaimprotocol.org/share/verifier-app",
1661
+ "https://build.reclaimprotocol.org/share/reclaim-browser-extension",
1662
+ "https://build.reclaimprotocol.org/share/builder",
1663
+ "https://build.reclaimprotocol.org/share/inapp-sdk"
1664
+ ]
1644
1665
  },
1645
1666
  "themeId": {
1646
1667
  "type": "string",
@@ -1755,6 +1776,12 @@ export const MCP_TOOLS = {
1755
1776
  }
1756
1777
  }
1757
1778
  }
1779
+ },
1780
+ "orgToken": {
1781
+ "type": "string",
1782
+ "pattern": "^rorg_",
1783
+ "maxLength": 200,
1784
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
1758
1785
  }
1759
1786
  },
1760
1787
  "required": [
@@ -1764,6 +1791,7 @@ export const MCP_TOOLS = {
1764
1791
  ],
1765
1792
  "additionalProperties": false
1766
1793
  }),
1794
+ orgTokenOnly: true,
1767
1795
  },
1768
1796
  "DecideProviderVersionReview": {
1769
1797
  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.",
@@ -1853,6 +1881,12 @@ export const MCP_TOOLS = {
1853
1881
  },
1854
1882
  "body": {
1855
1883
  "type": "object"
1884
+ },
1885
+ "orgToken": {
1886
+ "type": "string",
1887
+ "pattern": "^rorg_",
1888
+ "maxLength": 200,
1889
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
1856
1890
  }
1857
1891
  },
1858
1892
  "required": [
@@ -1861,6 +1895,7 @@ export const MCP_TOOLS = {
1861
1895
  ],
1862
1896
  "additionalProperties": false
1863
1897
  }),
1898
+ orgTokenOnly: true,
1864
1899
  },
1865
1900
  "DeleteOrgCallbackSubscription": {
1866
1901
  description: "Delete an organization's callback subscription\n\nRemoves a callback subscription. Caller must be an active member of the owning org.",
@@ -2156,12 +2191,34 @@ export const MCP_TOOLS = {
2156
2191
  "type": "string",
2157
2192
  "enum": [
2158
2193
  "claude",
2194
+ "copilot",
2159
2195
  "cursor",
2196
+ "omp",
2160
2197
  "opencode",
2161
2198
  "codex",
2199
+ "antigravity",
2162
2200
  "others"
2163
2201
  ]
2164
2202
  },
2203
+ "providerId": {
2204
+ "type": "array",
2205
+ "maxItems": 20,
2206
+ "items": {
2207
+ "type": "string",
2208
+ "format": "uuid"
2209
+ }
2210
+ },
2211
+ "client": {
2212
+ "type": "string",
2213
+ "enum": [
2214
+ "auto",
2215
+ "portals",
2216
+ "verifier-app",
2217
+ "reclaim-browser-extension",
2218
+ "builder",
2219
+ "inapp-sdk"
2220
+ ]
2221
+ },
2165
2222
  "from": {
2166
2223
  "type": "string",
2167
2224
  "maxLength": 40,
@@ -2174,10 +2231,6 @@ export const MCP_TOOLS = {
2174
2231
  "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2})?)?$",
2175
2232
  "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."
2176
2233
  },
2177
- "providerId": {
2178
- "type": "string",
2179
- "format": "uuid"
2180
- },
2181
2234
  "verificationClientId": {
2182
2235
  "type": "string",
2183
2236
  "minLength": 1,
@@ -2560,6 +2613,12 @@ export const MCP_TOOLS = {
2560
2613
  },
2561
2614
  "body": {
2562
2615
  "type": "object"
2616
+ },
2617
+ "orgToken": {
2618
+ "type": "string",
2619
+ "pattern": "^rorg_",
2620
+ "maxLength": 200,
2621
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
2563
2622
  }
2564
2623
  },
2565
2624
  "required": [
@@ -2568,6 +2627,7 @@ export const MCP_TOOLS = {
2568
2627
  ],
2569
2628
  "additionalProperties": false
2570
2629
  }),
2630
+ orgTokenOnly: true,
2571
2631
  },
2572
2632
  "ImportDevtoolsProvider": {
2573
2633
  description: "Import a provider from devtools\n\nImports a public legacy provider into Builder by UUID. Requires human BearerAuth and a target orgId; preserves the provider UUID and is idempotent for seeded providers. Returns 409 if another Builder org owns the UUID.",
@@ -2695,6 +2755,12 @@ export const MCP_TOOLS = {
2695
2755
  },
2696
2756
  "body": {
2697
2757
  "type": "object"
2758
+ },
2759
+ "orgToken": {
2760
+ "type": "string",
2761
+ "pattern": "^rorg_",
2762
+ "maxLength": 200,
2763
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
2698
2764
  }
2699
2765
  },
2700
2766
  "required": [
@@ -2703,6 +2769,7 @@ export const MCP_TOOLS = {
2703
2769
  ],
2704
2770
  "additionalProperties": false
2705
2771
  }),
2772
+ orgTokenOnly: true,
2706
2773
  },
2707
2774
  "ListOrgCallbackSubscriptions": {
2708
2775
  description: "List an organization's callback subscriptions\n\nReturns every callback subscription owned by the organization. Caller must be an active member of the org.",
@@ -2740,7 +2807,7 @@ export const MCP_TOOLS = {
2740
2807
  }),
2741
2808
  },
2742
2809
  "ListOrgs": {
2743
- 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.",
2810
+ description: "List organizations the caller belongs to\n\nLists the organizations the caller belongs to. Use it first to find an organization id — most other tools take one.",
2744
2811
  inputSchema: toZod({
2745
2812
  "type": "object",
2746
2813
  "properties": {
@@ -3007,6 +3074,12 @@ export const MCP_TOOLS = {
3007
3074
  },
3008
3075
  "body": {
3009
3076
  "type": "object"
3077
+ },
3078
+ "orgToken": {
3079
+ "type": "string",
3080
+ "pattern": "^rorg_",
3081
+ "maxLength": 200,
3082
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
3010
3083
  }
3011
3084
  },
3012
3085
  "required": [
@@ -3015,6 +3088,7 @@ export const MCP_TOOLS = {
3015
3088
  ],
3016
3089
  "additionalProperties": false
3017
3090
  }),
3091
+ orgTokenOnly: true,
3018
3092
  },
3019
3093
  "ListVerificationEvents": {
3020
3094
  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.",
@@ -3043,6 +3117,12 @@ export const MCP_TOOLS = {
3043
3117
  },
3044
3118
  "body": {
3045
3119
  "type": "object"
3120
+ },
3121
+ "orgToken": {
3122
+ "type": "string",
3123
+ "pattern": "^rorg_",
3124
+ "maxLength": 200,
3125
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
3046
3126
  }
3047
3127
  },
3048
3128
  "required": [
@@ -3051,6 +3131,7 @@ export const MCP_TOOLS = {
3051
3131
  ],
3052
3132
  "additionalProperties": false
3053
3133
  }),
3134
+ orgTokenOnly: true,
3054
3135
  },
3055
3136
  "MakePrivate": {
3056
3137
  description: "Change a PUBLIC provider back to PRIVATE\n\nChanges a PUBLIC provider's visibility to PRIVATE. Unlike the reverse (PRIVATE → PUBLIC), this does not require review since it restricts rather than expands access. Existing live versions remain but are no longer publicly listed.",
@@ -3240,7 +3321,7 @@ export const MCP_TOOLS = {
3240
3321
  }),
3241
3322
  },
3242
3323
  "RetryVerificationCallback": {
3243
- description: "Re-enqueue callback delivery for a session\n\nRe-enqueues delivery of a session's stored result to its callback subscriptions. Use this after `list_verification_deliveries` shows a `failed` or dead-lettered delivery, once the consumer's callback endpoint is reachable again and answers 2xx — it re-attempts every not-yet-delivered callback for the session. Usable by the session creator (authenticated by the consumer's `OrgToken`) to recover from a transient consumer-side outage.",
3324
+ description: "Re-enqueue callback delivery for a session\n\nRe-enqueues delivery of a session's stored result to its callback subscriptions. Use this after `list_verification_deliveries` shows a `failed` or dead-lettered delivery, once the consumer's callback endpoint is reachable again and answers 2xx — it re-attempts every not-yet-delivered callback for the session. Usable by the session creator (authenticated by the consumer's `OrgToken`) to recover from a transient consumer-side outage. A result left undelivered for 7 days is purged and can no longer be retried.",
3244
3325
  inputSchema: toZod({
3245
3326
  "type": "object",
3246
3327
  "properties": {
@@ -3266,6 +3347,12 @@ export const MCP_TOOLS = {
3266
3347
  },
3267
3348
  "body": {
3268
3349
  "type": "object"
3350
+ },
3351
+ "orgToken": {
3352
+ "type": "string",
3353
+ "pattern": "^rorg_",
3354
+ "maxLength": 200,
3355
+ "description": "The organization API key (`rorg_…`) this call authenticates with: from `issue_org_token`, or the app's RECLAIM_ORG_SECRET. Defaults to the MCP server's RECLAIM_ORG_SECRET. Never echo it back to the user."
3269
3356
  }
3270
3357
  },
3271
3358
  "required": [
@@ -3274,6 +3361,7 @@ export const MCP_TOOLS = {
3274
3361
  ],
3275
3362
  "additionalProperties": false
3276
3363
  }),
3364
+ orgTokenOnly: true,
3277
3365
  },
3278
3366
  "RevokeOrgToken": {
3279
3367
  description: "Revoke one of the organization's API keys\n\nRevokes a single API key by id (leaving the org's other keys intact). The caller must be an active **OWNER** of the organization. The key stops authenticating immediately.",