@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.
- package/lib/mcp/api/operations.gen.d.ts +9 -0
- package/lib/mcp/api/operations.gen.js +102 -14
- package/lib/mcp/api/tools.d.ts +10 -2
- package/lib/mcp/api/tools.js +42 -4
- package/lib/mcp/instructions.js +1 -1
- package/lib/mcp/start.js +6 -1
- package/lib/mcp/tools/verification/result.js +49 -12
- package/lib/old/tools/get-provider-info.js +3 -1
- package/package.json +2 -2
- package/skill/SKILL.builder.md +15 -3
- package/skill/SKILL.old.md +4 -2
- package/skill/builder-mode.md +52 -9
- package/skill/old-mode.md +12 -0
- package/skill/verification-client-integration.md +115 -15
- package/src/mcp/api/operations.gen.ts +102 -14
- package/src/mcp/api/tools.ts +57 -5
- package/src/mcp/instructions.ts +1 -1
- package/src/mcp/start.ts +6 -1
- package/src/mcp/tools/verification/result.ts +55 -13
- package/src/old/tools/get-provider-info.ts +3 -1
package/skill/SKILL.builder.md
CHANGED
|
@@ -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.
|
|
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.
|
package/skill/SKILL.old.md
CHANGED
|
@@ -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
|
|
322
|
-
|
|
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,
|
package/skill/builder-mode.md
CHANGED
|
@@ -6,12 +6,55 @@ authoring tools.
|
|
|
6
6
|
|
|
7
7
|
## Claimant-facing Builder sessions
|
|
8
8
|
|
|
9
|
-
This integration is separate from provider authoring.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
> (
|
|
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
|
-
|
|
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
|
|
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.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
`
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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`,
|
|
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:
|
|
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`.
|
|
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.
|
|
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`.
|
|
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
|
|
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
|
|
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.",
|