@reclaimprotocol/agent 0.1.26 → 0.1.28

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 (92) hide show
  1. package/README.md +5 -5
  2. package/lib/authoring/tools.js +2 -1
  3. package/lib/consts.d.ts +1 -1
  4. package/lib/consts.js +1 -1
  5. package/lib/live/tunnel.d.ts +10 -7
  6. package/lib/live/tunnel.js +78 -56
  7. package/lib/mcp/api/operations.gen.d.ts +12 -8
  8. package/lib/mcp/api/operations.gen.js +378 -580
  9. package/lib/mcp/api/tools.d.ts +1 -1
  10. package/lib/mcp/instructions.js +7 -3
  11. package/lib/mcp/remap_errors.js +9 -5
  12. package/lib/mcp/start.js +1 -1
  13. package/lib/mcp/tools/agent/attach.d.ts +2 -2
  14. package/lib/mcp/tools/agent/attach.js +4 -0
  15. package/lib/mcp/tools/agent/build.d.ts +1 -1
  16. package/lib/mcp/tools/agent/live-view-url.d.ts +2 -0
  17. package/lib/mcp/tools/agent/live-view-url.js +11 -0
  18. package/lib/mcp/tools/agent/live-view.d.ts +4 -2
  19. package/lib/mcp/tools/agent/live-view.js +40 -54
  20. package/lib/mcp/tools/agent/propose.js +10 -4
  21. package/lib/mcp/tools/agent/publish.d.ts +1 -1
  22. package/lib/mcp/tools/agent/publish.js +49 -26
  23. package/lib/mcp/tools/agent/shared.js +0 -9
  24. package/lib/mcp/tools/authenticate/authenticate.d.ts +1 -1
  25. package/lib/mcp/tools/authenticate/build.d.ts +1 -1
  26. package/lib/mcp/tools/authenticate/builder-access.d.ts +1 -1
  27. package/lib/mcp/tools/verification/result.js +12 -13
  28. package/lib/old/login-cdp.d.ts +17 -6
  29. package/lib/old/login-cdp.js +28 -11
  30. package/lib/old/to-register.d.ts +6 -0
  31. package/lib/old/to-register.js +35 -5
  32. package/lib/old/tools/authenticate.d.ts +5 -4
  33. package/lib/old/tools/authenticate.js +9 -5
  34. package/lib/old/tools/publish.d.ts +2 -2
  35. package/lib/old/tools/publish.js +47 -21
  36. package/lib/proof/attestor-auth.d.ts +13 -0
  37. package/lib/proof/attestor-auth.js +16 -0
  38. package/lib/proof/attestor.d.ts +7 -4
  39. package/lib/proof/attestor.js +7 -4
  40. package/lib/proof/index.d.ts +1 -0
  41. package/lib/proof/index.js +1 -0
  42. package/lib/proof/pod-prover.d.ts +2 -0
  43. package/lib/proof/pod-prover.js +5 -5
  44. package/lib/provider/injection-doc.d.ts +2 -0
  45. package/lib/provider/injection-doc.js +7 -1
  46. package/lib/provider/post-publish-browser.d.ts +12 -0
  47. package/lib/provider/post-publish-browser.js +40 -0
  48. package/lib/provider/to-version.d.ts +19 -7
  49. package/lib/provider/to-version.js +67 -25
  50. package/lib/tools/registry.d.ts +1 -1
  51. package/lib/tools/registry.js +7 -4
  52. package/package.json +2 -2
  53. package/skill/SKILL.builder.md +134 -13
  54. package/skill/SKILL.common.md +30 -19
  55. package/skill/SKILL.old.md +22 -12
  56. package/skill/builder-mode.md +19 -9
  57. package/skill/community-contributions.md +108 -0
  58. package/skill/hash-validation.md +8 -5
  59. package/skill/interception.md +35 -22
  60. package/skill/old-mode.md +11 -5
  61. package/skill/user-script.md +41 -10
  62. package/src/authoring/tools.ts +2 -1
  63. package/src/consts.ts +1 -2
  64. package/src/live/tunnel.ts +112 -66
  65. package/src/mcp/api/operations.gen.ts +384 -584
  66. package/src/mcp/api/tools.ts +1 -1
  67. package/src/mcp/instructions.ts +7 -3
  68. package/src/mcp/remap_errors.ts +9 -7
  69. package/src/mcp/start.ts +1 -1
  70. package/src/mcp/tools/agent/attach.ts +6 -2
  71. package/src/mcp/tools/agent/build.ts +1 -1
  72. package/src/mcp/tools/agent/live-view-url.ts +13 -0
  73. package/src/mcp/tools/agent/live-view.ts +42 -54
  74. package/src/mcp/tools/agent/propose.ts +10 -4
  75. package/src/mcp/tools/agent/publish.ts +63 -28
  76. package/src/mcp/tools/agent/shared.ts +5 -0
  77. package/src/mcp/tools/authenticate/authenticate.ts +1 -1
  78. package/src/mcp/tools/authenticate/build.ts +1 -1
  79. package/src/mcp/tools/authenticate/builder-access.ts +1 -1
  80. package/src/mcp/tools/verification/result.ts +11 -13
  81. package/src/old/login-cdp.ts +38 -11
  82. package/src/old/to-register.ts +56 -7
  83. package/src/old/tools/authenticate.ts +9 -5
  84. package/src/old/tools/publish.ts +64 -22
  85. package/src/proof/attestor-auth.ts +33 -0
  86. package/src/proof/attestor.ts +14 -8
  87. package/src/proof/index.ts +4 -0
  88. package/src/proof/pod-prover.ts +7 -5
  89. package/src/provider/injection-doc.ts +9 -1
  90. package/src/provider/post-publish-browser.ts +56 -0
  91. package/src/provider/to-version.ts +104 -27
  92. package/src/tools/registry.ts +12 -9
