// AUTO-GENERATED by packages/app/scripts/mcp-tools-gen.ts // from packages/app/openapi.yaml. // Run `npm run openapi:gen --workspace=packages/app` // to regenerate. Do not edit by hand. // @ts-nocheck import { toZod } from './to-zod.ts' export const MCP_TOOLS = { "AddOrgMember": { 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).", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for inviting a member to an organization. The invitee does not need to be a registered user; an invite is created either way and an email is dispatched.", "required": [ "email", "role" ], "properties": { "email": { "type": "string", "format": "email", "description": "Email to invite. Need not match an existing `User`.", "minLength": 3, "maxLength": 320 }, "role": { "type": "string", "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.", "enum": [ "OWNER", "MEMBER" ] } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "AdminOrgs": { description: "All workspaces (admin-only)\n\nAdmin only. Lists all organizations. Search matches workspace name or any member's email address.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { "q": { "type": "string", "maxLength": 200 } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "AdminProviders": { description: "All providers (admin-only)\n\nAdmin only. Lists all providers across all organizations. Supports filtering by visibility, status, and free-text search on title/domain/slug.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { "q": { "type": "string", "maxLength": 200 }, "visibility": { "type": "string", "description": "The visibility of the entity.\n\n- `PRIVATE`: Only the owner can see the entity.\n\n- `PUBLIC`: Anyone can see the entity.", "enum": [ "PRIVATE", "PUBLIC" ] }, "status": { "type": "string", "description": "The status of the entity.\n\n- `ACTIVE`: The entity is active.\n\n- `ARCHIVED`: The entity is archived.", "enum": [ "ACTIVE", "ARCHIVED" ] } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "AdminReviews": { description: "Pending review queue (admin-only)\n\nAdmin only. Lists all provider versions currently awaiting review (branch = 'in_review'). Use DecideProviderVersionReview to approve or reject each version.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "AdminSessions": { description: "Explore verification sessions (admin-only)\n\nAdmin only. Search verification sessions across all organizations — filter by `sessionId` (prefix match, at least 5 characters), `providerId`, `claimantClientId`, `orgId` (all exact match), `status`, and a `createdAfter`/`createdBefore` time range. Rows link to the org-scoped session detail page (admins can open any org's pages). Capped at 100, newest first.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { "sessionId": { "type": "string", "maxLength": 100 }, "providerId": { "type": "string", "maxLength": 100 }, "claimantClientId": { "type": "string", "maxLength": 100 }, "orgId": { "type": "string", "maxLength": 100 }, "status": { "type": "string", "description": "Status of a verification session, derived from its events. New values\nmay be added over time; clients MUST tolerate unknown values in\nresponses.\n\n- `pending`: Created, not yet finished; completable until `expiresAt`.\n\n- `success`: Terminal — `verification_success` recorded.\n\n- `rejected`: Terminal — `verification_rejected` recorded.\n\n- `error`: Terminal — `verification_error` recorded.\n\n- `cancelled`: Terminal — `verification_cancelled` recorded.\n\n- `expired`: `expiresAt` passed before a terminal event; the end-user\n can no longer complete it.", "enum": [ "pending", "success", "rejected", "error", "cancelled", "expired" ] }, "createdAfter": { "type": "string", "format": "date-time" }, "createdBefore": { "type": "string", "format": "date-time" } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "BindVerificationSessionTeeNonce": { description: "Bind a legacy-compatible TEE nonce to a verification session\n\nBinds one immutable legacy TEE nonce context to a pending session. Requires an OrgToken and an EIP-191 signature from the organization's registered verification key. Repeating the exact binding is idempotent; conflicting or terminal sessions return 409.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "sessionId": { "type": "string", "format": "uuid", "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`." } }, "required": [ "sessionId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "One immutable legacy TEE context, signed by the organization verification key. The signature is EIP-191 `personal_sign` over `RECLAIM_BUILDER_TEE_BINDING_V1:{organizationId}:{sessionId}:{applicationId}:{timestamp}:{attestationVersion}:{attestationNonce}`.", "required": [ "attestationNonce", "attestationNonceData", "signature" ], "properties": { "attestationNonce": { "description": "Either the current lowercase 64-hex hash nonce (without `0x`) or the older 65-byte EIP-191 signature nonce (`0x` plus 130 hex characters). Builder preserves either encoding unchanged.", "oneOf": [ { "type": "string", "pattern": "^[0-9a-f]{64}$", "minLength": 64, "maxLength": 64 }, { "type": "string", "pattern": "^0x[0-9a-fA-F]{130}$", "minLength": 132, "maxLength": 132 } ] }, "attestationNonceData": { "type": "object", "additionalProperties": false, "description": "Exact legacy TEE nonce inputs. Builder stores this unchanged in the session context after it verifies the signed binding request.", "required": [ "applicationId", "sessionId", "timestamp", "attestationVersion" ], "properties": { "applicationId": { "type": "string", "description": "Ethereum application address derived from the organization private key. Its supplied casing is preserved for legacy nonce compatibility.", "pattern": "^0x[0-9a-fA-F]{40}$", "minLength": 42, "maxLength": 42 }, "sessionId": { "type": "string", "format": "uuid", "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`." }, "timestamp": { "type": "string", "description": "Decimal Unix timestamp in milliseconds.", "pattern": "^[0-9]{13}$", "minLength": 13, "maxLength": 13 }, "attestationVersion": { "type": "string", "description": "Legacy SDK TEE attestation protocol version.", "enum": [ "v3" ] } } }, "signature": { "type": "string", "description": "EIP-191 65-byte secp256k1 signature, encoded as 0x-prefixed hex.", "pattern": "^0x[0-9a-fA-F]{130}$", "minLength": 132, "maxLength": 132 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "CancelPublicListingRequest": { 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.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" }, "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$", "maxLength": 32 } }, "required": [ "providerId", "version" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for visibility change requests (request public listing or make private).", "properties": { "notes": { "type": "string", "description": "Optional note explaining the change.", "maxLength": 10000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "CreateCallbackSubscription": { description: "Register a callback subscription\n\nRegisters a destination for verification results on the organization\nthe presented `OrgToken` resolves to. The body is just `callbackUrl`\nand `events`. At least one subscription must exist for the org before a\nverification session can be created. Delivery is scoped by org: terminal\nresults are ECIES-encrypted to the org's eth public key when its\n`canEncryptResult` is enabled (see `PUT /orgs/{orgId}/keypair`), else\ndelivered as plaintext.\n", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for `POST /verifications/callback-subscriptions`. The owning organization is resolved from the presented `OrgToken`; delivery is scoped to that org and encrypted to its credential when set.", "required": [ "callbackUrl", "events" ], "properties": { "callbackUrl": { "type": "string", "pattern": "^https?://", "description": "Callback URL or template. Supported placeholders are `{{sessionId}}` and top-level scalar context keys.", "maxLength": 2000 }, "events": { "type": "array", "minItems": 1, "maxItems": 50, "items": { "type": "string", "description": "Canonical Builder lifecycle event. Names use lower snake case; metadata uses camel case. Provider events include providerId, resolvedVersion, and ordinal. Request events also include requestId. New values are additive, so clients must tolerate unknown response values. For field requirements and funnel semantics, see docs/verification-analytics-events.md.", "enum": [ "billing_required", "session_pending", "verification_client_opened", "verification_client_ready", "verification_client_warning", "verification_client_visibility_shown", "verification_client_visibility_hidden", "verification_diagnostics_mode_changed", "verification_cancelled", "consent_viewed", "consent_scrolled", "consent_agreed", "verification_browser_started", "verification_browser_ready", "verification_browser_reconnect_started", "verification_browser_reconnected", "verification_browser_failed", "verification_provider_started", "provider_config", "provider_script_log", "network_request_observed", "verification_page_ready", "verification_request_interceptor_ready", "verification_provider_completed", "auth_required", "auth_submitted", "auth_challenge_remains", "auth_rejected", "auth_submission_failed", "auth_challenge_completed", "auth_gate_not_detected", "authenticated", "user_interaction_started", "user_input_started", "user_interaction_summary", "verification_inactivity_detected", "request_matched", "request_match_failed", "request_claim_parameters_captured", "request_claim_created", "request_claim_retrying", "request_claim_completed", "request_claim_rejected", "request_claim_failed", "verification_proofs_completed", "verification_result_submitting", "verification_result_submission_failed", "verification_success", "verification_rejected", "verification_error", "session_expired" ] } } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "CreateOrg": { 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.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "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.", "required": [ "name" ], "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 200 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "CreateOrgCallbackSubscription": { description: "Register a callback subscription on an organization\n\nRegisters an organization callback subscription. Pass the callback URL and events to deliver. Builder encrypts signed results when the organization enables result encryption.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for `POST /orgs/{orgId}/callback-subscriptions`. The owning organization comes from the path; bearer-authenticated and gated on org membership. Delivery is scoped to the org and encrypted to its credential when set.", "required": [ "callbackUrl", "events" ], "properties": { "callbackUrl": { "type": "string", "pattern": "^https?://", "description": "Callback URL or template. Supported placeholders are `{{sessionId}}` and top-level scalar context keys.", "maxLength": 2000 }, "events": { "type": "array", "minItems": 1, "maxItems": 50, "items": { "type": "string", "description": "Canonical Builder lifecycle event. Names use lower snake case; metadata uses camel case. Provider events include providerId, resolvedVersion, and ordinal. Request events also include requestId. New values are additive, so clients must tolerate unknown response values. For field requirements and funnel semantics, see docs/verification-analytics-events.md.", "enum": [ "billing_required", "session_pending", "verification_client_opened", "verification_client_ready", "verification_client_warning", "verification_client_visibility_shown", "verification_client_visibility_hidden", "verification_diagnostics_mode_changed", "verification_cancelled", "consent_viewed", "consent_scrolled", "consent_agreed", "verification_browser_started", "verification_browser_ready", "verification_browser_reconnect_started", "verification_browser_reconnected", "verification_browser_failed", "verification_provider_started", "provider_config", "provider_script_log", "network_request_observed", "verification_page_ready", "verification_request_interceptor_ready", "verification_provider_completed", "auth_required", "auth_submitted", "auth_challenge_remains", "auth_rejected", "auth_submission_failed", "auth_challenge_completed", "auth_gate_not_detected", "authenticated", "user_interaction_started", "user_input_started", "user_interaction_summary", "verification_inactivity_detected", "request_matched", "request_match_failed", "request_claim_parameters_captured", "request_claim_created", "request_claim_retrying", "request_claim_completed", "request_claim_rejected", "request_claim_failed", "verification_proofs_completed", "verification_result_submitting", "verification_result_submission_failed", "verification_success", "verification_rejected", "verification_error", "session_expired" ] } } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "CreateProvider": { description: "Create a provider\n\nCreate a new Reclaim provider. Use this only after `providers` returned nothing useful for the domain. The caller must be an active member of the target organization.\nCreates a new provider in the specified organization. `visibility` is coerced to `PRIVATE` at creation regardless of what's sent; the author may toggle to `PUBLIC` later via `PATCH /providers/{id}`. While `PRIVATE`, versions go live freely; once `PUBLIC`, non-admin versions need admin review. See `Provider.visibility`.\nThe server also seeds an initial `0.1.0` version on the `draft` branch in the same transaction so the provider is immediately editable. Its `initialUrl` defaults to `https://`; all other version fields fall back to their schema-declared defaults (a `structured` verificationType, empty requests, empty web settings). `Provider.latestVersion` stays `null` until the draft is promoted to the live channel.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "`title` is optional — when omitted the dashboard renders `seoSuggestions.title` (server-derived from the scrape result or `derive_brand_name(domain)`).", "required": [ "orgId", "domain", "slug" ], "properties": { "orgId": { "type": "string", "format": "uuid" }, "domain": { "description": "Canonical root domain (for example, `github.com`). No scheme, no port, no path.", "type": "string", "format": "hostname", "minLength": 1, "maxLength": 200 }, "slug": { "description": "URL-safe identifier. Globally unique — pick something domain-specific like `github-followers`.", "type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", "minLength": 1, "maxLength": 100 }, "title": { "description": "Short headline shown to end-users. Defaults to a domain-derived brand name.", "type": "string", "minLength": 1, "maxLength": 100 }, "description": { "type": "string", "minLength": 1, "maxLength": 2000 }, "iconUrl": { "description": "uri of the icon. Optional. If omitted, the server auto-populates from the first version's `initialUrl` (see `Provider.iconUrl`).", "type": "string", "format": "uri", "maxLength": 2000 }, "visibility": { "type": "string", "description": "The visibility of the entity.\n\n- `PRIVATE`: Only the owner can see the entity.\n\n- `PUBLIC`: Anyone can see the entity.", "enum": [ "PRIVATE", "PUBLIC" ] }, "tags": { "type": "array", "maxItems": 50, "uniqueItems": true, "default": [ ], "items": { "type": "string", "description": "A free-form label attached to an entity for grouping and filtering in listings. Must start and end with an alphanumeric character; only ASCII letters, digits, spaces, and hyphens are allowed between.", "pattern": "^[A-Za-z0-9]([A-Za-z0-9 \\-]*[A-Za-z0-9])?$", "minLength": 1, "maxLength": 50 } }, "seo": { "type": "object", "additionalProperties": false, "description": "Author-set SEO fields. All optional.\n\nEach field is paired with a server-derived default of the\nsame name on `Provider.seoSuggestions`. Renderers pick the\neffective value per field:\n\n effective. = seo. ?? seoSuggestions.\n\nSet a field here to override; leave it unset to let the\ndefault win. Both objects are returned on every\n`GET /providers/{id}` — the builder does not pre-merge.\n", "properties": { "brandUrl": { "type": "string", "format": "uri", "description": "Canonical homepage of the brand (for example, `https://google.com`). Used in brand-link cards and JSON-LD.", "maxLength": 2000 }, "primaryDataPoint": { "type": "string", "description": "Headline data point — the single most-important variable this provider can verify (for example, `subscriber count`). Used in the provider's SEO title.", "maxLength": 200 }, "dataPoints": { "type": "array", "description": "Full list of data points this provider can verify.", "maxItems": 50, "items": { "type": "string", "maxLength": 200 } }, "titleOverride": { "type": "string", "description": "Replaces the renderer's composed `` / OG title. Use when the default composition reads awkwardly.", "maxLength": 200 }, "descriptionOverride": { "type": "string", "description": "Replaces the renderer's composed `<meta name=\"description\">` / OG description.", "maxLength": 320 } } } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "CreateProviderVersion": { description: "Create a new provider version\n\nCreates a new immutable semantic version of the provider. Provider\nauthoring clients must create another version for every content change;\nthey must not edit a previously created version in place. Use a patch\nbump by default, or use a major/minor bump or exact higher version when\nthe user directs it. The starting branch\ndepends on the provider's `visibility` and the caller's role:\n\n- `PRIVATE` provider (any caller): the live channel (no review).\n\n- `PUBLIC` provider, admin caller (Reclaim staff): the live channel\n (no review).\n\n- `PUBLIC` provider, non-admin caller: `draft` (or `ai` if\n authored by the AI assistant). Must pass review (see\n `POST /providers/{id}/versions/{version}/review`) before\n reaching the live channel.\n", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for creating a new version of a provider. Every new version starts on the `draft` branch — see `CreateProviderVersion`. The request body never sets `branch` directly; going live is a separate, explicit step (publish for PRIVATE, submit-for-review → approve for PUBLIC). `verificationType` defaults to `structured`; pass `llm` with a `prompt` to author an AI-verification provider.", "required": [ "initialUrl", "requests", "allowedJsRequests", "webSettings" ], "properties": { "verificationType": { "type": "string", "description": "How a provider version verifies a claim. `structured` uses the explicit match rules on this version (the `matches` / `allowedJsMatches` and related settings). `llm` defers the verification decision to a language model and requires `prompt` to be set.", "enum": [ "llm", "structured" ] }, "prompt": { "type": "string", "description": "Extraction prompt, used (and required) when `verificationType` is `llm`. Gated by the prompt guard before it is stored (docs/prompt-guard.md).", "minLength": 0, "maxLength": 4000 }, "version": { "type": "object", "additionalProperties": false, "required": [ "major", "minor", "patch" ], "properties": { "major": { "type": "integer", "minimum": 0 }, "minor": { "type": "integer", "minimum": 0 }, "patch": { "type": "integer", "minimum": 0 }, "branch": { "type": "string", "description": "Branch (lifecycle stage) of this provider version.\n\n- `ai`: changes authored by the AI assistant live on this branch.\n\n- `draft`: a human is actively editing the version.\n\n- `fixed`: a proven AI repair. It remains pinned to its explicit\n version and does not replace the live trunk version.\n\n- `in_review`: the author has submitted the version to be made\n public and it is awaiting review. On approval the branch tag\n is cleared (the version is promoted to the live channel and becomes\n public).\n\n- `rejected`: review concluded with a rejection. When the author\n addresses the feedback the branch transitions back to\n `in_review`.", "enum": [ "ai", "draft", "fixed", "in_review", "rejected" ] }, "buildNumber": { "type": "integer", "description": "Build number for the provider version", "minimum": 0 } } }, "initialUrl": { "type": "string", "format": "uri" }, "requests": { "type": "array", "minItems": 0, "default": [ ], "items": { "type": "object", "additionalProperties": false, "description": "A matcher for one HTTP request in observed traffic, together with the response constraints that must hold for a Reclaim proof over that request to be valid. Used by interceptors, in-page injections, and LLM agents.", "required": [ "url", "method" ], "properties": { "url": { "type": "string", "description": "The URL or generic path of the HTTP request." }, "method": { "type": "string", "description": "The HTTP method used for the request.", "enum": [ "GET", "POST", "PUT", "PATCH", "DELETE" ] }, "requestBodyTemplate": { "type": "string", "description": "Template used to match or capture an outgoing request body. Template can use regex templates as placeholders. For example, to match an outgoing request body that contains a request ID, you can use the following template: `(?<requestId>.*)`.", "maxLength": 100000 }, "headers": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 16000 }, "maxProperties": 100, "description": "Static HTTP request headers passed to the attestor. Header values may use the same `{{param}}` and `{{context.key}}` templates as the URL and request body. Cookies captured by the Verification Client are attached separately and don't need to be declared." }, "credentials": { "type": "string", "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.", "enum": [ "omit", "same-origin", "include" ] }, "writeRedactionMode": { "type": "string", "description": "How the matched portion of the response should be redacted before the transcript is handed to the attestor.\n- `zk`: redact using a zero-knowledge proof over the original\n bytes.\n\n- `key-update`: redact by performing a TLS key update so the\n attestor never observes the matched bytes in cleartext.", "enum": [ "zk", "key-update" ] }, "additionalClientOptions": { "type": "object", "additionalProperties": false, "description": "Apply TLS configuration when creating the tunnel to the attestor.", "properties": { "supportedProtocolVersions": { "type": "array", "description": "TLS protocol versions the client is allowed to negotiate.", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "enum": [ "TLS1_2", "TLS1_3" ] } } } }, "responseMatches": { "type": "array", "description": "Conditions the (redacted) response must satisfy for the proof to be valid. Each runs against the union of the portions revealed by `responseRedactions` (or the whole response when there are none). Mirrors attestor-core `responseMatches`.", "minItems": 1, "items": { "type": "object", "additionalProperties": false, "description": "Specifies a rule to match against a string in response to validate proof content.", "required": [ "type", "value" ], "properties": { "isOptional": { "type": "boolean", "description": "If true, the match condition is optional and won't fail if absent", "default": false }, "description": { "type": "string", "description": "The description of the field that is extracted using this match rule", "minLength": 1, "maxLength": 1000 }, "order": { "type": "integer", "description": "The order in which the field should be displayed to user in UI", "minimum": 0 }, "type": { "type": "string", "description": "The matching mechanism to use value as against response. Typically regex or simple string containment", "enum": [ "regex", "contains" ] }, "value": { "type": "string", "description": "The pattern or value to look for in the response. When `type` is 'contains', supports template variable declaration using `{{variable}}` syntax. When `type` is 'regex', can be used to extract variables using regex named groups." } } } }, "responseRedactions": { "type": "array", "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — not generally paired 1:1 with `responseMatches`. For legacy proof-hash optional-subset compatibility only, the redaction at the same index is treated as the pair for an optional `ResponseMatch`; this does not pair all redactions with matches. Mirrors attestor-core `responseRedactions`.", "items": { "type": "object", "additionalProperties": false, "description": "Which portions to select from a response. These are selected in order, xpath => jsonPath => regex * These redactions are done client side and only the selected portions are sent to the attestor. The attestor will only be able to see the selected portions alongside the first line of the HTTP response (that is, \"HTTP/1.1 200 OK\")", "properties": { "xPath": { "type": "string", "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\"" }, "jsonPath": { "type": "string", "description": "expect a JSON response, retrieve the item at this path using dot notation, for example 'email.addresses.0'." }, "regex": { "type": "string", "description": "select a regex match from the response" }, "hash": { "type": "string", "description": "If provided, the value inside will be hashed instead of being redacted. Useful for cases where the data inside is an identifiying piece of information that you don't want to reveal to the attestor, eg. an email address.\nIf the hash function produces more bytes than the original value, the hash will be truncated.\nEg. if hash is enabled, the original value is \"hello\", and hashed is \"a1b2c\", then the attestor will only see \"a1b2c\".\nNote: if a regex with named groups is provided, only the named groups will be hashed.", "enum": [ "oprf", "oprf-mpc", "oprf-raw" ] } } } } } } }, "allowedJsRequests": { "type": "array", "minItems": 0, "default": [ ], "items": { "type": "object", "additionalProperties": false, "description": "A template for selecting requests. Same matcher shape as `RequestSelection`, plus template flags (`multiple`/`required`) and optional `templateParams` expansion.", "required": [ "url", "method", "multiple", "required" ], "properties": { "url": { "type": "string", "description": "The URL or generic path of the HTTP request." }, "method": { "type": "string", "description": "The HTTP method used for the request.", "enum": [ "GET", "POST", "PUT", "PATCH", "DELETE" ] }, "requestBodyTemplate": { "type": "string", "description": "Template used to match or capture an outgoing request body. Template can use regex templates as placeholders. For example, to match an outgoing request body that contains a request ID, you can use the following template: `(?<requestId>.*)`.", "maxLength": 100000 }, "headers": { "type": "object", "additionalProperties": { "type": "string", "maxLength": 16000 }, "maxProperties": 100, "description": "Static HTTP request headers passed to the attestor. Values may contain `{{param}}` and `{{context.key}}` templates." }, "credentials": { "type": "string", "description": "Mirrors the Fetch API `RequestCredentials` value used when issuing the request — controls whether cookies and auth headers are sent.", "enum": [ "omit", "same-origin", "include" ] }, "writeRedactionMode": { "type": "string", "description": "How the matched portion of the response should be redacted before the transcript is handed to the attestor.\n- `zk`: redact using a zero-knowledge proof over the original\n bytes.\n\n- `key-update`: redact by performing a TLS key update so the\n attestor never observes the matched bytes in cleartext.", "enum": [ "zk", "key-update" ] }, "additionalClientOptions": { "type": "object", "additionalProperties": false, "description": "Apply TLS configuration when creating the tunnel to the attestor.", "properties": { "supportedProtocolVersions": { "type": "array", "description": "TLS protocol versions the client is allowed to negotiate.", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "enum": [ "TLS1_2", "TLS1_3" ] } } } }, "responseMatches": { "type": "array", "description": "Conditions the (redacted) response must satisfy for the proof to be valid. Each runs against the union of the portions revealed by `responseRedactions` (or the whole response when there are none). Mirrors attestor-core `responseMatches`.", "minItems": 1, "items": { "type": "object", "additionalProperties": false, "description": "Specifies a rule to match against a string in response to validate proof content.", "required": [ "type", "value" ], "properties": { "isOptional": { "type": "boolean", "description": "If true, the match condition is optional and won't fail if absent", "default": false }, "description": { "type": "string", "description": "The description of the field that is extracted using this match rule", "minLength": 1, "maxLength": 1000 }, "order": { "type": "integer", "description": "The order in which the field should be displayed to user in UI", "minimum": 0 }, "type": { "type": "string", "description": "The matching mechanism to use value as against response. Typically regex or simple string containment", "enum": [ "regex", "contains" ] }, "value": { "type": "string", "description": "The pattern or value to look for in the response. When `type` is 'contains', supports template variable declaration using `{{variable}}` syntax. When `type` is 'regex', can be used to extract variables using regex named groups." } } } }, "responseRedactions": { "type": "array", "description": "Portions to select/reveal from the response, applied in order (xPath => jsonPath => regex). Done client-side; only the selected portions (plus the first response line) are sent to the attestor. An independent ordered list — not generally paired 1:1 with `responseMatches`. For legacy proof-hash optional-subset compatibility only, the redaction at the same index is treated as the pair for an optional `ResponseMatch`; this does not pair all redactions with matches. Mirrors attestor-core `responseRedactions`.", "items": { "type": "object", "additionalProperties": false, "description": "Which portions to select from a response. These are selected in order, xpath => jsonPath => regex * These redactions are done client side and only the selected portions are sent to the attestor. The attestor will only be able to see the selected portions alongside the first line of the HTTP response (that is, \"HTTP/1.1 200 OK\")", "properties": { "xPath": { "type": "string", "description": "expect an HTML response, and to contain a certain xpath for eg. \"/html/body/div.a1/div.a2/span.a5\"" }, "jsonPath": { "type": "string", "description": "expect a JSON response, retrieve the item at this path using dot notation, for example 'email.addresses.0'." }, "regex": { "type": "string", "description": "select a regex match from the response" }, "hash": { "type": "string", "description": "If provided, the value inside will be hashed instead of being redacted. Useful for cases where the data inside is an identifiying piece of information that you don't want to reveal to the attestor, eg. an email address.\nIf the hash function produces more bytes than the original value, the hash will be truncated.\nEg. if hash is enabled, the original value is \"hello\", and hashed is \"a1b2c\", then the attestor will only see \"a1b2c\".\nNote: if a regex with named groups is provided, only the named groups will be hashed.", "enum": [ "oprf", "oprf-mpc", "oprf-raw" ] } } } }, "multiple": { "type": "boolean", "description": "If true, the template is allowed for multiple requests. Useful for requests like paginated API calls.", "default": true }, "required": { "type": "boolean", "description": "If true, a request is required to match with this template. If not requests matches this template in proof, then validation fails.", "default": true }, "templateParams": { "type": "array", "description": "Names of `${param}` placeholders used in this template's `responseMatches` / `responseRedactions`, substituted at verification time from array-valued extracted parameters (each name must resolve to an array of values; all named arrays must have the same length). Absent or empty means the template is used as-is with no expansion.", "maxItems": 50, "items": { "type": "string", "minLength": 1, "maxLength": 100 } }, "templateParamsMode": { "type": "string", "description": "How array values of `templateParams` expand the template: `separate` (default) emits one expanded request — its own claim — per value; `merge` emits a single request whose `responseMatches`/`responseRedactions` contain all substituted entries, proven by one claim.", "enum": [ "separate", "merge" ], "default": "separate" } } } }, "webSettings": { "type": "object", "additionalProperties": false, "description": "Settings used by the web-based verification client.", "properties": { "geoLocation": { "type": "string", "description": "Geographic location the verification should appear to originate from: a 2-letter ISO country code, or a parameter the attestor resolves at proof time. `{{DYNAMIC_GEO}}` and `{{DYNAMIC_GEO_SECRET}}` are the Verification Client's standard names for the end-user's own country — the `_SECRET` one is delivered as a secret param, so the attestor never learns which country the proof egressed from.", "maxLength": 64, "default": "{{DYNAMIC_GEO}}" }, "clientOptions": { "type": "object", "additionalProperties": false, "description": "Options that influence how the web verification client behaves.", "properties": { "portal": { "type": "object", "additionalProperties": false, "description": "Options that influence how the portal verification client behaves.", "properties": { "useProxy": { "type": "boolean", "description": "When true, network traffic from the portal client and attestation is routed through a proxy.", "default": true }, "userAgent": { "type": "string", "description": "User-agent string used for platform verification.", "maxLength": 500 } } }, "inapp": { "type": "object", "additionalProperties": false, "description": "Options that influence how the in-app verification client behaves.", "properties": { "interceptorOptions": { "type": "object", "additionalProperties": false, "required": [ "interceptorType" ], "properties": { "interceptorType": { "type": "string", "description": "How traffic interception is implemented.", "enum": [ "HAWKEYE", "MSWJS", "CDP" ] }, "isDocumentRequestReplayEnabled": { "type": "boolean", "description": "Whether the main document request is replayed via the attestor", "default": false }, "interceptorSettings": { "type": "string", "description": "Free-form configuration passed through to the interceptor implementation selected by `interceptorType`. Keys and value shapes are defined by the chosen interceptor.", "contentMediaType": "application/json" } } }, "userAgents": { "type": "object", "additionalProperties": false, "description": "User-agent strings keyed by platform.", "properties": { "android": { "type": "string", "description": "User-agent string used for platform verification.", "maxLength": 500 }, "ios": { "type": "string", "description": "User-agent string used for platform verification.", "maxLength": 500 } } } } }, "extension": { "type": "object", "description": "Free-form key-value configuration for the browser-extension verification client. Keys and value shapes are defined by the extension client; values may be any JSON. Absent by default.", "maxProperties": 100, "additionalProperties": true } } }, "jsUserScripts": { "type": "string", "description": "JavaScript snippets injected into the page which runs before every page load. `window.Reclaim.` APIs are available to these scripts to request actions to the client like claim creation.", "maxLength": 1000000 } } }, "requiredContext": { "type": "object", "description": "Optional JSON Schema describing the `context` a Consumer must supply when creating a verification session for this provider version. Only needed when the recipe expects Consumer-supplied values: those are referenced as `{{context.<key>}}` in recipe requests. Bare `{{parameterName}}` placeholders are normally provider parameters extracted from claimant traffic. For old DevTools recipes, Builder-mode Verification Clients seed a missing bare `parameterName` from a same-named scalar session context field when the recipe doesn't use `{{context.parameterName}}`; an explicit parameter always wins. New recipes should use the explicit `{{context.<key>}}` form. Bare parameters need no declaration here. Builder-owned `reclaimSessionId` and `attestationNonce` remain context-only. The Builder validates `CreateVerificationSessionRequest.context` against this schema and rejects the request (400) on mismatch. Extra context fields are always allowed regardless of the schema (a root-level `additionalProperties: false` is ignored). Empty/absent accepts any context.", "additionalProperties": true }, "notes": { "type": "string", "description": "Free-form change note recorded on `createMetadata`.", "maxLength": 10000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "CreateVerificationSession": { description: "Create a verification session\n\nCreates an end-user verification session. Requires an OrgToken and a callback subscription; pass providers, context, and an optional registered verificationClientUrl. Billing refusal returns 402 or 429 with event billing_required and a terminal sessionId.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for `POST /verifications/sessions`. Authenticated by the consumer's `OrgToken`. Carries no callback URLs — they come from the org's callback subscriptions. The one shared `context` is validated against every provider's `requiredContext`.", "required": [ "providers", "context" ], "properties": { "providers": { "type": "array", "minItems": 1, "description": "Providers to verify, in run order. The Verification Client runs each sequentially in one browser session and submits one combined result; all are required.", "items": { "type": "object", "additionalProperties": false, "description": "A provider (+ optional version) to verify in a session.", "required": [ "providerId" ], "properties": { "providerId": { "type": "string", "format": "uuid" }, "version": { "type": "string", "description": "Empty selects the latest active trunk version. An exact semantic version pins that version. Any other valid npm semantic-version range selects the highest active matching version.", "maxLength": 64 } } } }, "context": { "type": "object", "additionalProperties": true, "description": "Consumer context, shared by all providers. Validated against EACH resolved provider version's `requiredContext` JSON Schema (a 400 is returned on mismatch); extra fields are always allowed. Recipe requests reference these values as `{{context.<key>}}`. To support old DevTools recipes, Builder-mode Verification Clients also use a same-named scalar context value to seed a missing bare `{{key}}` when the recipe doesn't use `{{context.key}}`; an explicit parameter takes precedence. Echoed back (plus `reclaimSessionId`) in the result. Builder-owned `reclaimSessionId` and `attestationNonce` remain context-only." }, "verificationClientUrl": { "type": "string", "description": "Optional. Must exactly equal the base URL of a registered verification client (see the `verification_clients` registry / `/admin/verification-clients`). Omit to use the default (`builder`) client. The Builder resolves and stores the registered client UUID, then returns the ready-to-share `verificationUrl` with the session id and `api=2`. A URL that is not a registered client's base is rejected with 400. Consumers append any client-owned redirect parameters after receiving the URL; Builder does not manage them.", "maxLength": 2000, "pattern": "^https?://" }, "themeId": { "type": "string", "format": "uuid" }, "preferredLocale": { "type": "string", "description": "Optional locale override for this verification session. It takes precedence over the organization theme's preferred locale.", "minLength": 2, "maxLength": 64, "pattern": "^[A-Za-z]{2,8}(?:[-_][A-Za-z0-9]{1,8})*$" }, "preferAiAgent": { "type": "boolean", "description": "Legacy-only preference. Builder mode runs the structured recipe and does not enable AI or manual verification. Omit this field for Builder-mode sessions; dual-mode clients may continue to interpret it only on their legacy path." } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "DecideProviderVersionReview": { description: "Record a decision on a provider version review\n\nAdmin only (Reclaim staff). Approves or rejects a provider version currently on the `in_review` branch. `APPROVED` clears the branch tag and promotes the version to the live channel; `REJECTED` moves it to the `rejected` branch where the author can address feedback and resubmit. A rejected version stays rejected — the author either fixes and resubmits, or abandons it.\nUntil RBAC is designed, \"admin\" is detected via the user's email domain (`@reclaimprotocol.org`). Non-admin callers receive a 403.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" }, "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$", "maxLength": 32 } }, "required": [ "providerId", "version" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for recording a decision on a provider version in `in_review`. On `APPROVED` the branch tag is cleared and the version is promoted to the live channel (becomes public). On `REJECTED` the branch becomes `rejected`.", "required": [ "decision" ], "properties": { "decision": { "type": "string", "enum": [ "APPROVED", "REJECTED" ] }, "notes": { "type": "string", "description": "Free-form rationale shown to the author.", "maxLength": 10000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "DeleteCallbackSubscription": { description: "Delete a callback subscription\n\nRemoves a callback subscription. Authenticated by the org's `OrgToken`; the subscription must belong to that organization.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "subscriptionId": { "type": "string", "format": "uuid", "description": "Stable id for a callback subscription." } }, "required": [ "subscriptionId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "DeleteOrgCallbackSubscription": { description: "Delete an organization's callback subscription\n\nRemoves a callback subscription. Caller must be an active member of the owning org.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" }, "subscriptionId": { "type": "string", "format": "uuid", "description": "Stable id for a callback subscription." } }, "required": [ "orgId", "subscriptionId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "DeleteOrgKeypair": { description: "Clear the organization's encryption keypair\n\nRemoves the organization's encryption keypair (the org reverts to keyless ⇒ plaintext delivery, and loses its eth identity address) until a new keypair is set. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "DeleteProvider": { description: "Delete a provider\n\nOwner of the provider's organization only. Soft-archives the provider (sets `status` to `ARCHIVED`) so historical references remain resolvable. Supports optimistic concurrency via `If-Match`.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "headers": { "type": "object", "properties": { "If-Match": { "type": "string", "maxLength": 128, "description": "Opaque `ETag` from a prior GET on the same resource. When\nsupplied, the server applies optimistic concurrency: the\nmutation fails with `412 Precondition Failed` if the\nresource has been modified since. Omit for last-write-wins.\n" } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "DiscoverDataPoints": { description: "List the verifiable data points on a website\n\nThe data points existing providers can prove on a website — the menu to pick from before `GET /discover/resolve`. Optionally filter by `q`.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { "domain": { "type": "string", "format": "hostname", "minLength": 1, "maxLength": 200 }, "q": { "type": "string", "maxLength": 200 } }, "required": [ "domain" ], "additionalProperties": false }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "DiscoverResolve": { description: "Resolve a website + data points to providers\n\nProvider resolution: given a website and the data points the user wants their users to prove, return the smallest set of existing providers whose data points COVER the selection (greedy combine), the `requiredContext` inputs the consumer must supply, and any `uncovered` points no provider exposes yet (`needsCreation` is true then — author a provider with the agent tools). When the chosen providers can be fused into one (same start page, no clashing page scripts) `merge.mergeable` is true.\n\nAgent flow: pick a website (`GET /discover/data-points` lists what's verifiable there), confirm the data points with the user, call this to get the `providers` + `requiredContext`, collect those context values from the user, then `POST /verifications/sessions` with `providers` (pass every id) and `context` to mint a verification.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { "domain": { "type": "string", "format": "hostname", "minLength": 1, "maxLength": 200 }, "dataPoints": { "type": "array", "minItems": 1, "maxItems": 200, "items": { "type": "string", "minLength": 1, "maxLength": 200 } }, "mode": { "type": "string", "description": "How the resolver picks providers. `combine` (default) minimizes to the fewest providers (set-cover); `ai` is a forward-compat alias that currently resolves like combine.", "enum": [ "combine", "ai" ], "default": "combine" } }, "required": [ "domain", "dataPoints" ], "additionalProperties": false }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetMe": { description: "Get the authenticated user", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetOrg": { description: "Get an organization", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { "tab": { "type": "string", "enum": [ "connect", "providers", "members", "themes", "sessions", "billing" ] }, "billing": { "type": "string", "enum": [ "success", "cancelled", "changed", "credits" ] } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetOrgBilling": { description: "Get the billing record for an organization\n\nOwner only. Returns `404` when no billing has been set; presence of the row is what promotes the org's credentials out of sandbox mode (see `Credential.mode`).", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetOrgKeypair": { description: "Get the organization's encryption keypair\n\nReturns the organization's single Ethereum (secp256k1) encryption keypair — its public JWK, derived eth address, and `canEncryptResult` flag — or `404` when none is set (the org is keyless ⇒ plaintext delivery). Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetProvider": { description: "Get a provider\n\nFetch a single Reclaim provider by id. Returns every field needed\nto integrate it into a flow: domain, the live version (initialUrl + requests),\nand the data points it can prove. Use `providers` first if you only\nhave a query string.\n\nReturns the provider record.\n\n**Canonical URL.** For SEO and stable sharing, the canonical\nHTML URL for a provider is `/providers/{providerId}/{slug}`\n(see `GetProviderBySlug`). HTML callers (`Accept: text/html`)\nthat hit this route — which omits the slug — receive a `301`\nredirect to the slugged URL. JSON callers\n(`Accept: application/json`) receive the body directly without\nredirect; the slug is on the response.\n", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetProviderVersion": { description: "Get a specific provider version\n\nFetches one exact canonical version. Trunk is public when the provider is public. Non-trunk versions are visible to admins and members of the provider's organization. A member of the organization that paid for a successful AI repair may also read only the exact `fixed` version created by that repair.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" }, "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$", "maxLength": 32 } }, "required": [ "providerId", "version" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetUser": { description: "Get a user's profile\n\nReturns a user record. Visible to the user themselves, any member of an organization the subject also belongs to, and staff.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "userId": { "type": "string", "format": "uuid" } }, "required": [ "userId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetVerificationFunnel": { description: "Get the verification funnel\n\nCalculates an organization's lifecycle funnel for sessions created between required createdAfter (inclusive) and createdBefore (exclusive). Use providerIds/providerMatch and mode (SESSION or PROVIDER) to scope counts. Missing optional events can reflect telemetry loss.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { "providerIds": { "type": "array", "minItems": 1, "maxItems": 50, "uniqueItems": true, "items": { "type": "string", "format": "uuid" } }, "providerMatch": { "type": "string", "enum": [ "ANY", "ALL" ], "default": "ANY" }, "mode": { "type": "string", "enum": [ "SESSION", "PROVIDER" ], "default": "SESSION" }, "createdAfter": { "type": "string", "format": "date-time" }, "createdBefore": { "type": "string", "format": "date-time" } }, "required": [ "createdAfter", "createdBefore" ], "additionalProperties": false }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "GetVerificationSession": { description: "Get a verification session\n\nGets one verification session. Use it to inspect status, resolved providers, context, Verification Client identity, and expiry. Present the owning organization token or the session's x-reclaim-vc-id.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "sessionId": { "type": "string", "format": "uuid", "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`." } }, "required": [ "sessionId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "headers": { "type": "object", "properties": { "x-reclaim-vc-id": { "type": "string", "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull." } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ImportDevtoolsProvider": { 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.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "required": [ "orgId", "providerId" ], "properties": { "orgId": { "type": "string", "format": "uuid" }, "providerId": { "type": "string", "format": "uuid" } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "IssueOrgToken": { description: "Issue a new organization API key\n\nIssues a fresh per-organization API key (`rorg_…`). The caller must be an active **OWNER** of the organization. An org may hold several keys; issuing a new one does **not** invalidate existing keys (revoke those explicitly). The plaintext key is returned **only once** in this response (the server stores only its HMAC); treat it like a password.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListCallbackDlq": { description: "List dead-lettered callbacks (admin-only)\n\nAdmin only. Lists callback deliveries whose retries were exhausted and moved to the DLQ for manual recovery.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListCallbackSubscriptions": { description: "List callback subscriptions for the organization\n\nReturns every callback subscription owned by the organization the presented `OrgToken` resolves to.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListOrgCallbackSubscriptions": { 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.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListOrgs": { description: "List organizations the caller belongs to", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { "cursor": { "type": "string", "maxLength": 500 } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListOrgTokens": { description: "List the organization's API keys\n\nLists metadata for every API key the organization holds — id, last four characters, when issued, and when last used — never the keys themselves. The caller must be an active **OWNER** of the organization.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListOrgVerificationSessions": { description: "List an organization's verification sessions\n\nReturns verification sessions created under the organization, newest first. Optionally filter by `sessionId` (prefix match, at least 5 characters), `providerId`, `status`, `resolvedVersion`, `claimantClientId`, and a `createdAfter`/`createdBefore` time range. Caller must be an active member of the org. Opaque cursor pagination.\n\nNote: `status` filters on the stored column. A session that has passed `expiresAt` but has not yet been swept is reported as `expired` in its body while still stored as `pending`, so `status=expired` may not match such sessions until the sweep runs.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { "sessionId": { "type": "string", "maxLength": 100 }, "providerId": { "type": "string", "maxLength": 100 }, "status": { "type": "string", "description": "Status of a verification session, derived from its events. New values\nmay be added over time; clients MUST tolerate unknown values in\nresponses.\n\n- `pending`: Created, not yet finished; completable until `expiresAt`.\n\n- `success`: Terminal — `verification_success` recorded.\n\n- `rejected`: Terminal — `verification_rejected` recorded.\n\n- `error`: Terminal — `verification_error` recorded.\n\n- `cancelled`: Terminal — `verification_cancelled` recorded.\n\n- `expired`: `expiresAt` passed before a terminal event; the end-user\n can no longer complete it.", "enum": [ "pending", "success", "rejected", "error", "cancelled", "expired" ] }, "resolvedVersion": { "type": "string", "maxLength": 64 }, "claimantClientId": { "type": "string", "maxLength": 100 }, "createdAfter": { "type": "string", "format": "date-time" }, "createdBefore": { "type": "string", "format": "date-time" }, "cursor": { "type": "string", "maxLength": 500 } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListProviderVersions": { description: "List a provider's versions\n\nLists versions visible to the caller. Non-public branches (`ai`, `draft`, `fixed`, `in_review`, `rejected`) are only visible to members of the provider's owning organization.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { "cursor": { "type": "string", "maxLength": 500 } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListVerificationDeliveries": { description: "Get the callback delivery status for a session\n\nLists callback delivery attempts for a session. Requires an OrgToken or the session-bound x-reclaim-vc-id. Use after terminal status to diagnose pending, failed, or dead-lettered callbacks; retry failures with retry_verification_callback.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "sessionId": { "type": "string", "format": "uuid", "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`." } }, "required": [ "sessionId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "headers": { "type": "object", "properties": { "x-reclaim-vc-id": { "type": "string", "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull." } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "ListVerificationEvents": { description: "Get the event log for a session\n\nLists append-only lifecycle events for a session. Requires an OrgToken or the session-bound x-reclaim-vc-id. Use after get_verification_session to find the first missing or failed milestone; inspect eventData for failure details.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "sessionId": { "type": "string", "format": "uuid", "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`." } }, "required": [ "sessionId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "headers": { "type": "object", "properties": { "x-reclaim-vc-id": { "type": "string", "description": "UUID of the registered Verification Client selected when the session was created. The Builder binds it to the session's immutable verificationClientId. This header identifies the client; it is not a general bearer credential. Client-reported metadata remains untrusted, and Consumers must verify every signed result with verifyResultFull." } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "MakePrivate": { 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.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for visibility change requests (request public listing or make private).", "properties": { "notes": { "type": "string", "description": "Optional note explaining the change.", "maxLength": 10000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "Providers": { description: "Search providers\n\nSearch Reclaim providers by domain or data point. A provider is the recipe an end-user follows to prove something about themselves, such as \"I have N followers on Twitter\".\nCall this BEFORE `create_provider` — most popular domains already have a public provider you can reuse, and creating another one just stacks duplicates.\nReturns a paginated list of the providers the caller can see: public providers to everyone, private providers only to members of the owning organization.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { } }, "query": { "type": "object", "properties": { "q": { "type": "string", "maxLength": 200 }, "tag": { "type": "array", "maxItems": 20, "items": { "type": "string", "description": "A free-form label attached to an entity for grouping and filtering in listings. Must start and end with an alphanumeric character; only ASCII letters, digits, spaces, and hyphens are allowed between.", "pattern": "^[A-Za-z0-9]([A-Za-z0-9 \\-]*[A-Za-z0-9])?$", "minLength": 1, "maxLength": 50 } }, "cursor": { "type": "string", "maxLength": 500 } } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "PublishProviderVersion": { description: "Publish a draft version directly (PRIVATE providers only)\n\nPublishes a provider version on the `draft` branch directly to the live channel (trunk). Only allowed for PRIVATE providers — PUBLIC providers must use the review flow (`POST .../review` → admin decision). On success the version's branch transitions from `draft` to `null` (trunk/live).", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" }, "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$", "maxLength": 32 } }, "required": [ "providerId", "version" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for publishing a draft version directly to the live channel. Only allowed for PRIVATE providers.", "properties": { "notes": { "type": "string", "description": "Optional publish note.", "maxLength": 10000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "RequestPublicListing": { description: "Request public listing for a PRIVATE provider\n\nSubmits a PRIVATE provider's latest trunk version for admin review. When approved, the provider's visibility becomes PUBLIC and all future versions require review before going live. Fails if the provider is already PUBLIC or has no live versions.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for visibility change requests (request public listing or make private).", "properties": { "notes": { "type": "string", "description": "Optional note explaining the change.", "maxLength": 10000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "RetryVerificationCallback": { 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.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "sessionId": { "type": "string", "format": "uuid", "description": "Verification session id (UUID v7 when supported). Also echoed in the result payload as `reclaimSessionId`." } }, "required": [ "sessionId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "RevokeOrgToken": { 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.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" }, "tokenId": { "type": "string", "format": "uuid" } }, "required": [ "orgId", "tokenId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object" } }, "required": [ "params", "query" ], "additionalProperties": false }), }, "SetOrgKeypair": { description: "Set (or rotate) the organization's encryption keypair\n\nUpserts the organization's single Ethereum (secp256k1) encryption keypair. The body carries the org's **eth public key** — as an uncompressed hex string (`0x04`+128 hex) or a secp256k1 public JWK (`{kty:'EC', crv:'secp256k1', x, y}`) — and `canEncryptResult`. The matching private key never leaves the consumer. Setting overwrites the single row (and creates it for a keyless org). When `canEncryptResult` is true, terminal results are delivered as an ECIES ciphertext encrypted to this key; otherwise plaintext. Authenticated by the org's `OrgToken` or a human `BearerAuth` session for an active member of the org.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "oneOf": [ { "type": "object", "additionalProperties": false, "description": "Body for `PUT /orgs/{orgId}/keypair`. Carries the org's eth public key as an uncompressed hex string (`0x04` + 128 hex) — the eth-native form wallets/ethers emit. The matching private key never leaves the consumer.", "required": [ "publicKey" ], "properties": { "publicKey": { "type": "string", "description": "Uncompressed secp256k1 public key, `0x04` + 128 hex.", "pattern": "^0x04[0-9a-fA-F]{128}$" }, "canEncryptResult": { "type": "boolean", "default": false }, "label": { "type": "string", "minLength": 1, "maxLength": 100 } } }, { "type": "object", "additionalProperties": false, "description": "Body for `PUT /orgs/{orgId}/keypair`. Carries the org's eth public key as a secp256k1 public JWK.", "required": [ "publicKeyJwk" ], "properties": { "publicKeyJwk": { "type": "object", "additionalProperties": false, "description": "A secp256k1 (Ethereum) public key in JWK form (`{kty:'EC', crv:'secp256k1', x, y}`), used to ECIES-encrypt delivered verification results and to identify the org. The matching private key never leaves the consumer. Same shape published by the signing JWKS.", "required": [ "kty", "crv", "x", "y" ], "properties": { "kty": { "type": "string", "enum": [ "EC" ] }, "crv": { "type": "string", "enum": [ "secp256k1" ] }, "x": { "type": "string", "description": "base64url-encoded X coordinate (32 bytes).", "minLength": 1, "maxLength": 64 }, "y": { "type": "string", "description": "base64url-encoded Y coordinate (32 bytes).", "minLength": 1, "maxLength": 64 } } }, "canEncryptResult": { "type": "boolean", "default": false }, "label": { "type": "string", "minLength": 1, "maxLength": 100 } } } ] } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "SubmitProviderVersionForReview": { description: "Submit a provider version for review\n\nSubmits a provider version (currently on the `draft` or `rejected` branch) for admin review. On success the version's branch transitions to `in_review`. Callable by any authenticated member of the provider's owning org. Meaningful only on `PUBLIC` providers — on `PRIVATE` providers new versions go to the live channel directly and never need review.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" }, "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[a-zA-Z0-9_-]+(?:\\.[0-9]+)?)?$", "maxLength": 32 } }, "required": [ "providerId", "version" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "description": "Body for submitting a provider version for review. Transitions the version's branch from `draft` (or `rejected`) to `in_review`.", "properties": { "notes": { "type": "string", "description": "Optional note from the author to reviewers (changelog, areas to focus on, and so on).", "maxLength": 10000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "TransferProvider": { description: "Transfer a provider to a different workspace\n\nAdmin-only. Moves the provider's `orgId` to the supplied workspace; preserves slug, versions, members. SQL function `builder.transfer_provider` enforces the admin gate and target existence atomically.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "required": [ "orgId" ], "properties": { "orgId": { "type": "string", "format": "uuid" } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "UpdateOrg": { description: "Update an organization\n\nOwner only.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "orgId": { "type": "string", "format": "uuid" } }, "required": [ "orgId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "body": { "type": "object", "additionalProperties": false, "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 200 }, "status": { "type": "string", "description": "The status of the entity.\n\n- `ACTIVE`: The entity is active.\n\n- `ARCHIVED`: The entity is archived.", "enum": [ "ACTIVE", "ARCHIVED" ] }, "iconUrl": { "type": "string", "format": "uri", "description": "Replace the org avatar URL directly. Most clients upload via `PUT /orgs/{orgId}/icon` and let the server write this field.", "maxLength": 2000 } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, "UpdateProvider": { description: "Update a provider\n\nUpdate a Reclaim provider's metadata. Partial PATCH — pass only fields you want to change. The caller must be an active member of the owning organization. To change the provider's recipe (initialUrl, requests, …) cut a new version via the dashboard. Use `seo` to control how the provider appears in search results and social shares; omit a subfield to keep the server default.\nCaller must be a member of the provider's owning organization. `id`, `orgId`, and `slug` are immutable. Supports optimistic concurrency via `If-Match`.", inputSchema: toZod({ "type": "object", "properties": { "params": { "type": "object", "properties": { "providerId": { "type": "string", "format": "uuid" } }, "required": [ "providerId" ], "additionalProperties": false }, "query": { "type": "object", "properties": { } }, "headers": { "type": "object", "properties": { "If-Match": { "type": "string", "maxLength": 128, "description": "Opaque `ETag` from a prior GET on the same resource. When\nsupplied, the server applies optimistic concurrency: the\nmutation fails with `412 Precondition Failed` if the\nresource has been modified since. Omit for last-write-wins.\n" } } }, "body": { "type": "object", "additionalProperties": false, "description": "Partial update of an existing provider. Immutable fields (`id`, `orgId`, `slug`) are not accepted here.", "properties": { "domain": { "type": "string", "format": "hostname", "minLength": 1, "maxLength": 200 }, "region": { "type": "string", "nullable": true, "description": "Confirm or override the provider's region. Send `null` to clear it so the provider applies to every region. See `Provider.region`.", "pattern": "^[a-z]{2}(-[a-z]{2})?$", "maxLength": 5 }, "title": { "type": "string", "minLength": 1, "maxLength": 100 }, "description": { "type": "string", "minLength": 1, "maxLength": 2000 }, "iconUrl": { "description": "uri of the icon", "type": "string", "format": "uri", "maxLength": 2000 }, "visibility": { "type": "string", "description": "The visibility of the entity.\n\n- `PRIVATE`: Only the owner can see the entity.\n\n- `PUBLIC`: Anyone can see the entity.", "enum": [ "PRIVATE", "PUBLIC" ] }, "status": { "type": "string", "description": "The status of the entity.\n\n- `ACTIVE`: The entity is active.\n\n- `ARCHIVED`: The entity is archived.", "enum": [ "ACTIVE", "ARCHIVED" ] }, "tags": { "type": "array", "maxItems": 50, "uniqueItems": true, "items": { "type": "string", "description": "A free-form label attached to an entity for grouping and filtering in listings. Must start and end with an alphanumeric character; only ASCII letters, digits, spaces, and hyphens are allowed between.", "pattern": "^[A-Za-z0-9]([A-Za-z0-9 \\-]*[A-Za-z0-9])?$", "minLength": 1, "maxLength": 50 } }, "seo": { "type": "object", "additionalProperties": false, "description": "Author-set SEO fields. All optional.\n\nEach field is paired with a server-derived default of the\nsame name on `Provider.seoSuggestions`. Renderers pick the\neffective value per field:\n\n effective.<field> = seo.<field> ?? seoSuggestions.<field>\n\nSet a field here to override; leave it unset to let the\ndefault win. Both objects are returned on every\n`GET /providers/{id}` — the builder does not pre-merge.\n", "properties": { "brandUrl": { "type": "string", "format": "uri", "description": "Canonical homepage of the brand (for example, `https://google.com`). Used in brand-link cards and JSON-LD.", "maxLength": 2000 }, "primaryDataPoint": { "type": "string", "description": "Headline data point — the single most-important variable this provider can verify (for example, `subscriber count`). Used in the provider's SEO title.", "maxLength": 200 }, "dataPoints": { "type": "array", "description": "Full list of data points this provider can verify.", "maxItems": 50, "items": { "type": "string", "maxLength": 200 } }, "titleOverride": { "type": "string", "description": "Replaces the renderer's composed `<title>` / OG title. Use when the default composition reads awkwardly.", "maxLength": 200 }, "descriptionOverride": { "type": "string", "description": "Replaces the renderer's composed `<meta name=\"description\">` / OG description.", "maxLength": 320 } } } } } }, "required": [ "params", "query", "body" ], "additionalProperties": false }), }, } export type McpToolName = keyof typeof MCP_TOOLS export type McpToolShape = (typeof MCP_TOOLS)[McpToolName]