Proof Holdings

holdings.proof由 proof.holdings 發布官方發布者v1.8.0更新於 Nov 5, 2026

One API, all things verified — control, delegation, human approval, anti-impersonation.

已驗證Streamable HTTP可網頁執行開發者工具安全與監控

概覽

AI 產生的概覽

Proof Holdings MCP 伺服器讓助理發起並管理身分與控制權驗證(手機、電子郵件、網域、錢包),管理證明權杖與委派,並進行驗證。

可以做什麼
  • 建立並追蹤驗證:簡訊、電子郵件、網域 DNS/HTTP、多通道手機驗證、多資產請求、工作階段,以及輪詢至終態
  • 管理網域與 DNS:新增網域、觸發檢查、連接 Cloudflare、設定網域寄信
  • 處理證明與委派:驗證證明權杖、查詢證明狀態、撤銷證明、取得重簽權杖、批次驗證委派
  • 執行人工審核與授權同意流程,並管理可信聯絡人圈與公開個人檔案
  • 管理帳戶:用量、餘額、平台總覽、API 金鑰、資產、登入工作階段、Webhook 端點與範本
適用情境
當助理需要確認某人、手機號碼、電子郵件、網域或錢包的真實性,簽發或檢查證明權杖與網域委派,或把某項操作放在人工核准之後時使用。也適合在信任另一個 MCP 伺服器之前核對其公布的委派。
執行需求
可使用託管的 HTTP 端點,或使用需 Node.js 18 以上版本的 npm 套件。PROOF_API_KEY 中的 API 金鑰為選用:未提供時伺服器以公開模式啟動,只有免金鑰工具(建立帳戶、登入、證明與委派驗證)可用。PROOF_BASE_URL 可覆寫 API 基礎位址。可在瀏覽器登入,或用該套件的 login 指令登入並在本機儲存金鑰。
安裝前請注意
API 金鑰可存取帳戶,其作用域決定哪些工具可用;金鑰不會過期,重新登入也不會撤銷舊金鑰,請在儀表板撤銷不再使用的金鑰。許多工具會建立、傳送、撤銷或刪除紀錄,包括向真人發送簡訊與電子郵件,以及撤銷證明或委派。驗證會產生費用,帳戶有預付餘額與自動加值。Webhook 簽章密鑰只在建立時顯示一次。關於個人的驗證資料會傳送到 Proof 服務。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Proof Holdings,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/holdings.proof%2Fmcp-server/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "proof-holdings": {
      "type": "http",
      "url": "https://api.proof.holdings/mcp"
    }
  }
}

README

@proof-holdings/mcp-server

MCP (Model Context Protocol) server for the proof.holdings API. Exposes 179 tools for AI agents to create verifications, validate proofs, manage assets, and more.

Two ways to connect

Hosted — nothing to install. The same tools are served over HTTP at https://api.proof.holdings/mcp. Any MCP client or agent framework with HTTP transport can connect — add the URL as a remote MCP server in its settings (the config key varies by client). Authentication happens in the browser the first time a tool needs an account. As a config fragment:

json
{ "mcpServers": { "proof": { "type": "http", "url": "https://api.proof.holdings/mcp" } } }

⚠️ Versions before 1.1.0 predate the delegation tools and the keyless public mode and expose an older, smaller surface than this README describes. If a client is pinned to 1.0.0, upgrade it or use the hosted server above. The current instructions are always at https://proof.holdings/md/docs/mcp.md.

Local — this package. Installs and runs as a stdio server:

bash
npm install -g @proof-holdings/mcp-server

Or run directly with npx (no install needed):

bash
npx @proof-holdings/mcp-server

Configuration

VariableRequiredDefaultDescription
PROOF_API_KEYNo—API key (pk_live_... or pk_test_...). Without it the server still starts in public mode: the keyless tools (account bootstrap, login, proof and delegation verification) work, and every other tool answers api_key_required.
PROOF_BASE_URLNohttps://api.proof.holdingsAPI base URL

Get your API key from the proof.holdings dashboard, or let the server get one for you with login (below).

Sign in from a terminal

bash
npx @proof-holdings/mcp-server login
  1. Pick how to log in — Telegram, WhatsApp, SMS or email (--channel, or asked). The terminal shows the link and a QR code to scan with your phone, the text and number to send for SMS, or asks for the code from the email.
  2. Creating an API key needs one more confirmation, preferably on a different channel; it also runs in the terminal.
  3. The new key is saved in ~/.proof-holdings/credentials (readable by you only), under the API in PROOF_BASE_URL. The server uses it from its next start, so restart your MCP client's server.
  4. The sign-in session the terminal used is then signed out. If that fails, login says so; sign it out in the dashboard under Settings → Security → Signed-in devices.

PROOF_API_KEY, when set, always wins over the saved key, and a key saved for one API (say, staging) is never sent to another. Then leave env out of the client config:

json
{ "mcpServers": { "proof-holdings": { "command": "npx", "args": ["-y", "@proof-holdings/mcp-server"] } } }
CommandWhat it does
loginSigns in, confirms, creates and saves a key. --test creates a test key (pk_test_); --scopes a,b limits it (default: full access); --email [email protected] logs in by email.
statusShows which key the server would start with and where it comes from. No network call.
logoutRemoves the saved key for this API from this computer.

The key does not expire. Logging in again replaces the saved key but does not revoke the old one, and logout only forgets it locally: revoke keys you no longer use in the dashboard (API keys) or with the revoke_api_key tool. login needs an interactive terminal and an https:// API (plain http only for localhost).

Client Setup

Add the following to your MCP client config file:

json
{  "mcpServers": {    "proof-holdings": {      "command": "npx",      "args": ["-y", "@proof-holdings/mcp-server"],      "env": {        "PROOF_API_KEY": "pk_live_your_key_here"      }    }  }}

Config file location by client:

ClientConfig file
Claude Desktop (macOS)~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop (Windows)%APPDATA%\Claude\claude_desktop_config.json
Cursor.cursor/mcp.json in your project root
Claude CodeRun claude mcp add proof-holdings -- npx -y @proof-holdings/mcp-server
Windsurf~/.codeium/windsurf/mcp_config.json

Keep the scoped npx -y @proof-holdings/mcp-server command even after a global install. A bare command name is looked up on PATH, or by npx in the npm registry, where it can belong to someone else's package.

Tools (179 tools)

Group totals are exact. The tables name the tools you are most likely to reach for rather than all of them — your MCP client's own tools/list is the complete, current list, and it is the one this server answers from.

Verifications & requests (28 tools)

ToolDescription
create_verificationCreate a verification challenge
get_verificationGet verification status
submit_verification_codeSubmit a verification code
trigger_verificationTrigger a verification check
wait_for_verificationPoll until it completes
create_multi_channel_verificationOne phone, up to three channels, first completion wins
create_verification_requestCreate a multi-asset request
get_request_by_referenceLook a request up by reference id

Domains & DNS (23 tools)

ToolDescription
add_domainAdd a domain to verify
verify_domainCheck the challenge record and mint the proof
connect_cloudflareConnect Cloudflare so records are written for you
verify_domain_with_credentialsProve control using stored credentials
setup_domain_emailSet up sending from the domain

Account, settings & billing (39 tools)

ToolDescription
get_platform_summaryOne-call snapshot of the account
get_usageQuota and usage for the period
get_balanceThe prepaid balance and the auto top-up setting
searchSearch across the account
create_accountBootstrap a new account (no key needed)
create_api_keyCreate a scoped API key
list_assetsList verified assets and their proof handles

HITL approvals & consent (22 tools)

ToolDescription
create_hitlCreate a human-approval configuration
create_confirmationSend an approval request to a person
wait_for_confirmationPoll until a person approves or denies
create_authorizationAsk a person to consent to being contacted
revoke_authorizationWithdraw a consent

Circles & Proof of Me (15 tools)

ToolDescription
create_circleCreate a circle of trusted contacts
add_circle_memberAdd a contact
invite_circle_memberSend a single-use enrollment link
create_identity_challengeRun a cross-channel identity check

Public profiles (12 tools)

ToolDescription
create_profileCreate a public profile
claim_usernameClaim a public username
update_public_proofsChoose which proofs a profile shows

Templates & webhooks (11 tools)

ToolDescription
list_templatesList a sub-account's message templates
render_templateRender a template with variables
list_webhook_deliveriesList webhook deliveries
retry_webhook_deliveryRetry a failed delivery

Webhook endpoints (7 tools)

Each endpoint has its own URL, events and signing secret, and serves either every sub-account or the ones you select. A signing secret is returned only on create and on rotate — store it then.

ToolDescription
list_webhook_endpointsList the account's webhook endpoints
get_webhook_endpointGet one endpoint (no secret)
create_webhook_endpointAdd an endpoint; returns its signing secret
update_webhook_endpointChange URL, events, scope, sub-accounts or status
delete_webhook_endpointDelete an endpoint
rotate_webhook_endpoint_secretReplace an endpoint's signing secret
rotate_callback_secretReplace a sub-account's callback signing secret