package/README.md CHANGED
@@ -69,12 +69,12 @@ Or more loosely:
69
69
 
70
70
  The agent orchestrates the tools for you:
71
71
 
72
- 1. **`reclaim_authenticate`** — a Chrome window opens the Reclaim dashboard; you sign in. The token is captured automatically and the tab closes. (Or it reuses a still-valid cached identity.)
72
+ 1. **`reclaim_authenticate`** — a local Chrome window opens the Reclaim dashboard; you sign in. The token is captured automatically and the tab closes. It never uses a Builder, container, custom-CDP, or shared browser. (Or it reuses a still-valid cached identity.)
73
73
  2. **`attach_browser` + `navigate`** — uses local Chrome, a Builder-hosted remote browser, or a custom CDP websocket; **`wait_for_page`** waits while you log in.
74
74
  3. **`start_capture` → `find_requests_containing` → `get_request`** — records network traffic and locates the request carrying your value.
75
75
  4. **`propose_provider`** — drafts the provider (a `contains` match + `jsonPath`/`xPath`/`regex` redaction), keeping any secret headers server-side.
76
76
  5. **`replay_request` → `run_proof`** — pre-flights the draft, then produces a verified zkTLS proof via the attestor.
77
- 6. **`create_provider_version_from_capture`** — publishes it. **`get_me_providers`** lists what you own; pass a returned `providerId` back to publish a new version of an existing provider.
77
+ 6. **`create_provider_version_from_capture`** — publishes it as a new immutable semantic version. **`get_me_providers`** lists what you own; pass a returned `providerId` back to add a version. Patch is the default; request `major`, `minor`, `patch`, or an exact higher version.
78
78
 
79
79
  Your only manual steps are signing in when the browser windows open and confirming the value you want to prove.
80
80
 
@@ -98,7 +98,7 @@ These capture/synthesis/proof tools are backend-independent and registered in bo
98
98
  | `propose_provider` | Synthesize a provider — `contains` match + `jsonPath`/`xPath`/`regex` redaction |
99
99
  | `replay_request` | Pre-flight replay via Node `fetch` (no attestor); also used for auth-bound check by omitting `secretParamsRef` |
100
100
  | `run_proof` | End-to-end zkTLS proof through the attestor SDK |
101
- | `create_provider_version_from_capture` | Publish a drafted provider to the backend |
101
+ | `create_provider_version_from_capture` | Publish a draft as a new immutable semantic version (patch by default) |
102
102
  | `authenticate_builder` | In old-devtools mode only, sign in to Builder for remote-browser allocation |
103
103
  | `list_builder_organizations` | In old-devtools mode only, list organization ids for a quota-accounted Builder browser |