Delegations & proofs (13 tools)

ToolDescription
create_delegationAuthorize an artifact from a domain you have proven
revoke_delegationRevoke a delegation
verify_delegationCheck whether an artifact is authorized by the domain it claims
validate_proofVerify a signed proof token (no key needed)
get_proof_statusRead a proof's status by its public handle
list_revoked_proofsRead the revocation list (no key needed)
get_proof_tokenFetch the current (re-signed) token of a proof you own (not one of your own verified assets: that is read in the dashboard)
list_reissued_proofsList your proofs re-signed since an instant, except those of your own verified assets
get_delegation_tokenFetch an active delegation's current token by handle (no key needed)

Sign-in & sessions (9 tools)

ToolDescription
start_loginBegin a sign-in (no key needed)
wait_for_loginPoll until sign-in completes
get_current_userWho the current session belongs to
render_auth_linkRender a sign-in link for the user to open

Test Mode

Use a test-mode API key (pk_test_*) to interact with the API without creating real verifications. Test-mode keys are available in your dashboard.

Transport

Two transports ship in this package:

  • stdio (default, what npx -y @proof-holdings/mcp-server starts) — the server communicates over stdin/stdout. One user per process; this is what a client launches locally.
  • Streamable HTTP (node dist/remote.js) — a remote server that many users connect to over the network by URL, with no install. A connection starts ANONYMOUS — the keyless surface (account bootstrap, login, proof and delegation verification) works with no credential at all — and a tool that needs an account answers 401 with a WWW-Authenticate challenge naming the authorization server, which is what a standards-compliant client follows to sign in. The 401 lands on the TOOL CALL and never on a bare initialize or tools/list FOR AN ANONYMOUS CONNECTION: measured against live clients, refusing an anonymous handshake reads to the user as a connection timeout rather than as an invitation to log in. Three shapes are refused at the handshake instead — a presented token that does not resolve (there the 401 is what makes a client refresh), a request whose credential does not match the session it names, and an opening batch that smuggles a keyed tool call alongside initialize. A signed-in client sends the API key it was granted in the Authorization header — the only place a credential is read, never a query parameter — and each connection gets its own server and HTTP client, so one user's key or session can never reach another. /mcp serves POST (every JSON-RPC message) and DELETE (ending a session); every other method — including the optional standalone GET event stream — answers 405 with Allow: POST, DELETE, whatever session or credential the request carries. Nothing on this server pushes notifications, so declining the stream costs a client nothing, and it is what lets a client on Node 26's built-in fetch work: over HTTP/2 to the edge, with that stream open, it never sent its next request. PORT (default 3100), MCP_MAX_SESSIONS (default 100), MCP_SESSION_TTL_MS (default 30 min, counted from the last POST the server ACCEPTED — one it answered below 400. A POST refused before any work happens does not postpone it, whether the refusal is ours (body over 4MB) or the transport's (unparseable or empty body, unsupported mcp-protocol-version, a second initialize), and neither does a refused method. The official client does not recover from a sweep on its own: measured against SDK 1.27.1 — while the event stream was still offered, so not re-measured since — the next tool call fails with unknown_session until the host reconnects the server. Size the TTL with that in mind — it is a memory bound paid for in reconnects, not a transparent one); /healthz reports the live session count.

Delegation (_meta)

The server card (server.json) can carry a Proof of Delegation publication under the namespaced _meta key holdings.proof/delegation:

json
{  "_meta": {    "holdings.proof/delegation": { "token": "<delegation JWT>" }  }}

The token is an ES256 JWT minted by proof.holdings attesting exactly one thing: the controller of the principal domain authorized the delegate artifact. It is not a statement that the server is safe, audited, or endorsed. A verifier checks the signature against the issuer JWKS, then compares principal and delegate to facts it resolved itself — a token copied into another package fails that comparison, because its delegate names the genuine artifact. Details: Delegations — API reference.

A card published through the official MCP registry must carry the entry under _meta["io.modelcontextprotocol.registry/publisher-provided"] (the registry drops every other _meta key), so readers check both locations. This package's own card carries only the top-level key, so its registry entry carries no delegation; the website card https://proof.holdings/.well-known/mcp/server-card.json does.

Maintainers: the entry is written by the fail-closed publish tool, never by hand — from the repository root, after the delegation is minted for pkg:npm/@proof-holdings/mcp-server:

bash
npm run delegation:publish -- --target mcp --token <jwt># or mint + publish in one step (needs PROOF_API_KEY):npm run delegation:publish -- --target mcp --mint --control-proof ph_ctl_<32hex>

The tool refuses any token whose claims do not name this exact package with principal: proof.holdings (the same check --target a2a performs against the A2A agent card's own url before regenerating /.well-known/agent-card.json). Besides server.json, --target mcp writes the website card's source (web/src/lib/geo/mcp-delegation-publication.json) and regenerates /.well-known/mcp/server-card.json and /.well-known/mcp.json, so it needs web/node_modules installed. For either target, if the card-regeneration step fails after the source file is written, just re-run the command — the token is already validated and the regeneration is idempotent. The website cards reach readers only with the next website deploy.

Verifying someone else's delegation (verify_delegation)

This server also checks delegations, not just publishes one. The verify_delegation tool runs the reference verifier (@proof-holdings/delegation-verifier) over another server's card and needs no API key — verification runs against public surfaces only.

jsonc
{  "card": { /* the MCP server.json or A2A agent card you fetched */ },  "delegate": { "type": "purl", "value": "pkg:npm/postmark-mcp" },  "expected_principal": "postmarkapp.com"}

Both pins are required, and they close different attacks:

  • delegate must be the artifact identity you resolved — the package you are about to install, the endpoint you are about to call. Never copy it out of the card being checked: a published token is a bearer artifact, so comparing it against a field of the same card would bless a token pasted in from somewhere else.
  • expected_principal is the domain you expect to stand behind it. An issuer binds the artifact to nothing, so any domain owner can mint a genuine, signature-valid delegation naming someone else's package. Without this pin a verdict would only mean "some domain claims this".

Re-checking everything you already trust (verify_delegations)

verify_delegation answers "is this one good, right now, because you asked". If an agent has already resolved and verified thirty-five artifacts, re-verifying them one call at a time does not scale — verify_delegations batch-checks up to 50 in a single call, also with no API key.

jsonc
{  "items": [    { "card": { /* ... */ }, "delegate": { "type": "purl", "value": "pkg:npm/postmark-mcp" }, "expected_principal": "postmarkapp.com" },    { "token": "<jwt>", "delegate": { "type": "url", "value": "https://example.com/mcp" }, "expected_principal": "example.com" }  ]}

Each item takes exactly the shape verify_delegation requires (card XOR token, delegate, expected_principal) and is verified independently — no cross-item state, nothing persisted, and one item failing never affects another item's result. Revocation is always checked (there is no check_status: false on this tool — the entire point of a batch re-check is to see what changed).

Two things this tool deliberately does NOT do:

  • It does not discover what you have installed. You must already hold each artifact's card or token. It has no DNS-pointer resolution and fetches no caller-supplied URL — the same trust boundary verify_delegation already draws, kept narrow on purpose (see src/services/delegationPointer/resolve.ts's documented gaps in the main repository, which this tool stays outside of).
  • It does not run continuously. Each call is a single point-in-time check. There is no cadence, no scheduler, no push notification — call it again whenever you want a fresh answer.

Each result in results[] carries an outcome, one of four buckets:

OutcomeMeaning
confirmed_validThe delegation verified — same meaning as verify_delegation's verified: true.
confirmed_invalidA genuine negative verdict: revoked, suspended, expired, a mismatched principal or delegate, a token of schema 1.x (unsupported_version), or a malformed/untrusted/badly-signed token.
no_claim_foundThe artifact publishes no delegation at all. An absence, never an accusation.
unconfirmedWe could not reach the issuer or otherwise get a confident answer right now (e.g. its JWKS or status endpoint is unreachable). Never treat this as a bad verdict — it means "ask again later", not "revoked".

A result also carries checked_at — the ISO timestamp of the moment that item's own check completed, not one timestamp shared across the whole call — so "established locally" is never presented as "established by reaching us, at this moment" without saying which.

⚠️ Release order (maintainers)

package.json declares @proof-holdings/delegation-verifier as a runtime dependency, so the range it names has to be resolvable on the registry before this package is uploaded:

@proof-holdings/delegation-verifier is published BEFORE @proof-holdings/mcp-server, on every release that moves the range. This server is launched via npx by every documented client, so a release whose dependency the registry cannot resolve makes npx @proof-holdings/mcp-server fail with E404 for everyone until the verifier lands. A run of .github/workflows/publish-packages.yml with target: all enforces the order by its step order; a publish by hand from a terminal has nothing enforcing it but docs/runbooks/npm-release.md.

Working on the verifier and the server together does not need a publish. Link the sibling instead:

bash
npm run verifier:link   # cd mcp && npm install ../packages/delegation-verifier --no-save

In this repository the test suite needs no link at all: it resolves the verifier's SOURCE through a vitest alias rather than node_modules, so it is green on a fresh clone and picks up an uncommitted verifier change without a build. The alias is keyed on the sibling verifier package being present; in the public mirror, which holds this package alone, the suite runs against the verifier npm ci installs.

Requirements

  • Node.js >= 18.0.0
  • A proof.holdings API key for the keyed tools. The server starts and answers the keyless ones without it — see Configuration above.

Links

License

MIT

來源:README.md,提交 41f3dfd

工具

179

create_verification

Create a new identity verification. Initiates a verification flow for an asset identifier (phone number, email, domain, social handle, wallet address, account, or Telegram bot). Agent usage: pass the asset `type`, the delivery `channel`, and the `identifier` (e.g. type "phone", channel "sms", identifier "+37060000000"; or type "email", channel "email", identifier "[email protected]"). The response carries a `challenge` object with the instruction for the chosen channel — except a `telegram_bot` verification made with a LIVE key, which the server completes on the spot and answers with `status: verified` plus a proof token and no challenge at all; with a `pk_test_` key that same call stays pending and does carry a challenge. On the messenger channels it also carries `challenge.deep_link` — pass THAT to render_auth_link to give the user a clickable link and a QR code. This endpoint returns no `qr_text` at all. For OTP-based flows (sms/email), the user receives a code — poll get_verification or use wait_for_verification to track completion. For Telegram/WhatsApp, the user clicks the deep link to verify. The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數type必填channel必填bot_tokenidentifier必填profile_iddns_provideremail_prefixclient_metadataexternal_user_idproof_expiry_days

get_verification

Get a verification by ID. Returns the full verification object including status, channel, and proof token if verified. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_verifications

List verifications with optional filters. Returns paginated results. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagetypelimitstatuschannel

trigger_verification

Trigger a DNS/HTTP verification check for a pending domain verification. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

submit_verification_code

Submit an OTP/challenge code for a pending verification. Accepted ONLY where we delivered the code out-of-band to the party being verified: type "email", and type "domain" with channel "email". Any other pair answers 400 unsupported_for_type and completes elsewhere — use trigger_verification (POST /verifications/:id/verify) for a domain over dns/http/auto; a phone completes when the code reaches us FROM that number; social completes through its OAuth callback; a telegram_bot is already verified at creation. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填code必填

resend_verification

Resend a verification message (email channel only). Generates and sends a new code. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

test_verify

Auto-complete a verification in test mode (pk_test_* API keys only). Useful for testing flows without real OTP delivery. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_verified_users

List verified users grouped by external_user_id. Shows all verifications per user. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimit

get_verified_user

Get a single verified user and their verifications by external user ID. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數external_user_id必填

start_domain_verification

Start a B2B domain verification. Creates a verification record and returns DNS/HTTP instructions for the customer to complete. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數domain必填customer_idverification_method

check_domain_verification

Check the status of a pending domain verification. Triggers a DNS/HTTP check and returns the updated status. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

delete_domain_verification

Delete a domain verification attempt that is not verified (pending, verifying or failed) — nothing is revoked. A verified domain, or one that needs re-verification, is refused with domain_verified: removing it revokes its proofs and every delegation issued from it, which is delete_domain in a start_login session (or the dashboard). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

wait_for_verification

Poll a verification until it reaches a terminal state (verified, failed, expired, revoked, or cancelled). Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. A multi-channel verification that lost the race is "cancelled" and one whose proof was withdrawn is "revoked"; both are final, so the wait returns rather than polling on. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填timeout_seconds

create_multi_channel_verification

Create a multi-channel phone verification: one phone number challenged over several channels at once (OR / first-wins). The first channel the user completes wins, yields a single proof token, and cancels the losing siblings. Exactly one proof is billed, at the winning channel's completion — not one per channel, and nothing at creation. Agent usage: the response includes a `group_id` (format vg_<hex>) and a `channels` array — each block carries a `deep_link` (WhatsApp/Telegram) or an `sms_message` to present to the user — pass the `deep_link` to render_auth_link. A block's `qr_text` is that same link already rendered as QR art, not an alternative address: print it verbatim inside a fenced code block or leave it out. Poll get_multi_channel_verification_status with the group_id to track completion and retrieve the proof token when a channel verifies. The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數type必填channels必填identifier必填profile_idclient_metadataexternal_user_idproof_expiry_days

get_multi_channel_verification_status

Get the status of a multi-channel verification group by its group_id. Returns the aggregate status (pending/verified/expired), the winning_channel once one completes, per-channel statuses, and the proof token (with expires_at) when the group is verified. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數group_id必填

create_verification_request

Create a multi-asset verification request. Allows verifying multiple assets (phone, email, domain, social, wallet, account, telegram_bot) in a single flow. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數assets必填expires_inpartial_okaction_typecallback_urlredirect_urlreference_idaction_contextproof_expiry_dayspublic_profile_idvalidity_requirement

get_verification_request

Get a verification request by ID. Returns the request with all its asset verification statuses. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

get_request_proofs

Get proof tokens for verified assets in a verification request. Returns proof tokens that can be used for offline verification. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_verification_requests

List verification requests with optional filters. Returns paginated results. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitstatusreference_id

get_request_by_reference

Get a verification request by its reference ID (your unique identifier). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數reference_id必填

cancel_verification_request

Cancel a pending verification request. Only pending requests can be cancelled. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

wait_for_request

Poll a verification request until it reaches a terminal state (completed, expired, or cancelled). Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填timeout_seconds

validate_proof

Validate a proof token online. Checks the token signature, expiry, and revocation status against the server, and optionally that the proof is about the identifier you expect. Public endpoint — no API key required.

輸入參數identifierproof_token必填

get_proof_status

Get the status of a proof by its public handle (ph_ctl_* / ph_dlg_*) or a verification ID. Returns whether the proof is active, suspended, expired, or revoked — a live proof reads "active". ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

revoke_proof

Revoke a proof by its public handle (ph_ctl_* / ph_dlg_*) or a verification ID — the same addresses get_proof_status takes. The proof token will no longer validate anywhere: the status endpoint, the public validator, the revocation list and the Token Status List all report it revoked. A domain CONTROL proof (a ph_ctl_* of a domain) also revokes, for good, every delegation issued from it; for a domain you own, every proof of the domain is revoked and the domain needs re-verification. The API key needs proofs:write, plus delegations:write while the revocation reaches live delegations — for a domain you own, any live delegation of the domain, whichever of its handles you name (the refusal names the scope and the count). A handle revoked before the domain was verified again does not reach the new proof: revoke that one by its own handle. Otherwise it revokes the PROOF only — the asset or consent it is about stays. Need a temporary stop? Use suspend_proof instead. Cannot be undone. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填reason

list_revoked_proofs

Get the revocation list for offline proof validation. Returns a signed list of all revoked proof IDs. Reuse a fetched list for up to 5 minutes (its cache lifetime), then fetch it again to see new revocations; if you cannot, its signature stays verifiable offline for 1 hour.

無需輸入參數。

get_proof_token

Get the current token of a proof you own, by its public ph_ctl_* handle. After a signing-key rotation this is the re-signed token, which replaces any older copy you hold. Each read is audited. A revoked or expired proof answers proof_not_live; a suspended one is still served. The proof of one of the account's own verified assets (a domain, phone or email verified on the account itself) answers owner_session_required here whatever its status (with a live key; a test key gets not_found): this tool sends the API key, and such a token is read by the signed-in owner in the dashboard. A key bound to a sub-account reads only that sub-account's proofs; another's answers not_found. For a delegation (ph_dlg_*) use get_delegation_token or get_delegation instead. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_reissued_proofs

List your proofs whose token was re-signed at or after an instant, oldest first — what to re-fetch after a signing-key rotation, for example when a webhook was missed. Items are references {proof_id, reissued_at, token_url}, never tokens: pull a ph_ctl_* item with get_proof_token and a ph_dlg_* item with get_delegation_token. Proofs of the account's own verified assets are not listed here (the API key cannot read their tokens); the dashboard shows them. A key bound to a sub-account lists only that sub-account's proofs and the account's delegations. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitsince必填

get_delegation_token

Get the current token of an active delegation by its public ph_dlg_* handle — after a signing-key rotation, the re-signed token to publish in place of the old one. Public endpoint — no API key required, since the token is already published with the delegation. Any handle that is not an active delegation (revoked, suspended, expired or unknown) answers the same not_found.

輸入參數handle必填

create_session

Create a new phone verification session. Returns deep_link, qr_code (base64 PNG), and qr_text (UTF-8 text QR for terminal display). Sessions provide a hosted verification flow with callbacks. Agent usage: After creating a session, pass the response's `deep_link` to render_auth_link so the user can open or scan it. Never hand `qr_text` to a link renderer — it is that link already rendered as QR art. Print it verbatim inside a fenced code block only when a real terminal needs the QR. On sms the person texts a short code from the number being proven, as in SMS login: `deep_link` is an `sms:` link to our default number with the message pre-filled, so render it the same way, and also show `sms_message` (what they send) with the numbers in `sms_dids` (one per region, each with its own QR), because a person reading on a computer texts from their phone. They get no reply SMS. An SMS proof can still be revoked about a minute after the session completes, if the delayed spoof check finds the sender was not a real mobile line, so before relying on it check it with validate_proof. Then use wait_for_session to poll until the session reaches a terminal state (verified, failed, or expired). The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數channel必填contextprofile_idclient_metadata

get_session

Get a session by ID. Returns the session status, verification details, and proof token if verified. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

wait_for_session

Poll a session until it reaches a terminal state (verified, failed, or expired). Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填timeout_seconds

list_assets

List all verified assets for the authenticated user. Assets are verified identities (phones, emails, domains). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數typestatus

get_asset

Get a single verified asset by ID. Returns details including type, value, status, and verification timestamps. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

revoke_asset

Revoke the proofs of one of your assets (a phone, email or domain) — the asset stays on the account. Owner only: sign in with start_login (a connection with only an API key is refused user_session_required — a key revokes a proof with revoke_proof instead), then one code: start_2fa_for_action with action_type revocation_bulk and targets [this asset id], wait_for_2fa, and call again. A phone or email: every proof of that number or address is revoked; signing in with it again issues a fresh proof. A domain you own: every proof of the domain and every delegation issued from it are revoked for good, and the domain needs re-verification — re-verifying does NOT bring the delegations back. Need a temporary stop for a domain proof? Use suspend_proof instead. Status-checking verifiers see the revocation within about a minute; signature-only verifiers accept a token until it expires. Cannot be undone. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

get_current_user

Get the signed-in user's account details, plan and settings. Needs a login session: call start_login, then wait_for_login until it reports success. An API key alone cannot read this — for the key's own account use get_self_api_key or get_settings. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

list_auth_sessions

List the current user's signed-in devices: every session that can still renew, idle ones included. Each shows its channel, user agent and expires_at, which is when the session stops being able to renew (not when its current access token expires). When called via API key, no session is marked is_current. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

revoke_auth_session

Sign out one device (session) by ID. Over a signed-in session it cannot end the current one (that is logout). Over an API key it can end any of the account's sessions. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數session_id必填

get_usage

Get usage metrics for the authenticated account. Shows verification counts, API calls, and quota usage. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數monthsperiod

get_platform_summary

Get a one-call account snapshot: quota with end-of-month projection, request health (pending/completed/expired counts + success rate), per-channel completion rates, HITL counts, and active API key count. The same data the dashboard home renders. The hitl_channels sub-object requires the hitl:read scope. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數profile_idenvironment

get_settings

Get account settings: the outbound webhook endpoint with its event subscriptions, and the default proof lifetime. Branding (name, logo, colour, email theme, support email) belongs to each sub-account: read it with get_profile. The webhook signing secret is NOT returned to an API key — the response reports webhook.secret_set instead, and the value itself is visible only in the dashboard or in the update_settings response that created or rotated it. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

update_settings

Update account settings: the outbound webhook endpoint with its event subscriptions, and the default proof lifetime. Branding belongs to each sub-account: change it with update_profile. Setting the first webhook endpoint creates the signing secret and returns it in this response; the value is returned only when this call created or rotated it, so record it then. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數hitlwebhookproof_expiry_days

export_data

Export a complete copy of your account's data (GDPR Articles 15 and 20), or check on one. Owner only: sign in with start_login first (a connection with only an API key is refused user_session_required). The first call starts the export; it is prepared in the background, and the account owner is told by email (or on their login channel) with a link that downloads it only while they are signed in — this tool never returns the data itself. Call again to see whether it is ready: an export already preparing or ready is reported instead of starting another. One new export per 24 hours (no limit while the account is scheduled for deletion); the file is kept for 7 days. Pass export_id to read one export's status. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數export_id

get_self_api_key

Get the calling API key's own redacted metadata (id, name, key_prefix, environment, scopes, last_used_at, revoked_at, created_at) for agent self-inspection. Never returns the key hash or full secret. Requires API-key auth — a JWT session has no single-key context (returns 400 api_key_required). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

get_api_key_usage

Get per-API-key usage for a given key id: verification counts by type/channel/status, plus verification-request/confirmation/authorization totals, and attribution context (attribution_cutoff_at, attributed_fraction). The counts cover the key and every key it replaced (api_key.replaced_key_ids). Counts only — no recipient identifiers. Scoped to the authenticated account; an API-key caller may read only its own key. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填environment

list_templates

List the custom message templates of one sub-account, organized by channel and message type. Templates belong to a sub-account, not to the account: profile_id picks it — omitted, a sub-account key lists its own sub-account and an account-wide key the primary sub-account. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數profile_id

get_default_templates

Get the default message templates — one for each channel and message type a message is actually sent for. These are the built-in templates a sub-account sends when it has no custom template of its own. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

get_template

Get the template a sub-account sends for a channel and message type: its custom template if set (scope "project"), otherwise the default (scope "default"). The response names the sub-account in profile_id. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數channel必填profile_idmessage_type必填

update_template

Create or update a sub-account's custom template for a channel and message type, replacing the default for that sub-account only. Name the brand with {{business_name}}: a template spelling out a sub-account's own name is refused (template_hardcoded_name). A template for a channel and message type no message is sent for, or using a variable that message never fills, is still saved, with an entry in `warnings` (template_not_sent / template_variable_not_filled) saying why it will not be sent as written (an API that predates `warnings` omits the field). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數body必填channel必填subjectprofile_idbutton_textmessage_type必填button_url_template

delete_template

Delete a sub-account's custom template, reverting that sub-account to the default template for the channel and message type. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數channel必填profile_idmessage_type必填

preview_template

Preview a template with sample data before saving, as a sub-account would send it. Shows how the message will look with placeholder variables filled in. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數body必填channel必填subjectprofile_idbutton_textmessage_type必填button_url_template

render_template

Render the template a sub-account sends — its custom template, otherwise the default — with provided variables. Returns the fully rendered message content. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數channel必填variablesprofile_idmessage_type必填

get_webhook_stats

Get webhook delivery statistics including total deliveries, success/failure counts, and recent activity. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

list_webhook_deliveries

List webhook delivery attempts with pagination and filtering. Shows delivery status, response codes, and timestamps. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitstatusevent_typeprofile_idendpoint_idverification_request_id

get_webhook_delivery

Get details of a single webhook delivery attempt including request/response payloads and retry history. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

retry_webhook_delivery

Retry a failed webhook delivery. Creates a new delivery attempt with the same payload to the configured endpoint. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_webhook_endpoints

List the account's webhook endpoints (URL, events, scope, sub-accounts, status). Secrets are never listed. A sub-account key sees only the endpoints scoped to exactly its own sub-account. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

get_webhook_endpoint

Get one webhook endpoint by ID. The signing secret is not returned (only create_webhook_endpoint and rotate_webhook_endpoint_secret return it). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

create_webhook_endpoint

Add a webhook endpoint. An event reaches every active endpoint whose scope includes the event's sub-account and whose events match; an account-level event reaches "all"-scope endpoints only. An account still delivering to the single webhook URL in its settings is moved onto endpoints by this call (that URL becomes an "all"-scope endpoint with the same secret and events). The response carries the endpoint's signing secret — this and rotate_webhook_endpoint_secret are the only times it is returned, so store it now. Deliveries carry an HMAC-SHA256 X-Proof-Signature over "<X-Proof-Timestamp>.<body>" made with it. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數url必填scope必填eventsstatusdescriptionprofile_ids

update_webhook_endpoint

Update a webhook endpoint: its URL, events, scope, sub-accounts, status or description. Every field is optional, but send at least one. Changing the scope to "selected" without profile_ids keeps the stored list. The signing secret is unchanged (rotate it with rotate_webhook_endpoint_secret). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填urlscopeeventsstatusdescriptionprofile_ids

delete_webhook_endpoint

Delete a webhook endpoint. It receives no new events; deliveries already queued to it are still attempted, signed with the secret they were queued with. Cannot be undone. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

rotate_webhook_endpoint_secret

Replace a webhook endpoint's signing secret and return the new one — this and create_webhook_endpoint are the only times a secret is returned, so store it now. New deliveries are signed with the new secret; deliveries already queued keep the secret they were queued with. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

get_subscription

Get the current subscription details including plan, status, billing period, and usage limits. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

get_balance

Get the prepaid balance (in euro cents and mills), the low-balance threshold, the top-up amounts on offer and the auto top-up setting. Proofs past the plan's included amount are drawn from this balance; once billing is live, an account whose balance is at or below zero is refused new proof requests (402 balance_empty) until it tops up. billing_enabled says whether billing is live. Topping up and changing auto top-up are done by the owner in the dashboard. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

list_balance_ledger

List the prepaid balance history, newest first: every top-up, refund and adjustment, and one usage row per month for that month's deductions. Amounts are signed euro cents (credits positive). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimit

list_profiles

List all profiles for the authenticated account. Returns all profiles including primary and secondary. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

create_profile

Create a new profile with optional display name, bio, avatar, business info, email branding (theme, support email), and theme settings. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數biothemeis_publicavatar_urlis_primaryemail_themeis_businessdisplay_namebusiness_namesupport_email

get_profile

Get a specific profile by ID. Returns full profile details including theme, custom links, and verification display settings. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數profile_id必填

update_profile

Update a profile by ID. Supports changing display info, email branding (theme, support email), theme, custom links, and verification display settings. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數biothemeis_publicavatar_urlis_primaryprofile_id必填email_themeis_businesscustom_linksdisplay_namebusiness_namesupport_email另有 3 個

delete_profile

Delete a sub-account (profile). Revokes its API keys, archives the HITL setups and declines the pending requests created with its own keys, keeps its history but unlinks it, deletes its message templates, and retires its username for good. The last sub-account cannot be deleted; deleting the primary sub-account makes the oldest remaining one primary (the response names it). In a start_login session: one code first — start_2fa_for_action with action_type profile_delete and targets [this sub-account id]. With an API key alone only an EMPTY sub-account (no API keys, HITL setups or pending requests) can be deleted; anything else answers owner_session_required. archive_default_linked is deliberately not offered here: archiving or cancelling everything linked only by default is an irreversible fan-out, so archive each item explicitly instead. Cannot be undone. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數profile_id必填

set_primary_profile

Set a profile as the primary profile. The previous primary profile becomes secondary. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數profile_id必填

update_profile_proofs

Update which verified assets (proofs) are displayed on a specific profile. Controls visibility, privacy masking, ordering, and labels. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數proofs必填profile_id必填proof_order

get_my_profile

Get the current user's primary profile. Returns profile details, theme, custom links, and public proof display settings. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

update_my_profile

Update the current user's primary profile. Supports display name, bio, avatar, theme, custom links, and verification display settings. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數biothemeis_publicavatar_urlcustom_linksdisplay_nameshow_delegationsshow_proof_channelsshow_verification_dates

get_profile_assets

Get available verified assets that can be displayed on the user's profile. Returns assets eligible for public proof display. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數profile_id

rotate_callback_secret

Rotate a sub-account's callback signing secret — the secret that signs every callback_url delivery of its verification requests — and return the new one. This is the only time it is returned, so store it now. Callback deliveries already queued keep the secret they were signed with. An account still delivering through its settings webhook URL is switched over to webhook endpoints first. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數profile_id必填

list_emails

List all email addresses associated with the authenticated account. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

remove_email

Remove an email address from the account. Always requires one code: start_2fa_for_action with action_type email_remove and targets [this email id]. Revokes every proof of the address and your own consents naming it, declines pending confirmations waiting on it, moves Lookalike Watch alerts to your remaining primary email (or stops the watch when none is left), deletes the record, signs out your other devices, and names the new primary email. Refused for the address you signed in with and for your only way to sign in. Cannot be undone. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

set_primary_email

Set an email address as the primary email for the account. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

start_add_email

Start adding a new email address. Sends an OTP code to the email. Returns a session ID to verify with. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數email必填

get_add_email_status

Check the status of an in-progress email addition by session ID. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數session_id必填

verify_email_otp

Submit the OTP code to verify an email addition. Completes the add-email flow if the code is correct. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數code必填session_id必填

resend_email_otp

Resend the OTP code for an in-progress email addition. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數session_id必填

list_phones

List all phone numbers associated with the authenticated account. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

remove_phone

Remove a phone number from the account. Always requires one code: start_2fa_for_action with action_type phone_remove and targets [this phone id]. Revokes every proof of the number and your own consents naming it, declines pending confirmations waiting on it, flags approval setups left with no approver, deletes the record and its messenger links, signs out your other devices, and names the new primary phone — your Proof of Me circles then reach you there. Refused for the number you signed in with, for your only way to sign in, and for your last phone while circles are active (circles_need_phone: add another phone first, or archive the circles). Cannot be undone. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

set_primary_phone

Set a phone number as the primary phone for the account. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

start_add_phone

Start adding a new phone number by reverse OTP: the user starts the exchange themselves and nothing is sent before they do; the response's `instructions` field says what they do (on telegram the bot then asks them to tap a button that shares their number). Returns a session ID; on telegram/whatsapp also deep_link, qr_code (base64 PNG) and qr_text (UTF-8 text QR), and on sms sms_message and sms_dids (one entry per region; a region with no number configured has an empty `did`) with no deep_link. Agent usage: on telegram/whatsapp pass `deep_link` to render_auth_link for the link and a QR code. On sms there is no deep_link — show `sms_message` and a number from an `sms_dids` entry whose `did` is non-empty. Never hand a `qr_text` to a link renderer — it is a link already rendered as QR art. Then poll get_add_phone_status with the session ID. The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數channel必填

get_add_phone_status

Check the status of an in-progress phone addition by session ID. Poll until terminal state. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數session_id必填

list_api_keys

List all API keys for the authenticated account. Returns key metadata (not the secret key values). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

create_api_key

Create a new API key. The secret key value is returned ONLY in this response — store it securely. Note: the secret will be visible in the AI conversation context. Optionally bind the key to a sub-account via profile_id — outbound messages sent with the key are then branded as that sub-account. Agent usage: This operation requires 2FA. Before calling, complete the 2FA flow: (1) call start_2fa with action_type "api_key_create" and the user's preferred channel, (2) tell the user a code was sent and wait for them to verify, (3) poll get_2fa_status until status is "verified", (4) then call create_api_key — the backend session will be elevated. If you get a 403, the 2FA session has expired — restart the flow. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數namescopesprofile_idenvironment

revoke_api_key

Revoke an API key by ID. The key will immediately stop working. This action cannot be undone. Agent usage: This operation requires 2FA. Before calling, complete the 2FA flow: (1) call start_2fa with action_type "api_key_revoke", (2) wait for user to verify the code, (3) poll get_2fa_status until "verified", (4) then call revoke_api_key. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

regenerate_api_key

Regenerate an API key: issues a new key (a new id and secret) with the same name, environment, scopes and sub-account. The old key stops working immediately; use the id in this response from now on. The new key lists the old one in replaced_key_ids, so its requests and usage stay with it. The new secret is returned ONLY in this response. Note: the secret will be visible in the AI conversation context. Agent usage: This operation requires 2FA. Before calling, complete the 2FA flow: (1) call start_2fa with action_type "api_key_regenerate", (2) wait for user to verify the code, (3) poll get_2fa_status until "verified", (4) then call regenerate_api_key. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

start_2fa

Start a two-factor authentication challenge for a sensitive operation. Sends a verification code via the chosen channel. Returns a session ID, and for messaging channels: deep_link, qr_code (base64 PNG), and qr_text (UTF-8 text QR for terminal display). Agent usage — full 2FA flow: (1) Call start_2fa with the appropriate action_type and channel. (2) Present the challenge, and do NOT announce a message the server did not send: email is the ONLY channel it dispatches on. On telegram/whatsapp the user opens `deep_link` and sends the message themselves; on sms they send `sms_message` to a number from `sms_dids`; the response's own `instructions` field says which. On email, a 200 carrying `requires_email_selection: true` and `available_emails` means nothing was sent and no session exists — ask which address and call again with `email_id`. For telegram/whatsapp, pass `deep_link` to render_auth_link; for sms, show `sms_message`. Never hand `qr_text` to a link renderer — it is the link already rendered as QR art, so print it verbatim inside a fenced code block only when a real terminal needs the QR. (3) Poll get_2fa_status with the returned session_id until status is "verified" (the user enters the code on their device) or "expired". (4) If verified, proceed with the protected operation (e.g. create_api_key). If expired, inform the user and offer to restart. Typical channels: "telegram" or "email". For email, the user may receive a magic link instead of a code — the backend handles this automatically. The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數channel必填targetsemail_idphone_idsingle_useaction_type必填ttl_seconds

get_2fa_status

Check the status of a 2FA session by session ID. Returns whether the challenge has been completed, is pending, or has expired. Agent usage: Poll this after calling start_2fa. Check every few seconds. Terminal states: "verified" (proceed with protected operation), "expired" (restart with start_2fa). While "pending", the user has not yet entered their code. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數session_id必填

verify_2fa

Submit a verification code to complete a 2FA challenge. Rate limited to 10 attempts per minute. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數code必填session_id必填

wait_for_2fa

Poll a 2FA session until the user completes the challenge. Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. Agent usage: Call this after start_2fa with the returned session_id. Terminal states: "verified" (challenge completed — proceed with the protected operation), "expired" (offer to restart with start_2fa). Before polling, present start_2fa's challenge: pass its `deep_link` to render_auth_link on telegram/whatsapp, or show its `sms_message` on sms. The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數session_id必填timeout_seconds

list_domains

List all domains for the authenticated account. Returns domain metadata including verification status. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

add_domain

Add a new domain to verify ownership. Optionally specify email sending intent and verification method. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數domain必填profile_idfor_email_sendingverification_method

get_domain

Get details of a specific domain by ID, including verification status, DNS records, and provider connections. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

delete_domain

Remove a domain from the account. Revokes every proof of the domain and every delegation issued from it (for good — re-adding the domain does not bring them back), deletes the domain and its records, and removes our _proof TXT record and the Resend sending domain where we can; the response lists what is left for you to remove by hand. Owner only, in a start_login session, with one code: start_2fa_for_action with action_type domain_remove and targets [this domain id]. Need only a fresh proof? Revoke the proofs instead (revoke_asset), which keeps the domain. Cannot be undone. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

verify_domain

Trigger domain verification. Checks DNS records or other verification method to confirm domain ownership. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

connect_cloudflare

Connect a Cloudflare API token to a domain for automated DNS record management. Note: the API token will be visible in the AI conversation context. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填api_token必填

connect_godaddy

Connect GoDaddy API credentials to a domain for automated DNS record management. Note: the API key and secret will be visible in the AI conversation context. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填api_key必填api_secret必填

connect_dns_provider

Connect a generic DNS provider to a domain using provider-specific credentials. Note: credentials will be visible in the AI conversation context. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填provider必填credentials必填

add_verification_provider

Add an additional DNS provider for verification to an already-verified domain. Note: credentials will be visible in the AI conversation context. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填provider必填credentials必填

get_dns_providers

Get metadata for all supported DNS providers, including required credential fields and documentation links. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

verify_domain_with_credentials

Verify a pending domain using previously stored DNS credentials. Use when credentials are already connected. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

check_domain_credentials

Check if stored DNS credentials have access to a domain. Use before triggering verification to confirm the credentials work. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

start_domain_email_verification

Start domain verification via corporate email. Sends a verification code to a standard admin email address at the domain. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填email_prefix

confirm_domain_email_code

Confirm domain email verification by submitting the code sent to the corporate email address. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填code必填

resend_domain_email

Resend the domain verification email. Rate limited to 3 requests per minute. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填email_prefix

setup_domain_email

Register a verified domain with Proof's email provider (Resend) for sending. The result carries the DKIM/SPF DNS records to publish (`resend.dkim_records`) and their status. `from_email`, if given, must be on this domain and is stored as the preferred sender. Proof does not send from customer domains yet: verification emails still come from Proof's own address, and the stored `from_email` is not used. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填from_email

check_domain_email_status

Check the email sending setup status for a domain, including DNS record configuration progress. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

list_dns_credentials

List all stored DNS provider credentials for the authenticated account. Returns credential metadata (not secret values). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

create_dns_credential

Store DNS provider credentials for automated domain verification. Note: credentials will be visible in the AI conversation context. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數provider必填credentials必填

delete_dns_credential

Delete a stored DNS provider credential. Domains using this credential will need new credentials for automated verification. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

list_my_requests

List verification requests created by the authenticated user. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數api_key_idprofile_id

list_incoming_requests

List incoming verification requests where the authenticated user is the subject. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

無需輸入參數。

create_user_request

Create a new verification request to ask another user to share verified assets. Each asset is an object naming its type, e.g. { "type": "email" }. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數assets必填partial_okaction_typecallback_urlredirect_urlreference_idaction_contextexpires_in_hourspublic_profile_idvalidity_requirement

cancel_user_request

Cancel a pending verification request. Only the creator can cancel. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填

extend_request

Extend the expiration time of a pending verification request. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填extends_by_hours

share_request_email

Email the link of a pending verification request to a recipient. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數id必填email必填

start_user_domain_verification

Start a self-service domain verification session. The user proves ownership of a domain via DNS or HTTP challenge. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數domain必填channel

get_user_domain_verification_status

Get the current status of a domain verification session, including challenge details. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數session_id必填

check_user_domain_verification

Trigger a check on the domain verification challenge. Call after placing DNS record or HTTP file. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數session_id必填

claim_username

Claim a unique username for the authenticated user's public profile. Usernames must be 3-30 characters, alphanumeric and underscores only. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數username必填

update_public_proofs

Update which verified proofs are visible on the user's public profile, including visibility, masking, and display order. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), or sign in with start_login — a session opens this tool — then call this tool again.

輸入參數proofs必填proof_order

create_authorization

Create a new authorization request. Authorizations grant permission to send confirmations to a user via a specific channel. The user must approve the authorization before confirmations can be sent. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數bsuidphone必填scopechannel必填hitl_id必填recipient必填expires_inbusiness_namebusiness_profile_id

get_authorization

Get an authorization by ID. Returns the current state of the authorization including status and usage statistics. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_authorizations

List authorizations with optional filters. Returns paginated results. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitphonestatuschannel

revoke_authorization

Revoke an active or pending authorization. Only authorizations with status "active" or "pending" can be revoked. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填reason

export_authorizations

Export authorizations as CSV or JSON. Supports date range and status filtering. Maximum 10,000 records. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數tofromformatstatus

create_confirmation

Create a HITL confirmation request. Sends an approval request to the channels configured on the referenced HITL config. First response wins. Agent usage: The HITL config referenced by hitl_id must be authorized before you can create confirmations. If this returns a 403 or "not authorized" error, call request_hitl_authorization on the HITL config first, then wait for the user to approve via the messaging channel. After creating a confirmation, poll get_confirmation to check for approval/denial, or, if the user (the HITL config owner) will decide it themselves, use get_confirmation_approval_link for their own approval link. Encryption is NOT optional: a HITL config cannot send confirmations without a keypair, the human approves by decrypting in their browser, and `message` must be a JSON ciphertext envelope. Plaintext is refused with 400 `message_not_encrypted`; an envelope sealed to another key with 400 `message_key_mismatch`. Choose the version by who must be able to decrypt: - v1 (single-recipient): wraps the content key for the config owner only. Use ONLY when there are no enrolled non-owner approvers — with approvers enrolled it is refused with 400 `envelope_missing_approvers`. - v2 (multi-recipient): additionally wraps the content key for each enrolled approver via an `approver_ek` map, so every approver can decrypt. Build it with the SDK `encryptMessageV2(plaintext, ownerPublicKey, hitlId, approverKeys)` after fetching the approvers via the SDK `getApproverKeys(hitlId)` (`GET /api/v1/hitl/:id/approver-keys`). AAD is the `hitlId`. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數hitl_id必填message必填proof_expiry_days

get_confirmation

Get a confirmation by ID. Returns the full confirmation including status, response, and proof token. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_confirmations

List confirmations with optional filters. Returns paginated results with status, HITL config and sub-account (profile_id) filtering. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitstatushitl_idend_dateprofile_idstart_date

wait_for_confirmation

Poll a confirmation until the approver responds. Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. Agent usage: Call this after create_confirmation with the returned confirmation ID. Terminal states: "approved" (action authorized — check the proof_token), "denied" (action rejected). While "pending", the approver has not yet responded. This poll returns no link — the approval request is delivered to the approver's own channel, and only the owner's "Send again" (`POST /api/v1/confirmations/{id}/resend`, which no tool calls yet) delivers it there again. If the owner will decide instead, call get_confirmation_approval_link for the owner's `approval_url`; it needs the confirmation to be still pending — the state this tool waits in — and also refuses once `timeout_at` has passed, so a long wait can outlive the link even while the status has not moved. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填timeout_seconds

create_hitl

Create a HITL (Human-in-the-Loop) config. Defines which messaging channels receive approval requests and the default timeout. Agent usage: After creating a HITL config, you must call request_hitl_authorization before it can be used with create_confirmation. For Telegram channels, use create_chat_id_discovery first to discover the user's chat ID, then include it in the channel config. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數name必填channelscircle_idprofile_idtimeout_seconds

get_hitl

Get a HITL config by ID. Returns the config including channels, timeout, and status. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

list_hitls

List HITL configs with optional filters. Returns paginated results. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitstatusprofile_idenvironment

update_hitl

Update a HITL config. Can change name, channels, or timeout. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填namechannelstimeout_seconds

delete_hitl

Delete (archive) a HITL config. Sets status to archived. Cannot be used for new confirmations after deletion. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

request_hitl_authorization

Request authorization for a HITL config. Sends consent requests to all configured channels (Telegram/WhatsApp). Users must approve before confirmations can be sent. Agent usage: This must be completed before create_confirmation will work for this HITL config. The consent request is DELIVERED to each channel — the response carries no link to show. It returns `authorizations` — one entry per resolved recipient, each with its `channel`, `recipient`, `authorization_id` and `status` — plus a `message`. Read the entries rather than assuming: `status: 'pending'` means consent was just sent and the user must approve in Telegram/WhatsApp itself, while `status: 'active'` means that recipient had already authorized and nothing was sent to them. An EMPTY array does not mean everyone is authorized — it means no recipient could be resolved at all (usually a HITL config bound to a missing or inactive circle, or channels whose recipient is blank), so nobody was asked and waiting for an approval would hang forever. Do not relay `message` on that branch: it reads 'All channels already have active or pending authorizations', which is exactly the wrong conclusion. Read the array. After requesting, you can proceed once the user confirms they have approved. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

create_chat_id_discovery

Create a Telegram chat ID discovery token. Returns a deep_link, qr_code (base64 PNG), and qr_text (UTF-8 text QR for terminal display). The user opens the link in Telegram, which reveals their chat ID for HITL config setup. Agent usage: pass the response's `deep_link` to render_auth_link so the user can click or scan it. Never hand `qr_text` to a link renderer — it is that same link already rendered as QR art. Print it verbatim inside a fenced code block only when a real terminal needs the QR. Then poll poll_chat_id_discovery with the returned token until the chat_id appears. Use the discovered chat_id when creating a HITL config with a Telegram channel. The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

無需輸入參數。

poll_chat_id_discovery

Poll a chat ID discovery token. Returns the discovered Telegram chat ID, user ID, and username once the user interacts with the bot. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數token必填

wait_for_chat_id_discovery

Poll a chat ID discovery token until the user interacts with the Telegram bot. Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. Agent usage: Call this after create_chat_id_discovery. Present the discovery response's `deep_link` with render_auth_link first, then poll with the returned token. Terminal states: "completed" (chat_id discovered — use it when creating a HITL config with a Telegram channel), "expired". While "pending", the user has not yet opened the Telegram link. The user does not see tool results — most clients fold them away, render_auth_link's output included. Before you wait or poll, put what the user must act on into your own reply text: the link itself (not a sentence announcing it), the SMS text and number, or a note to check their inbox. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數token必填timeout_seconds

get_hitl_keys

Get the encryption keypair for a HITL config. With `hitl:read` it returns the public key, encrypted private key, KDF salt, and key ID (kid). A key holding `confirmations:create` without `hitl:read` receives only `public_key` and `kid` — what a confirmation message is sealed to, never the private-key material. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數hitl_id必填

upload_hitl_keys

Upload an encryption keypair for a HITL config. The server validates the RSA-4096 public key and computes the key ID. Note: the encrypted_private_key is already encrypted client-side with the user's password — the server never sees the password. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數dek_ivdek_taghitl_id必填kdf_salt必填public_key必填wrapped_dekbackup_dek_ivbackup_dek_tagbackup_wrapped_dekencrypted_private_key必填

delete_hitl_keys

Delete the encryption keypair from a HITL config. WARNING: Existing ciphertexts will become permanently unreadable. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數hitl_id必填

create_identity_challenge

Create a Proof-Me cross-channel identity challenge (CONFIRM) for an enrolled Circle member. The account holder approves/denies on a channel different from the one the suspicious contact reached the member on. Agent usage: poll get_identity_challenge with the returned ID until it leaves pending (confirmed, denied, cancelled, failed, expired or revoked). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數circle_id必填member_id必填suspicious_channel

get_identity_challenge

Get a Proof-Me identity challenge by ID. Returns its status (pending, confirmed, denied, cancelled, failed, expired, revoked or suspended), the channel the CONFIRM ran on, and — once the person being checked decided — the proof token and its proof_id. Poll this for resolution. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

create_circle

Create a Circle — a named group of trusted contacts (the people-primitive powering Proof-Me and Approvals-on-Circle). Optionally seed initial members; each member's declared channels are stored so they can be invited to enroll. Agent usage: after creating a Circle, add members with add_circle_member (or seed them here), then invite_circle_member to mint the enrollment deep link each contact taps to bind their messenger identity. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數name必填membersowner_nameprofile_idproof_me_enabled

list_circles

List Circles with optional filters. Archived Circles are excluded by default; pass status="archived" to surface them. Returns paginated results. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitstatusprofile_idenvironment

get_circle

Get a Circle by ID. Returns the Circle including its members and per-member channel presence booleans (an identifier is NEVER returned — SEC-PM-006). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

update_circle

Update a Circle's name and/or owner name. Omitted fields are left unchanged; the profile/identity binding is create-only. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填nameowner_name

delete_circle

Archive a Circle (soft delete — sets status to archived). It stops appearing in the default list but is recoverable via list_circles with status="archived". ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

add_circle_member

Add a pending member to a Circle by name, with an optional pre-declared WhatsApp phone. The Telegram chat id is captured later when the member taps the enrollment deep link. Agent usage: after adding a member, call invite_circle_member to mint the single-use enrollment link the member taps to bind their messenger identity. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填name必填whatsapp_phone

list_circle_members

List a Circle's members. Each member carries channel-presence booleans (has_telegram / has_whatsapp) and the masked phone they enrolled from (enrolled_phone_hint, e.g. +9••••••4171) — a full identifier is NEVER returned (SEC-PM-006). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

invite_circle_member

Mint a single-use enrollment invite for a Circle member. Returns Telegram + WhatsApp deep links and a QR code; the member taps the channel-matched link to bind their messenger identity to the Circle. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填member_id必填

create_circle_member_drill

Fire an on-demand Proof-Me drill against one enrolled member — a real cross-channel identity challenge carrying the scheduled-safety-check label (the account owner practices confirming). Complements the automated daily drill + monthly reinforcement sweeps. On Pay as you go a live key is refused `422 plan_upgrade_required`; a test key is not, and its drill reaches the member on Telegram only (`400 no_channel` when they have no verified Telegram channel). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填member_id必填

remove_circle_member

Remove a member from a Circle. Deletes the member's channels and revokes any live authorizations that routed through them. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填member_id必填

add_circle_member_channel

Declare a channel for a Circle member. Returns 409 if that channel type already exists on the member. The identifier is a Telegram chat id or an E.164 WhatsApp phone (per-channel format validated server-side). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填channel必填member_id必填identifier必填

list_circle_member_channels

List a Circle member's channels. Returns channel metadata only (channel, status, verified_at) — an identifier is NEVER returned (SEC-PM-006). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填member_id必填

remove_circle_member_channel

Remove a channel from a Circle member. Removing the last channel is allowed (the member simply becomes unreachable). ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填member_id必填channel_id必填

create_delegation

Create a delegation (Proof of Delegation): a control-proven domain authorizes a typed url/purl artifact and receives a publishable signed token. The attestation is that the domain's controller authorized this artifact — nothing more; it says nothing about the artifact or the business behind it. Each mint is a billable proof. A requested lifetime longer than the control proof's remainder is rejected, never truncated. The result carries the publishable token AND the DERIVED effective_status/is_valid — the same pair the list and get tools return, so the shape does not depend on which verb produced it. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數delegate必填expires_incontrol_proof必填

list_delegations

List your own delegations with optional filters. Each item carries the DERIVED effective_status/is_valid beside its stored status — read effective_status, since status records only whether the owner revoked the delegation themselves, so a delegation still reads active there after its domain control proof was revoked, suspended or expired, and after its OWN lifetime ran out. effective_status accounts for all of those: it reports expired once either lifetime has passed, whichever is earlier. Tokens are not included in the list — use get_delegation for the stored token. There is no public enumeration of third-party delegations. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數pagelimitstatus

get_delegation

Get one of your delegations by Mongo id or ph_dlg_* handle. Returns the stored publishable token plus the DERIVED effective_status/is_valid — the delegation is only as live as the control proof it stands on (a revoked, suspended or expired domain proof invalidates it) and never outlives its own expires_at, whichever comes first. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填

revoke_delegation

Revoke ONE delegation. The domain control proof and sibling delegations stay valid; the revocation is mirrored into the proof registry so the CRL, status list and public status lookup all see it. Idempotent: a repeat revoke answers success with the same body, both here and through revoke_proof with the ph_dlg_ handle — unlike a PROOF, where a repeat answers already_revoked. The result carries the DERIVED effective_status/is_valid beside the stored status. ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

輸入參數id必填reason

verify_delegation

Verify a Proof of Delegation — the attestation that a domain authorized a specific agent artifact. Pass either the artifact's card (MCP server.json / A2A agent card) or a raw delegation token, PLUS two facts you established yourself: the artifact identity you resolved (the package you are installing, the endpoint you are calling) and the domain you expect to stand behind it. Both are required — a token can be copied into someone else's card, and any domain owner can mint a valid delegation naming someone else's package, so a verdict without both pins would mean 'some domain said something about some artifact'. WHERE THE IDENTITY MAY COME FROM: it is the artifact you are acting on, and never a value read from inside the artifact you are checking. A name in the artifact's own package.json, card or manifest is self-declared and editable by whoever ships it, so checking it against the delegation compares the artifact with itself. Resolve it afresh at call time instead of reusing a value from earlier in this conversation, which may already be stale. When no independently resolvable identity exists — a local or unpublished artifact — you have nothing to compare against, and that is the honest answer: report it rather than a mismatch, because a mismatch here reads as an accusation against the domain named in the delegation. The verifier walks signature → principal → delegate → revocation status, including the cascade down to the domain control proof. Requires no API key. What a verified result means: the expected domain's controller authorized this artifact — NOT that the artifact is safe, audited or endorsed.

輸入參數cardtokendelegate必填check_statusexpected_principal必填

verify_delegations

Batch-verify up to 50 Proof of Delegation artifacts in one call — the inventory half of the checker (h-proof-checker-mcp): re-check everything you already trust instead of one verify_delegation call per artifact. Each item takes the same shape verify_delegation requires (card XOR token, delegate, expected_principal) and follows the same rule about where identity comes from: each `delegate` is the artifact you are acting on, never a value read from inside the artifact you are checking, and resolved afresh at call time. Items are verified INDEPENDENTLY — no cross-item state, nothing persisted, one item failing never affects another item's result. This tool does NOT discover what you have installed and does NOT fetch anything on your behalf: it verifies material you already hold, the same trust boundary verify_delegation draws. Revocation is always checked (there is no check_status:false here — the point of a batch re-check is to see what changed since you last looked). Each result carries an `outcome`: confirmed_valid (verified), confirmed_invalid (a genuine negative verdict — revoked, expired, mismatched, malformed, and similar), no_claim_found (the artifact publishes no delegation at all — an absence, never an accusation), or unconfirmed (we could not reach the issuer or otherwise get a confident answer right now — NEVER treat this as a bad verdict). Requires no API key. `checked_at` on each result is the moment THAT item's own check completed, not one timestamp shared across the call.

輸入參數items必填

start_login

Start a login session by sending an authentication challenge to the user's chosen channel (Telegram, WhatsApp, SMS, or email). Returns a session ID and, FOR TELEGRAM AND WHATSAPP ONLY, deep_link, qr_code (base64 PNG) and qr_text (UTF-8 text QR for terminal display); on sms it returns sms_message with sms_dids instead, and on email nothing to display. Agent usage: (1) Call start_login with the desired channel and phone_number (for SMS) or email (for email). (2) Present the challenge, and WHICH FIELD depends on the channel. On telegram/whatsapp pass `deep_link` to render_auth_link, which returns the clickable link and a QR code to you; in a chat client the link is what the user acts on, since they are usually on the same machine. On sms `deep_link` is an EMPTY STRING and render_auth_link will reject it — show `sms_message` and let the user pick a number from `sms_dids`. `suggested_region` is always set, but the matching ENTRY in `sms_dids` may be missing (europe and israel appear only when a number is configured) or present with an empty `did`, so offer that region first only when `sms_dids[suggested_region]` exists and carries a number, and otherwise offer whatever the object does. On email there is nothing to display at all, and nothing to check either: a result means the mail was accepted for delivery, so tell the user to open their inbox. A delivery failure is an ERROR here, not a field — the tool answers `challenge_delivery_failed` and NO session exists, so do not call wait_for_login; retry, or offer another channel. Never hand `qr_text` to a link renderer — it is the link already rendered as QR art, so print it verbatim inside a fenced code block or not at all, because its rows stop scanning the moment one wraps or a blank line lands between them. (3) Once your reply shows the user the challenge, call wait_for_login with the returned session ID to poll until the user completes authentication. On email, tell the user to open the link and press "Sign in the brows

輸入參數emailchannel必填phone_number

wait_for_login

Poll a login session until the user completes authentication. Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. Agent usage: Call this after start_login with the returned session ID. Terminal states: "verified" (login succeeded — this server keeps the session for this connection and signs your own account records with it: emails, phones, domains, API keys, 2FA, DNS credentials, verification requests, your public profile's username and proof list), "failed", "expired", "completed_elsewhere" (email only: the user pressed "Sign in here" on the email link's page, so the browser they clicked from is signed in and this connection never will be — tell them so, and start a new login if this connection still needs one). A result with status "pending" means the wait ran out before the user finished — call this tool again with the same id. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.

輸入參數id必填timeout_seconds

create_account

Create an account-bootstrap session for agent-driven onboarding. Public endpoint (no API key required). Returns a session id, channel-specific instructions, and — FOR TELEGRAM AND WHATSAPP ONLY — deep_link, qr_code (base64 PNG) and qr_text (UTF-8 text QR). The endpoint is safe to call regardless of whether the submitted identity is new: completing verification transparently creates a User when none exists, or logs the user in when one already does. The response is intentionally uniform — the server does NOT reveal whether the identity is already registered (this would be a user-enumeration oracle). If the agent needs to distinguish new-vs-returning users, call `get_current_user` after verification and inspect the user's `created_at`. EMAIL CHANNEL SENDS NOTHING HERE. The response carries email_sent=false and send_required=true: confirm with the user that the address is theirs, then call send_account_email. The other channels dispatch nothing either way — the user sends the first message themselves (reverse OTP). Agent usage: (1) Call create_account with the user's chosen channel. (2) For email, confirm with the user and call send_account_email. On telegram/whatsapp pass `deep_link` to render_auth_link, which returns the clickable link with a QR code beneath it to you. On sms `deep_link` is an EMPTY STRING and render_auth_link will reject it — show `sms_message`, which is what the user sends; this response carries no destination number, so do not invent one. Do not hand `qr_text` to a link renderer either — it is the link already rendered as QR art; print it verbatim inside a fenced code block if a real terminal needs the QR. (3) Once your reply shows the user the challenge, call wait_for_account_creation with the session id until verification completes. On email the user must press "Sign in the browser that requested this" on the link's page — "Sign in here" signs in the browser they clicked from, and the wait then ends with "completed_elsewhere". (4) On verified

輸入參數emailchannel必填phone_number

send_account_email

Deliver the verification email for an account-bootstrap session created with channel "email". Public endpoint (no API key required). Why this is a separate call: create_account deliberately sends NOTHING. A message from proof.holdings arriving in someone's inbox is an act with a person on the other end, so it takes an explicit second step rather than being a side effect of creating a session. ASK THE USER to confirm the address is theirs before calling this — do not call it automatically after create_account. The other channels (telegram, whatsapp, sms) never need this: the user sends the first message themselves (reverse OTP), so nothing is dispatched to them at all. One session sends at most one email, including under concurrent calls. A repeat answers 410 already_sent, which means the material backing the send is gone: usually because the email went out, occasionally because an attempt was interrupted mid-send and nothing was delivered. Do not tell the user a message was sent on the strength of a 410 — create a new session instead. (A session the recipient cancelled via the decline link, or an expired one, answers 404, not 410.) If delivery fails the response carries email_sent=false and the call can be retried.

輸入參數id必填

wait_for_account_creation

Poll an account-bootstrap session until the user completes verification. Uses exponential backoff (2s initial, 1.5x, 30s max) with jitter. Agent usage: Call this after create_account with the returned session id. Terminal states: "verified" (this server keeps the session for this connection; the `user_id` field in the terminal body identifies the authenticated user), "expired", "completed_elsewhere" (email only: the user pressed "Sign in here" on the email link's page, so the browser they clicked from is signed in and this connection never will be — tell them so, and start a new login if this connection still needs one). A result with status "pending" means the wait ran out before the user finished — call this tool again with the same id. Works identically whether the underlying flow created a new User or logged in an existing one. Before calling this for a challenge you created, make sure your reply text already shows the user what to act on — the link itself, the SMS text and number, or a note to check their inbox; a link that appeared only in a tool result is one they never saw.

輸入參數id必填timeout_seconds

start_2fa_for_action

Start a 2FA challenge that grants the authenticated user permission to perform a sensitive action. The 2FA must complete on a channel DIFFERENT from the user's last login channel (the backend enforces this). On success a grant is stored keyed by the user id and action_type; middleware on the protected endpoint reads the grant and allows the mutation. Destructive action types (api_key_create, api_key_revoke, api_key_regenerate, api_key_view, account_delete, phone_remove, email_remove, phone_primary, email_primary, revocation_bulk, domain_remove, profile_delete) are capped at 5min TTL and forced single-use by server policy. A step-up for revocation_bulk, phone_remove, email_remove, domain_remove, profile_delete or account_delete is bound to `targets` — the exact ids the protected call will carry. Configuration scopes (settings_write, profile_update, templates_write) allow up to 24h TTL and caller-chosen single_use — useful for agents making multiple settings mutations in one session. Agent usage: (1) Attempt the sensitive call; if you get `403 2fa_required` note the `action_type`. (2) Call start_2fa_for_action with that action_type and a channel different from the login channel. (3) Present the challenge: on telegram/whatsapp pass `deep_link` to render_auth_link; on sms show `sms_message` and the number to send it to; on email check the response first: with more than one verified email and no `email_id` given, it answers 200 with `requires_email_selection: true` and `available_emails` — NO session was started and nothing was sent, so ask the user which address and call again with `email_id` rather than telling them to open a mailbox. Never hand `qr_text` to a link renderer — it is the link already rendered as QR art. Print it verbatim inside a fenced code block only when a real terminal needs the QR. (4) Call wait_for_2fa until the session is verified. (5) Retry the original sensitive call. The user does not see tool results — most clients fold them away, render_au

輸入參數channel必填targetsemail_idphone_idsingle_useaction_type必填ttl_seconds

版本歷史

9
  1. v1.8.0最新Nov 5, 2026
  2. v1.7.2Nov 3, 2026
  3. v1.7.1Oct 26, 2026
  4. v1.7.0Oct 16, 2026
  5. v1.6.0Oct 14, 2026
  6. v1.5.0Oct 13, 2026
  7. v1.4.0Oct 9, 2026
  8. v1.3.0Oct 8, 2026
  9. v1.1.0Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Proof 整合