104
104
  | `share_browser_view`, `stop_browser_view` | Put the `container` browser's own live view behind a public HTTPS URL (cloudflared quick tunnel), so someone elsewhere can watch it and act in it — from a phone if they like. Container mode only: a `builder` browser already returns a hosted `liveViewUrl`, and a plain local browser has no view to share |
@@ -110,8 +110,8 @@ These capture/synthesis/proof tools are backend-independent and registered in bo
110
110
  The MCP server targets one of two backends, selected by `USE_OLD_DEVTOOLS`:
111
111
 
112
112
  - **Old devtools (default).** The legacy devtools backend is still in production while the new "builder" backend is built, so this is the default — opt into builder with `USE_OLD_DEVTOOLS=false`. In old mode all auto-generated HTTP-API tools are disabled and a small client (`src/old/`) serves:
113
- - `reclaim_authenticate` — by default opens the dashboard in Chrome via CDP, waits for sign-in, reads the Firebase token from page storage, and closes the tab (or pass a `token` / `ethAddress` to skip the browser).
114
- - `create_provider_version_from_capture` — registers a new provider, or adds a version to an existing one when given a `providerId`.
113
+ - `reclaim_authenticate` — by default opens the dashboard in local Chrome over loopback CDP, waits for sign-in, reads the Firebase token from page storage, and closes the tab. It never uses a remote or shared authoring browser. Pass a `token` / `ethAddress` to skip the browser.
114
+ - `create_provider_version_from_capture` — registers a new provider, or adds a new immutable semantic version when given a `providerId`. It never edits an existing version.
115
115
  - `get_me_providers` — list the providers you own (the only provider-listing tool in this mode).
116
116
  - `session_analytics_logs` — the milestone events for a verification session, which show how far it got.
117
117
  - `session_logs` — the log entries the in-app SDK emitted during that session, each with its event type, log level, and logger name. Filter by event type, level, or substring, page with `limit` and `offset`, or set `saveTo` to write every matching entry to an NDJSON file. The backend searches only the last 3 days unless you pass `startTime` and `endTime`, and it deletes entries after 30 days.
@@ -129,7 +129,8 @@ export function authoringTools(resolveBackend) {
129
129
  defineTool({
130
130
  name: 'test_user_script',
131
131
  description: 'Dry-run a USER SCRIPT (the `jsUserScripts` / `customInjection` '
132
- + 'field) in the LIVE attached tab, BEFORE publishing. Installs '
132
+ + 'field) in the LIVE attached tab while authoring or after provider '
133
+ + 'creation. Installs '
133
134
  + '`script` via CDP so it runs on the next navigation exactly as '
134
135
  + 'the real field would, then reports whether it ran and what it '
135
136
  + 'threw. With `navigateUrl`, it navigates there and removes the '
package/lib/consts.d.ts CHANGED
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * Each var's default/fallback literal is co-located with its getter.
17
17
  */
18
- import { DEFAULT_BASE_URL } from '@reclaimprotocol/client';
18
+ import { DEFAULT_BASE_URL } from '@reclaimprotocol/client/api';
19
19
  import { DEFAULT_OLD_API_URL, DEFAULT_OLD_LOGS_URL } from './old/client.ts';
20
20
  import { DEFAULT_SDK_API_URL } from './old/sdk-client.ts';
21
21
  /** Public attestor websocket URL — fallback for `RECLAIM_ATTESTOR_URL`. */
package/lib/consts.js CHANGED
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * Each var's default/fallback literal is co-located with its getter.
17
17
  */
18
- import { DEFAULT_BASE_URL } from '@reclaimprotocol/client';
18
+ import { DEFAULT_BASE_URL } from '@reclaimprotocol/client/api';
19
19
  import { homedir } from 'node:os';
20
20
  import { join } from 'node:path';
21
21
  import { DEFAULT_OLD_API_URL, DEFAULT_OLD_LOGS_URL } from "./old/client.js";
@@ -2,13 +2,10 @@ import { type CloudflaredBinary } from './cloudflared.ts';
2
2
  export interface Tunnel {
3
3
  /** The public HTTPS origin Cloudflare assigned. */
4
4
  url: string;
5
- /** Whether the tunnel was carrying traffic before {@link READY_TIMEOUT_MS}
6
- * elapsed. False means it may still be propagating rather than broken — say
7
- * so rather than treating the share as failed. */
5
+ /** Whether the public viewer answered during the initial readiness probe. */
8
6
  ready: boolean;
9
- /** cloudflared's own last words, for when `ready` is false and someone has
10
- * to work out why. Absent when the tunnel came up normally. */
11
- diagnostics?: string;
7
+ /** Bounded cloudflared output when the edge is still propagating. */
8
+ cloudflaredLog?: string;
12
9
  /** Terminate the tunnel. Safe to call more than once. */
13
10
  stop: () => Promise<void>;
14
11
  /** Which cloudflared ran, and whether we had to fetch it. */
@@ -21,6 +18,12 @@ export interface Tunnel {
21
18
  * Rejects with an actionable message when `cloudflared` is not installed,
22
19
  * exits early, or never reports a hostname.
23
20
  */
24
- export declare function startTunnel(port: number, { autoInstall }?: {
21
+ export declare function startTunnel(port: number, { autoInstall, probePath, readyPollMs, readyTimeoutMs, }?: {
25
22
  autoInstall?: boolean;
23
+ /** Public path that must answer before the tunnel is returned. */
24
+ probePath?: string;
25
+ /** Test-only timing override. */
26
+ readyPollMs?: number;
27
+ /** Test-only timing override. */
28
+ readyTimeoutMs?: number;
26
29
  }): Promise<Tunnel>;
@@ -23,58 +23,44 @@ import { LOGGER } from "../logger.js";
23
23
  import { resolveCloudflared } from "./cloudflared.js";
24
24
  /** How long to wait for cloudflared to report its hostname before giving up. */
25
25
  const URL_TIMEOUT_MS = 30000;
26
- /** After the hostname is printed, Cloudflare needs a moment before the edge
27
- * routes to it — measured at ~3s. Wait for it so the caller never hands out a
28
- * URL that errors, but don't fail the share if it's slow. */
26
+ /** After the hostname is printed, Cloudflare needs time before the edge routes
27
+ * to it. Probe briefly, then return the still-running tunnel as propagating so
28
+ * slow DNS or edge setup does not destroy an otherwise healthy share. */
29
29
  const READY_TIMEOUT_MS = 20000;
30
30
  const READY_POLL_MS = 1000;
31
+ const STOP_TIMEOUT_MS = 5000;
31
32
  /** `https://<something>.trycloudflare.com`, as printed on cloudflared's log
32
33
  * stream. Anchored to the scheme so a hostname inside prose can't match. */
33
34
  const QUICK_TUNNEL_URL = /https:\/\/[a-z0-9-]+\.trycloudflare\.com/i;
34
- /**
35
- * cloudflared says this once per edge connection it establishes, and until it
36
- * does, the hostname resolves but routes nowhere.
37
- *
38
- * This is the signal to trust, because it is LOCAL. Asking whether we can fetch
39
- * the public URL ourselves conflates two questions — is the tunnel up, and does
40
- * this machine have egress to Cloudflare's edge — and reports "not ready" when
41
- * only the second fails. Observed: a tunnel printed its hostname and registered
42
- * nothing for 12s, which is indistinguishable from a blocked fetch unless you
43
- * read cloudflared's own account of it.
44
- */
45
- const REGISTERED = /Registered tunnel connection|connIndex=/i;
46
35
  /** Tail of cloudflared's log kept for error messages. */
47
36
  const LOG_TAIL_BYTES = 4096;
48
37
  /**
49
38
  * Wait until the tunnel is actually carrying traffic.
50
39
  *
51
- * Two independent signals, either of which is proof:
52
- * - cloudflared reported an edge registration (see {@link REGISTERED}). Local,
53
- * so it works regardless of this machine's own egress.
54
- * - the public origin answered. ANY HTTP response counts, including a 404:
55
- * the live-view server 404s unknown paths, so a status code at all proves
56
- * the hop is live. Kept as a second opinion in case a cloudflared release
57
- * rewords its log.
40
+ * A cloudflared "Registered tunnel connection" log is not enough: Cloudflare
41
+ * can report one while the assigned hostname still returns DNS NXDOMAIN. The
42
+ * public viewer itself must return a successful response.
58
43
  */
59
- async function waitUntilRouted(url, isRegistered) {
60
- const deadline = Date.now() + READY_TIMEOUT_MS;
44
+ async function waitUntilRouted(url, { isRunning, pollMs, timeoutMs, }) {
45
+ const deadline = Date.now() + timeoutMs;
61
46
  while (Date.now() < deadline) {
62
- if (isRegistered()) {
63
- return true;
47
+ if (!isRunning()) {
48
+ return false;
64
49
  }
65
50
  try {
66
- await fetch(url, {
51
+ const response = await fetch(url, {
67
52
  method: 'GET',
68
53
  redirect: 'manual',
69
- signal: AbortSignal.timeout(READY_POLL_MS * 2),
54
+ signal: AbortSignal.timeout(pollMs * 2),
70
55
  });
71
- return true;
72
- }
73
- catch {
74
- await new Promise((r) => setTimeout(r, READY_POLL_MS));
56
+ if (response.ok) {
57
+ return true;
58
+ }
75
59
  }
60
+ catch { }
61
+ await new Promise((r) => setTimeout(r, pollMs));
76
62
  }
77
- return isRegistered();
63
+ return false;
78
64
  }
79
65
  /**
80
66
  * Open a quick tunnel to `http://127.0.0.1:<port>` and resolve once
@@ -83,7 +69,7 @@ async function waitUntilRouted(url, isRegistered) {
83
69
  * Rejects with an actionable message when `cloudflared` is not installed,
84
70
  * exits early, or never reports a hostname.
85
71
  */
86
- export async function startTunnel(port, { autoInstall = true } = {}) {
72
+ export async function startTunnel(port, { autoInstall = true, probePath = '/', readyPollMs = READY_POLL_MS, readyTimeoutMs = READY_TIMEOUT_MS, } = {}) {
87
73
  // Resolves an existing cloudflared, or fetches one on first use. Throws
88
74
  // with an actionable message when neither is possible.
89
75
  const binary = await resolveCloudflared({ autoInstall });
@@ -92,20 +78,12 @@ export async function startTunnel(port, { autoInstall = true } = {}) {
92
78
  '--no-autoupdate',
93
79
  '--url', `http://127.0.0.1:${port}`,
94
80
  ], { stdio: ['ignore', 'pipe', 'pipe'] });
95
- const stop = async () => {
96
- if (!child.killed) {
97
- child.kill('SIGTERM');
98
- }
99
- };
81
+ const exited = new Promise((resolve) => {
82
+ child.once('exit', () => resolve());
83
+ });
84
+ let stopPromise;
85
+ const stop = () => stopPromise ?? (stopPromise = stopChild());
100
86
  return new Promise((resolve, reject) => {
101
- const timer = setTimeout(() => {
102
- void stop();
103
- reject(new Error('cloudflared did not report a tunnel hostname within '
104
- + `${URL_TIMEOUT_MS / 1000}s. Check network egress to Cloudflare, `
105
- + 'or run `cloudflared tunnel --url http://127.0.0.1:'
106
- + `${port}` + '` by hand to see its output.'));
107
- }, URL_TIMEOUT_MS);
108
- let registered = false;
109
87
  let tail = '';
110
88
  let settled = false;
111
89
  const finish = (fn) => {
@@ -116,27 +94,51 @@ export async function startTunnel(port, { autoInstall = true } = {}) {
116
94
  clearTimeout(timer);
117
95
  fn();
118
96
  };
97
+ const timer = setTimeout(() => {
98
+ finish(() => {
99
+ void stop().then(() => reject(new Error('cloudflared did not report a tunnel hostname within '
100
+ + `${URL_TIMEOUT_MS / 1000}s. Check network egress to `
101
+ + 'Cloudflare, or run `cloudflared tunnel --url '
102
+ + `http://127.0.0.1:${port}` + '` by hand to see its output.')));
103
+ });
104
+ }, URL_TIMEOUT_MS);
119
105
  // cloudflared logs the assigned hostname to stderr, not stdout. Watch
120
106
  // both so a future version that switches streams still works.
121
107
  const onChunk = (chunk) => {
122
108
  const text = chunk.toString();
123
- // Keep watching after the hostname: registration lands a beat later, and
124
- // on a bad run it never lands at all, which is the case worth reporting.
109
+ // Keep watching after the hostname so a readiness failure can include
110
+ // cloudflared's account of what happened.
125
111
  tail = (tail + text).slice(-LOG_TAIL_BYTES);
126
- if (REGISTERED.test(text)) {
127
- registered = true;
128
- }
129
- const match = QUICK_TUNNEL_URL.exec(text);
112
+ // Search the accumulated tail so a URL split across stream chunks is not
113
+ // missed. The tail is bounded and the URL appears near startup.
114
+ const match = QUICK_TUNNEL_URL.exec(tail);
130
115
  if (match) {
131
116
  const url = match[0];
132
117
  finish(() => {
133
- void waitUntilRouted(url, () => registered).then((ready) => {
118
+ const probeUrl = new URL(probePath, `${url}/`).toString();
119
+ void waitUntilRouted(probeUrl, {
120
+ isRunning: () => child.exitCode === null
121
+ && child.signalCode === null,
122
+ pollMs: readyPollMs,
123
+ timeoutMs: readyTimeoutMs,
124
+ }).then((ready) => {
134
125
  if (ready) {
135
126
  resolve({ url, ready, stop, binary });
136
127
  return;
137
128
  }
138
- LOGGER.warn({ url, tail }, 'tunnel never registered with an edge; returning anyway');
139
- resolve({ url, ready, stop, binary, diagnostics: tail });
129
+ if (child.exitCode !== null || child.signalCode !== null) {
130
+ reject(new Error('cloudflared exited before the public viewer became reachable. '
131
+ + 'cloudflared output:\n' + tail));
132
+ return;
133
+ }
134
+ LOGGER.warn({ url, tail }, 'tunnel still propagating; returning the live hostname');
135
+ resolve({
136
+ url,
137
+ ready,
138
+ cloudflaredLog: tail,
139
+ stop,
140
+ binary,
141
+ });
140
142
  });
141
143
  });
142
144
  }
@@ -157,4 +159,24 @@ export async function startTunnel(port, { autoInstall = true } = {}) {
157
159
  + 'hostname.')));
158
160
  });
159
161
  });
162
+ async function stopChild() {
163
+ if (child.exitCode !== null || child.signalCode !== null) {
164
+ return;
165
+ }
166
+ let timeout;
167
+ const timedOut = new Promise((resolve) => {
168
+ timeout = setTimeout(resolve, STOP_TIMEOUT_MS);
169
+ });
170
+ child.kill('SIGTERM');
171
+ await Promise.race([
172
+ exited,
173
+ timedOut,
174
+ ]);
175
+ clearTimeout(timeout);
176
+ if (child.exitCode !== null || child.signalCode !== null) {
177
+ return;
178
+ }
179
+ child.kill('SIGKILL');
180
+ await exited;
181
+ }
160
182
  }
@@ -19,6 +19,10 @@ export declare const MCP_TOOLS: {
19
19
  description: string;
20
20
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
21
21
  };
22
+ BindVerificationSessionTeeNonce: {
23
+ description: string;
24
+ inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
25
+ };
22
26
  CancelPublicListingRequest: {
23
27
  description: string;
24
28
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
@@ -67,10 +71,6 @@ export declare const MCP_TOOLS: {
67
71
  description: string;
68
72
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
69
73
  };
70
- DeleteProviderVersion: {
71
- description: string;
72
- inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
73
- };
74
74
  DiscoverDataPoints: {
75
75
  description: string;
76
76
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
@@ -107,10 +107,18 @@ export declare const MCP_TOOLS: {
107
107
  description: string;
108
108
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
109
109
  };
110
+ GetVerificationFunnel: {
111
+ description: string;
112
+ inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
113
+ };
110
114
  GetVerificationSession: {
111
115
  description: string;
112
116
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
113
117
  };
118
+ ImportDevtoolsProvider: {
119
+ description: string;
120
+ inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
121
+ };
114
122
  IssueOrgToken: {
115
123
  description: string;
116
124
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
@@ -195,10 +203,6 @@ export declare const MCP_TOOLS: {
195
203
  description: string;
196
204
  inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
197
205
  };
198
- UpdateProviderVersion: {
199
- description: string;
200
- inputSchema: import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
201
- };
202
206
  };
203
207
  export type McpToolName = keyof typeof MCP_TOOLS;
204
208
  export type McpToolShape = (typeof MCP_TOOLS)[McpToolName];